나도 좀 만들고 싶어낮은 리소스 테스트이렇게 하려면 사용 가능한 메모리의 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/meminfo
free(1)
호출을 조정하려면 //etc를 사용하세요 vm_stat(1)
. 필요한 경우 휴대용. 또한보십시오Wiki의 Stress-ng를 참조하세요.추가 사용 예.
답변2
head
Linux에 기본 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
장비가 없으면 표준 yes
및 tr
도구가 다음을 대체할 수 있습니다. ( 무한한 수의 "예"를 yes | tr \\n x | head -c BYTES | tail
출력 하고 개행을 대체하고 모든 것을 하나의 큰 줄에 맞추고 모든 것을 메모리에 유지하려면 꼬리가 필요합니다). 또 다른 간단한 대안은 GNU 및 BusyBox에서 1GB RAM을 사용하지만 하나의 코어에서는 100% CPU를 사용하는 것입니다. 마지막으로 접미사를 허용하지 않으면 인라인 바이트 수를 계산할 수 있습니다(예: 50MB).yes
tr
dd
dd if=/dev/zero bs=1G of=/dev/null
head
head -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