여유 메모리를 90% 채우는 방법은 무엇입니까?

여유 메모리를 90% 채우는 방법은 무엇입니까?

나도 좀 만들고 싶어낮은 리소스 테스트이렇게 하려면 사용 가능한 메모리의 90%를 채워야 합니다.

*nix내 시스템에서 이 작업을 어떻게 수행할 수 있나요 ?

답변1

압력NGPOSIX 시스템의 CPU/mem/io/hdd 압력을 시뮬레이션하는 작업 부하 생성기입니다. 이 호출은 Linux < 3.14에서 작동합니다.

stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

Linux >= 3.14의 경우 MemAvailable다음 방법을 사용하여 교체 없이 새 프로세스에 사용 가능한 메모리를 추정할 수 있습니다.

stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

/proc/meminfofree(1)호출을 조정하려면 //etc를 사용하세요 vm_stat(1). 필요한 경우 휴대용. 또한보십시오Wiki의 Stress-ng를 참조하세요.추가 사용 예.

답변2

headLinux에 기본 GNU 도구( 및 tail) 또는 BusyBox가 있으면 다음을 수행할 수 있습니다.일정량의 여유 메모리를 채우십시오.:

head -c BYTES /dev/zero | tail
head -c 5000m /dev/zero | tail #~5GB, portable
head -c 5G    /dev/zero | tail #5GiB on GNU (not busybox)

이는 tail이 마지막 줄인 경우를 대비해 현재 줄을 메모리에 유지해야 하기 때문에 작동합니다. null 바이트만 출력하고 개행 문자는 없는 행에서 읽은 행은 /dev/zero무한히 길지만 head바이트 수에 의해 제한 BYTES되므로 tail너무 많은 메모리만 사용합니다. 보다 정확한 수치를 얻으려면 시스템 head과 자체에서 RAM이 얼마나 사용되는지 확인한 다음 해당 값을 빼야 합니다.tail

그냥 서둘러RAM이 완전히 소모됨, 제한 head부분을 제거할 수 있습니다:

tail /dev/zero

너도 원한다면기간 추가bash, 이 작업은 다음에서 쉽게 수행할 수 있습니다(작동하지 않음) sh.

cat <(head -c 500m /dev/zero) <(sleep SECONDS) | tail

<(command)인터프리터에게 실행 command하고 출력을 파일로 표시하도록 지시하면 echo <(true)출력 파일 프로세서는 예를 들어 /dev/fd/63이 됩니다. 따라서 cat에서는 두 개의 파일이 전달되는 것처럼 보입니다. 자세한 내용은 아래에서 확인하세요.http://tldp.org/LDP/abs/html/process-sub.html

명령 은 cat종료될 때까지 입력이 완료될 때까지 기다리고 파이프 중 하나를 열어두면 tail활성 상태를 유지합니다.

당신이 가지고 있고 pv원한다면RAM 사용량을 천천히 늘리세요.:

head -c TOTAL /dev/zero | pv -L BYTES_PER_SEC | tail
head -c 1000m /dev/zero | pv -L 10m | tail

후자는 초당 10MB의 속도로 최대 1GB의 데이터를 사용합니다. 추가 보너스 pv현재 사용량과 현재까지의 총 사용량을 표시합니다.. 물론 이전 변형을 통해서도 이 작업을 수행할 수 있습니다.

head -c 500m /dev/zero | pv | tail

부품을 삽입하기만 하면 | pv |현재 상태(기본적으로 처리량 및 총계)가 표시됩니다.

호환성 팁 및 대안
/dev/zero장비가 없으면 표준 yestr도구가 다음을 대체할 수 있습니다. ( 무한한 수의 "예"를 yes | tr \\n x | head -c BYTES | tail출력 하고 개행을 대체하고 모든 것을 하나의 큰 줄에 맞추고 모든 것을 메모리에 유지하려면 꼬리가 필요합니다). 또 다른 간단한 대안은 GNU 및 BusyBox에서 1GB RAM을 사용하지만 하나의 코어에서는 100% CPU를 사용하는 것입니다. 마지막으로 접미사를 허용하지 않으면 인라인 바이트 수를 계산할 수 있습니다(예: 50MB).yestr
dddd if=/dev/zero bs=1G of=/dev/null
headhead -c $((1024*1024*50))


감사의 말팔스타프더 간단하고 더 광범위하게 호환되는 변형(예: BusyBox)에 기여하세요.


왜 다른 답변이 있습니까? 허용된 답변은 패키지 설치를 제안합니다(패키지 관리자가 필요하지 않은 각 칩셋에 대한 버전이 있을 것입니다). 가장 많이 득표된 답변은 C 프로그램 컴파일을 제안합니다(저는 이를 수행하기 위해 컴파일러나 툴체인을 설치하지 않았습니다). 대상 플랫폼); 두 번째 상위 투표 답변은 가상 머신에서 애플리케이션을 실행하는 것을 제안합니다(예, USB 등을 통해 이 휴대폰의 내부 SD 카드를 추가하고 세 번째는 VirtualBox 이미지를 생성하는 것이 좋습니다). 필요에 따라 RAM을 채우지 않는 부팅 순서; 네 번째 것은 /dev/shm 마운트 지점 (1)이 존재하고 (2)가 더 큰 경우에만 작동합니다(다시 마운트하려면 루트가 필요함). 다섯 번째는 위의 내용을 많이 결합하지 않고 샘플 코드; 여섯 번째는 좋은 대답이지만 내 자신의 접근 방식을 생각해 내기 전에는 이 대답을 보지 못했기 때문에 내 자신의 대답을 추가해야 한다고 생각했습니다. 왜냐하면 memblob 줄이 보이지 않으면, 기억하거나 입력하는 시간이 더 짧아질 것입니다. 이는 실제로 문제의 핵심입니다. 일곱 번째는 다시 질문에 대답하지 않습니다(프로세스를 제한하려면 ulimit를 사용하십시오). 여덟 번째는 Python을 설치하려고 합니다. 우리는 모두 매우 창의적이지 않았고, 마침내 10분의 1이 자신의 C++ 프로그램을 작성했는데, 그 결과 최고 득표를 받은 답변과 동일한 문제가 발생했습니다.

답변3

필요한 메모리 에 C 프로그램을 작성한 malloc()다음 이를 사용하여 mlock()메모리가 교체되는 것을 방지할 수 있습니다.

그런 다음 프로그램이 키보드 입력을 기다리고, 메모리 잠금을 해제하고, 메모리를 해제하고 종료하도록 합니다.

답변4

HN의 의견:https://news.ycombinator.com/item?id=6695581

dd 또는 유사한 명령을 통해 /dev/shm을 채우십시오.

swapoff -a
dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k

관련 정보