여유 메모리의 90 %를 채우는 방법?


181

저자 원 테스트 를하고 싶습니다. 여유 메모리의 90 %가 가득 찼습니다.

어떻게하면이은에 할 수있는 *nix시스템?


3
정말 작업을해야합니까 어떤 유닉스 계열의 시스템?
CVn

31
메모리를 채우는 대신 메모리가 제한된 VM (도커 또는 방랑자 등을 사용하여)을 만들 수 있습니까?
abendigo

4
@abendigo QA의 경우 여기에 제시된 많은 솔루션이 유용합니다. 특정 플랫폼이없는 범용 OS의 경우 VM 또는 커널 부팅 매개 변수가 유용 할 수 있지만 대상 시스템의 메모리 사양을 알고있는 임베디드 시스템의 경우 사용 가능한 메모리를 채우십시오.
Eduard Florinescu

2
meta.unix.stackexchange.com/questions/1513/… 의 점수에 약간의 충격을받은 사람이 있습니까?
goldilocks

답변:


156

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)


3
스트레스 --vm-bytes $ (awk '/ MemFree / {printf "% d \ n", $ 2 * 0.097;}'</ proc / meminfo) k --vm-keep -m 10
Robert

1
대부분의 MemFree는 OS에 의해 유지되므로 MemAvailable을 대신 사용했습니다. 이 센트 OS에 나에게 7. 92 % 사용했다stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
kujiy

알아두면 좋은 점은 MemAvailable이 "스왑없이 새 응용 프로그램을 시작하는 데 사용할 수있는 메모리의 양을 추정하기 위해"추가되었습니다. git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/를 참조하십시오. 그리고 git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/…
tkrennwa

1
추가 메모처럼 두 가지를 모두 제공하는 --vm 1 and --vm-keep것이 매우 중요합니다. 단순히 --vm-bytes아무것도하지 않으며 필요 / 원하는만큼 많은 메모리를 할당 할 수 있다고 생각할 수 있습니다. 256G의 메모리를 할당하여 스스로를 확인하려고 할 때까지 나는 이것에 조금 익숙해졌습니다. 이것은 대답의 결함이 아니며 올바른 플래그를 제공하며 추가주의 사항입니다.
ffledgling

이것이 이유입니다 -m 1. 스트레스 맨에 따르면, -m N대한 짧은 --vm N스폰 : N에 회전 노동자malloc()/free()
tkrennwa

92

C 프로그램을 malloc()필요한 메모리에 쓴 다음 mlock()메모리가 스왑 아웃되는 것을 방지하는 데 사용할 수 있습니다.

그런 다음 프로그램이 키보드 입력을 기다리도록하고 메모리 잠금을 해제하고 메모리를 비운 다음 종료하십시오.


25
오랜 시간 동안 비슷한 유스 케이스를 테스트해야했습니다. 해당 메모리에 무언가를 쓸 때까지 실제로 할당되지 않습니다 (예 : 페이지 오류가 발생할 때까지). mlock ()이 그것을 처리하는지 확실하지 않습니다.
Poorna

2
나는 @siri와 동의합니다. 그러나 사용중인 변형 UNIX에 따라 다릅니다.
Anthony

2
일부 영감 코드합니다. 또한 메모리를 잠금 해제 / 해제 할 필요가 없다고 생각 합니다 . 프로세스가 종료되면 OS에서이를 수행합니다.
Sebastian

9
실제로 메모리에 써야 할 수도 있습니다. 커널은 malloc 만 사용하면 오버 커밋 될 수 있습니다. 예를 들어 Linux로 구성하면 실제로 메모리를 확보하지 않고도 malloc이 성공적으로 리턴하고 실제로 메모리를 쓸 때만 할당합니다. win.tue.nl/~aeb/linux/lk/lk-9.html
Bjarke Freund-Hansen

7
@Sebastian : callocIIRC와 같은 문제가 발생합니다. 모든 메모리는 동일한 읽기 전용 제로 페이지를 가리 킵니다. 쓰려고 할 때까지 실제로 할당되지 않습니다 (읽기 전용이므로 작동하지 않습니다). 내가 정말로 확신하는 유일한 방법은 memset전체 버퍼 를 수행하는 것 입니다. 자세한 내용은 다음 답변을 참조하십시오. stackoverflow.com/a/2688522/713554
Leo

45

제한된 메모리로 VM을 실행하고 소프트웨어를 테스트하는 것이 호스트 시스템의 메모리를 채우는 것보다 효율적인 테스트가 될 것을 제안합니다.

이 방법은 메모리 부족 상황으로 인해 다른 곳에서 OOM 오류가 발생하고 전체 OS가 중단되는 경우 다른 유용한 프로세스가 실행중인 시스템이 아닌 테스트중인 VM 만 중단한다는 이점이 있습니다.

또한 테스트가 CPU 또는 IO를 많이 사용하지 않는 경우 메모리 크기가 다양한 다양한 VM 제품군에서 테스트 인스턴스를 동시에 실행할 수 있습니다.


31

이 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

8
모든 * nix에 / dev / shm이있는 것은 아닙니다. 더 휴대용 아이디어?
Tadeusz A. Kadłubowski

pv설치된 경우 개수를 확인하는 데 도움이됩니다.dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
Otheus

1
속도를 원한다면이 방법이 올바른 선택입니다! 몇 초 만에 원하는 양의 RAM을 할당하기 때문입니다. / dev / urandom을 중계하지 마십시오. CPU가 100 % 사용되며 RAM이 큰 경우 몇 분이 걸립니다. 그러나 / dev / shm은 현대 우분투 / 데비안 배포판에서 상대적 크기를 가지며, 물리적 RAM의 기본 크기는 50 %입니다. 희망적으로 / dev / shm을 다시 마운트하거나 새로운 마운트 포인트를 생성 할 수 있습니다. 할당하려는 실제 크기인지 확인하십시오.
develCuy

30
  1. 리눅스를 실행;
  2. 와 부팅 mem=nn[KMG]커널 부트 매개 변수

(자세한 내용은 linux / Documentation / kernel-parameters.txt를 참조하십시오).


24

당신이 기본 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 ++ 프로그램을 작성하여 최상위 투표 답변과 동일한 문제를 일으켰습니다.


사랑스러운 솔루션. grep이 일치하는 항목을 찾지 못하므로 구성의 종료 코드가 1이라는 것이 결함입니다. stackoverflow.com/questions/6550484/… 의 해결책 중 어느 것도 그것을 고치지 않는 것 같습니다.
Holger Brandl

@HolgerBrandl 좋은 지적은, 나는 그것을 고치는 방법을 모른다. 내가 처음 들었을 때 set -e, 나는 방금 뭔가를 배웠다 :)
Luc

$ SECONDS는 쉘이 시작된 이후의 시간을 반영하는 내장 변수이기 때문에 좋은 선택이 아닌 것 같습니다. 참조 : tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_02.html
Holger Brandl

@HolgerBrandl 잘 잡았습니다. 몰랐습니다. 현재 3 백만 초 이상 열려있는 터미널을 찾으십시오. : D. 게시물을 업데이트했습니다.
Luc

멋진 기술! time yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n(10GiB 메모리 사용) 1 분 46 초가 걸립니다. github.com/julman99/eatmemory에서 julman99의 eatmemory 프로그램을 실행하는 데 6 초가 걸립니다. 글쎄, 다운로드 및 컴파일 시간뿐만 아니라 RHEL6.4 시스템에서 문제없이 매우 빠르게 컴파일되었습니다. 아직도, 나는이 솔루션을 좋아합니다. 왜 바퀴를 재발 명합니까?
Mike S

18

내 도트 파일에서 비슷한 작업을 수행하는 기능을 유지합니다. 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
}

1
IMHO는 가장 훌륭한 솔루션입니다. 기본적으로 작동하려면 dd 만 있으면되므로 다른 모든 항목은 모든 쉘에서 해결할 수 있습니다. 실제로 dd가 생성하는 데이터보다 적어도 일시적으로 메모리의 두 배를 요구합니다. 데비안 9, 대시 0.5.8-2.4에서 테스트되었습니다. MEMBLOB 파트를 실행하기 위해 bash를 사용하면 실제로 느려지고 dd가 생성하는 양의 4 배를 사용합니다.
P.Péter

16

간단한 파이썬 솔루션을 어기는 방법은 무엇입니까?

#!/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)

7
메모리 스왑에 실제로 영향을 거의 미치지 않으면 서 빠르게 스왑 아웃 될 것입니다 (일반적으로 시간이 걸리는 스왑을 모두 채우지 않는 한)
Joachim Sauer

1
사용 가능한 RAM이있는 동안 유닉스 스왑이 필요한 이유는 무엇입니까? 이것은 실제로 필요할 때 디스크 캐시를 제거하는 그럴듯한 방법입니다.
Alexander Shcheblikin

@AlexanderShcheblikin이 질문은 디스크 캐시를 제거하는 것이 아닙니다 (성능 테스트에는 유용하지만 낮은 리소스 테스트에는 유용하지 않음).
Gilles

1
이 솔루션은 테스트에서 Gig 또는 2 개를 조롱했지만 메모리에 스트레스를주지 않았습니다. 그러나 @JoachimSauer는 sysctl vm.swappiness=0vm.min_free_kbytes를 1024로 설정 하고 더 작은 숫자로 설정할 수 있습니다. 시도하지는 않았지만 문서는 이것이 스왑 아웃의 신속성을 제어하는 ​​방법이라고 말합니다 ... 실제로 시스템에 OOM 상태를 유발할 정도로 느리게 만들 수 있습니다. 참조 kernel.org/doc/Documentation/sysctl/vm.txtkernel.org/doc/gorman/html/understand/understand005.html
마이크 S

1GB에 대한 하나의 라이너 : python -c "x = (1 * 1024 * 1024 * 1024 / 8) * (0,); raw_input ()"
adrianlzt

10

존재하는 경우 램프는 어떻습니까? 마운트하여 큰 파일로 복사 하시겠습니까? /dev/shm램프 가없고없는 경우 -입력 값을 기반으로 큰 malloc을 수행하는 작은 C 프로그램을 추측합니다. 많은 메모리가있는 32 비트 시스템에서 한 번에 몇 번 실행해야 할 수도 있습니다.


8

제한된 메모리로 특정 프로세스를 테스트하려는 경우 ulimit할당 가능한 메모리의 양을 제한하는 것이 좋습니다 .


2
실제로 이것은 리눅스에서 작동하지 않습니다 (다른 * nix에 대해서는 몰라). 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.
Patrick

4

나는 이것이 가장 창조적 인 답변을 위해 경쟁하는 사람들에 의해 잘못된 질문과 정신이 빠져 버리는 것을 묻는 경우라고 생각합니다. OOM 조건 만 시뮬레이션해야하는 경우 메모리를 채울 필요가 없습니다. 사용자 지정 할당자를 사용하고 특정 할당 횟수 후에 실패하도록하십시오. 이 접근법은 SQLite에 충분하게 작동하는 것 같습니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.