저자 원 테스트 를하고 싶습니다. 여유 메모리의 90 %가 가득 찼습니다.
어떻게하면이은에 할 수있는 *nix
시스템?
저자 원 테스트 를하고 싶습니다. 여유 메모리의 90 %가 가득 찼습니다.
어떻게하면이은에 할 수있는 *nix
시스템?
답변:
stress-ng 는 POSIX 시스템에서 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
/ / etc를 사용 하여 /proc/meminfo
호출을 조정하십시오 . 휴대용이 필요한 경우.free(1)
vm_stat(1)
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
--vm 1 and --vm-keep
것이 매우 중요합니다. 단순히 --vm-bytes
아무것도하지 않으며 필요 / 원하는만큼 많은 메모리를 할당 할 수 있다고 생각할 수 있습니다. 256G의 메모리를 할당하여 스스로를 확인하려고 할 때까지 나는 이것에 조금 익숙해졌습니다. 이것은 대답의 결함이 아니며 올바른 플래그를 제공하며 추가주의 사항입니다.
-m 1
. 스트레스 맨에 따르면, -m N
대한 짧은 --vm N
스폰 : N
에 회전 노동자malloc()/free()
C 프로그램을 malloc()
필요한 메모리에 쓴 다음 mlock()
메모리가 스왑 아웃되는 것을 방지하는 데 사용할 수 있습니다.
그런 다음 프로그램이 키보드 입력을 기다리도록하고 메모리 잠금을 해제하고 메모리를 비운 다음 종료하십시오.
calloc
IIRC와 같은 문제가 발생합니다. 모든 메모리는 동일한 읽기 전용 제로 페이지를 가리 킵니다. 쓰려고 할 때까지 실제로 할당되지 않습니다 (읽기 전용이므로 작동하지 않습니다). 내가 정말로 확신하는 유일한 방법은 memset
전체 버퍼 를 수행하는 것 입니다. 자세한 내용은 다음 답변을 참조하십시오. stackoverflow.com/a/2688522/713554
이 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
pv
설치된 경우 개수를 확인하는 데 도움이됩니다.dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
당신이 기본 GNU 도구가 (경우 sh
,을 grep
, yes
그리고 head
) 당신은이 작업을 수행 할 수 있습니다
yes | tr \\n x | head -c $BYTES | grep n
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily
grep은 RAM에 전체 데이터 라인을로드하기 때문에 작동합니다 (디스크 이미지를 grepping 할 때 다소 불행한 방법으로 배웠습니다). 에 의해 생성 된 광고, yes
대체 바꿈은 무한히 길게되지만 의해 제한 head
을 $BYTES
바이트 따라서 그렙 메모리에 $ 바이트를로드한다. Grep 자체는 나를 위해 100-200KB와 같이 사용하므로 더 정확한 양을 빼려면 필요할 수 있습니다.
시간 제약 조건을 추가하려면이 작업을 매우 쉽게 수행 할 수 있습니다 bash
(에서 작동하지 않음 sh
).
cat <(yes | tr \\n x | head -c $BYTES) <(sleep $NumberOfSeconds) | grep n
<(command)
것은 거의 알려진 것 같다하지만 여기, 자주에 대한 추가 정보를 원하시면 매우 유용합니다 : http://tldp.org/LDP/abs/html/process-sub.html
그런 다음 cat
: cat
을 사용할 때 : 입력이 종료 될 때까지 입력이 완료 될 때까지 기다립니다. 파이프 중 하나를 열어두면 grep이 살아 있습니다.
당신이 만약 pv
천천히 RAM 사용을 늘릴 수 :
yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n
예를 들면 다음과 같습니다.
yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n
초당 1MB의 속도로 최대 기가 바이트를 사용합니다. 추가 보너스로, pv
현재 사용률과 지금까지의 총 사용률이 표시됩니다. 물론 이것은 이전 변형으로도 수행 할 수 있습니다.
yes | tr \\n x | head -c $BYTES | pv | grep n
| pv |
부품을 삽입하면 현재 상태가 표시됩니다 (기본적으로 처리량 및 총계, 나는 생각합니다-그렇지 않으면 man (ual) 페이지 참조).
왜 또 다른 대답? 수락 된 답변은 패키지 설치를 권장합니다 (패키지 관리자가 필요없는 모든 칩셋에 대한 릴리스가있을 것입니다). 가장 많이 투표 된 답변은 C 프로그램 컴파일을 권장합니다 (타겟 플랫폼 용으로 컴파일 할 컴파일러 또는 툴체인이 설치되지 않았습니다). 두 번째로 인기있는 답변은 VM에서 응용 프로그램을 실행하는 것이 좋습니다. 세 번째는 부팅 순서에서 RAM을 채우지 않는 것을 수정할 것을 제안합니다. 네 번째는 / dev / shm 마운트 포인트 (1)이 존재하고 (2)가 큰 경우에만 작동합니다 (다시 마운트해야합니다). 다섯 번째는 위의 많은 것들을 샘플 코드없이 결합합니다. 여섯 번째는 큰 대답이지만 내 자신의 접근 방식을 제시하기 전에이 대답을 보지 못했습니다. memblob 행이 실제로 문제의 핵심이라는 것을 알지 못하면 기억하거나 타이핑하는 것이 더 짧기 때문에 내 자신을 추가한다고 생각했습니다. 일곱 번째는 다시 질문에 대답하지 않습니다 (ulimit를 사용하여 프로세스를 제한합니다). 여덟 번째는 파이썬 설치를 시도합니다. 아홉 번째는 우리 모두가 매우 창의적이지 않다고 생각하고, 마지막으로 열 번째는 자신의 C ++ 프로그램을 작성하여 최상위 투표 답변과 동일한 문제를 일으켰습니다.
set -e
, 나는 방금 뭔가를 배웠다 :)
내 도트 파일에서 비슷한 작업을 수행하는 기능을 유지합니다. https://github.com/sagotsky/.dotfiles/blob/master/.functions#L248
function malloc() {
if [[ $# -eq 0 || $1 -eq '-h' || $1 -lt 0 ]] ; then
echo -e "usage: malloc N\n\nAllocate N mb, wait, then release it."
else
N=$(free -m | grep Mem: | awk '{print int($2/10)}')
if [[ $N -gt $1 ]] ;then
N=$1
fi
sh -c "MEMBLOB=\$(dd if=/dev/urandom bs=1MB count=$N) ; sleep 1"
fi
}
간단한 파이썬 솔루션을 어기는 방법은 무엇입니까?
#!/usr/bin/env python
import sys
import time
if len(sys.argv) != 2:
print "usage: fillmem <number-of-megabytes>"
sys.exit()
count = int(sys.argv[1])
megabyte = (0,) * (1024 * 1024 / 8)
data = megabyte * count
while True:
time.sleep(1)
sysctl vm.swappiness=0
vm.min_free_kbytes를 1024로 설정 하고 더 작은 숫자로 설정할 수 있습니다. 시도하지는 않았지만 문서는 이것이 스왑 아웃의 신속성을 제어하는 방법이라고 말합니다 ... 실제로 시스템에 OOM 상태를 유발할 정도로 느리게 만들 수 있습니다. 참조 kernel.org/doc/Documentation/sysctl/vm.txt 및 kernel.org/doc/gorman/html/understand/understand005.html
제한된 메모리로 특정 프로세스를 테스트하려는 경우 ulimit
할당 가능한 메모리의 양을 제한하는 것이 좋습니다 .
man setrlimit
:RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
나는 이것을 위해이 작은 C ++ 프로그램을 작성했다 : https://github.com/rmetzger/dynamic-ballooner
이 구현의 장점은 메모리를 비우거나 다시 할당해야하는지 주기적으로 확인한다는 것입니다.