리눅스 / 유닉스 프로세스의 최대 메모리 사용량


376

명령 줄을 실행하고 최대 RAM 사용량 합계를보고하는 도구가 있습니까?

/ usr / bin / time과 비슷한 것을 상상하고 있습니다.

답변:


28

다음은 외부 스크립트 또는 유틸리티가 필요하지 않으며 Valgrind 또는 시간과 같은 다른 프로그램을 통해 프로세스를 시작할 필요가없는 단일 라이너입니다. 따라서 이미 실행중인 모든 프로세스에 사용할 수 있습니다.

grep VmPeak /proc/$PID/status

( $PID관심있는 프로세스의 PID로 대체 )


4
PID를 모르면 어떻게합니까? 예를 들어 프로그램이 적은 시간 (<1s)을 실행하는 경우
diralik

4
"VmHWM : 최대 상주 세트 크기"는 RAM 사용량을 측정하는 데 더 유용 할 수 있습니다 (많은 것들을 포함하는 VmPeak 대신).
jfs

@jfs 그것은 정말로 당신이 찾고 싶은 것에 달려 있습니다. IIRC VmPeak는 가상 메모리를 포함한 최대 총 메모리 사용량이며 VmHWM은 최대 RAM 사용량입니다. 따라서 프로그램이 요청한 총 메모리 양을 알고 싶다면 VmPeak을 사용하십시오. 주어진 시간에 실제 사용 된 RAM의 양을 알고 싶다면 VmHWM을 사용하십시오.
erobertc

1
@diralik 직접 작성한 프로그램을 확인하는 경우 "/ proc / self / status"파일을 찾기 위해 코드 줄을 포함시킬 수 있습니다.
Fileland

404

[ 편집 : Ubuntu 14.04에서 작동 : /usr/bin/time -v command 전체 경로를 사용해야합니다.]

/usr/bin/time통과하면 해당 정보를 제공하는 것 같습니다 -v(Ubuntu 8.10에 있음). 예를 들어 Maximum resident set size아래를 참조하십시오 .

$ / usr / bin / 시간 -v ls /
....
        시간이 초과되는 명령 : "ls /"
        사용자 시간 (초) : 0.00
        시스템 시간 (초) : 0.01
        이 직업에 걸린 CPU의 비율 : 250 %
        경과 된 (벽시계) 시간 (h : mm : ss 또는 m : ss) : 0 : 00.00
        평균 공유 텍스트 크기 (kbyte) : 0
        공유되지 않은 평균 데이터 크기 (kbyte) : 0
        평균 스택 크기 (KB) : 0
        평균 총 크기 (KB) : 0
        최대 상주 세트 크기 (kbyte) : 0
        평균 상주 세트 크기 (kbyte) : 0
        주요 (I / O 필요) 페이지 결함 : 0
        사소한 (프레임 회수) 페이지 오류 : 315
        자발적 컨텍스트 전환 : 2
        비자발적 컨텍스트 전환 : 0
        스왑 : 0
        파일 시스템 입력 : 0
        파일 시스템 출력 : 0
        전송 된 소켓 메시지 : 0
        소켓 메시지 수신 : 0
        전달 된 신호 : 0
        페이지 크기 (바이트) : 4096
        종료 상태 : 0

4
아마도 ls가 많은 일을하지 않기 때문에 항상 0을 반환합니다. 보다 CPU 집약적 인 명령을 시도하십시오.
Jon Ericson

17
매뉴얼 페이지에서 : 시간별로 표시되는 대부분의 정보는 wait3 (2) 시스템 호출에서 파생됩니다. 숫자는 wait3 (2)에 의해 리턴 된 숫자만큼만 유효합니다. 상태 정보를 리턴하는 wait3 (2) 호출이없는 시스템에서는 times (2) 시스템 호출이 대신 사용됩니다. 그러나 wait3 (2)보다 훨씬 적은 정보를 제공하므로 해당 시스템 시간에서 대부분의 자원을 0으로보고합니다.
lothar 2016 년

79
"bash : -v : command not found"는 bash가 자신의 시간을 가로채는 것을 의미합니다. /bin/time -v그것을 해결합니다.
gcb

3
출력이 의미가 있는지 확인하기 위해 빠른 검사를 수행하는 것이 좋습니다. Gnu 시간에는 실제 메모리 사용량의 4 배를보고하는 버그가 있습니다. stackoverflow.com/questions/10035232/…
Ian

24
@skalee time -lMacOS에서 사용해보십시오 . 비슷한 출력을 제공합니다.
Volker Stolz

96

(이것은 이미 대답 한 오래된 질문입니다.

Yang의 대본에서 영감을 얻은 memusg 라는이 작은 도구를 생각해 냈습니다 . 많은 짧은 생활 과정을 처리하기 위해 샘플링 속도를 0.1로 높였습니다. 단일 프로세스를 모니터링하는 대신 프로세스 그룹의 rss 합계를 측정했습니다. (예, 함께 작동하는 많은 개별 프로그램을 작성합니다) 현재 Mac OS X 및 Linux에서 작동합니다. 사용법은 다음과 비슷해야합니다 time.

memusg ls -alR /> / dev / null

그것은 순간의 피크 만 보여 주지만 다른 (거친) 통계를 기록하기위한 약간의 확장에 관심이 있습니다.

심각한 프로파일 링을 시작하기 전에 살펴보기위한 간단한 도구를 사용하는 것이 좋습니다.


1
여전히 PS를 사용하고 관찰 된 최상위 메모리를 결정하는 데만 도움이됩니다. 실제 최고 메모리가 아닙니다. 한 간격과 다른 간격 사이에서 항상 무언가를 놓칠 수 있습니다.
gcb

6
memusg 스크립트의 출력 단위는 무엇입니까? 바이트? 킬로바이트?
Daniel Standage

1
@DanielStandage : 아마 킬로바이트. ps -o rss=rss가 내 BSD 매뉴얼 페이지에서 프로세스의 실제 메모리 (상주 세트) 크기 (1024 바이트 단위) 인 곳에서 표시된 값을 감시합니다 .
netj

3
@gcb 샘플을 측정 할 때 얻을 수있는 것입니다.
Volker Stolz

2
대답에 주어진 memusg에 대한 링크가 끊어진 것 같습니다. 어쨌든, / usr / bin / time은 이것을 아주 잘 수행합니다.
Tom Cornebize

65

발 그린 드 원 라이너 :

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

프로세스의 모든 메모리를 측정하려면 --pages-as-heap을 사용하십시오. 자세한 정보는 여기 : http://valgrind.org/docs/manual/ms-manual.html


14
time, 난 당신을 떠났습니다.
jbeard4 2016 년

1
편리한 스크립트이지만 슬랙웨어 시스템에서 sort -g가 필요합니다 (가장 높은 값을 찾는 것으로 가정).
Nick Coleman

3
일에 대한 valgrind --massif. ms_print편리한 출력을 위해 함께 제공 되는 도구를 사용할 수도 있습니다 (시간 경과에 따른 ASCII 사용 차트 포함)
Eli Bendersky

7
Massif는 다음 time과 같은 명령에서 10 배 이상 시간이 걸리지 만 오버 헤드가 훨씬 높습니다 ls.
Timothy Gu

8
실제로 너무 방대합니다. 이 답변은 속도 저하를 언급해야합니다. 측정하려는 명령은 보통 완료하는 데 35 초가 걸립니다. 나는 30 분 전에 그것을 측정하기 위해이 valgrind 명령을 실행했지만 아직 완료되지 않았습니다…
unagi

35

Linux에서 :

사용 /usr/bin/time -v <program> <args>및 "찾기 최대 상주 세트 크기 ".

(Bash time내장 명령 과 혼동하지 마십시오 ! 전체 경로를 사용하십시오 . /usr/bin/time)

예를 들면 다음과 같습니다.

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

BSD, MacOS에서 :

를 사용 /usr/bin/time -l <program> <args>하여 " 최대 상주 세트 크기 "를 찾으십시오 .

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .

sudo apt-get install time
Rolf

2
이 근거는 이미 2 년 전에 추가 된 답변에 의해 다루어지지 않았 습니까?
찰스 더피

34

아마도 (gnu) time (1)은 이미 원하는 것을 수행합니다. 예를 들어 :

$ /usr/bin/time -f "%P %M" command
43% 821248

그러나 다른 프로파일 링 도구는 찾고자하는 것에 따라보다 정확한 결과를 제공 할 수 있습니다.


큰 명령의 경우에도 항상 이것으로 0을 얻는 것 같습니다
jes5199

같은 프로그램에서 400 % 0, 0 % 0과 같은 가변 결과를 얻습니다.
Liran Orevi 2009

무엇을 제안해야할지 모르겠습니다. 위의 코드는 정확히 역사에 있었던 라텍스 명령을 실행 한 것입니다. 내가 말했듯이 다른 도구를 사용하면보다 정확한 결과를 얻을 수 있습니다.
Jon Ericson

2
그것은 적어도 CentOS (따라서 RHEL) 시스템에서 작동합니다. % P는 스케줄러에 따라 관련이없는 통계 (% CPU)를 제공하므로 상당히 다양합니다.
Blaisorblade

2
@Deleteman :은를 time사용할 때 내장 된 명령 csh입니다. 정확한 경로를 사용하면 외부 명령을 실행할 수 있습니다. 내가 아는 한 GNU 버전 만 format 옵션을 지원합니다.
Jon Ericson

18

/ usr / bin / time은 실제로 원하는 것을 할 수 있습니다. 같은 것.

 / usr / bin / time --format = '(% Xtext + % Ddata % Mmax)'

자세한 내용은 시간 (1)을 참조하십시오 ...


1
큰 명령의 경우에도 항상 이것으로 0을 얻는 것 같습니다
jes5199

jes5199, Liran, 위의 의견을 보면 일부 리눅스에서 메모리보고에 시간 (1)이 깨지는 것 같습니다 ...
simon

Ubuntu 16.04에서 텍스트와 데이터는 0이지만 max는 0이 아니며 의미있는 값을 생성합니다. 나는 행복하다.
Stéphane Gourichon

나는 Mmax가 우리가 원하는 것을 의미한다는 것을 희망한다. ... 맨 페이지는 그것에 대해 조금 간결하다
matanster

17

MacOS Sierra에서는 다음을 사용하십시오.

/usr/bin/time -l commandToMeasure

당신 grep이 원하는 것을 취할 수 있습니다 .


5
이! 말 그대로 Instruments.app 및 dtrace가 시스템 무결성이 설정된 메모리 프로파일을 제공하기 위해 노력하는 데 1 시간을 보냈습니다 (끄기 불가능). 필자는이 간단한 명령 만 필요했습니다. 작은 메모, command time -l대신에 /usr/bin/time -ltime이 내장 함수 대신에 호출 된 바이너리를 호출하게하는 대신 사용할 수 있습니다. (예, command위치 지정자가 아닌 command time단지 다릅니다 time.)
야쿱 아놀드

16

프로세스가 적어도 몇 초 동안 실행되면 다음 명령을 사용하여 주어진 명령 줄을 실행 한 다음 최고 RSS를 인쇄합니다 ( rss관심있는 다른 속성으로 대체 ). 다소 가벼우 며 ps우분투 9.04 (내가 말할 수는 없음 time)에 포함되어있어 나에게 효과적입니다 .

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2

1
이 방법의 가장 큰 단점은 프로세스가 짧은 기간 동안 (예 : 거의 끝까지) 많은 메모리를 할당하면 감지되지 않을 수 있다는 것입니다. 수면 시간을 줄이면 약간 도움이 될 수 있습니다.
vinc17


8

글쎄, 실제로 메모리 피크와 좀 더 깊이있는 통계를 보여주고 싶다면 valgrind 와 같은 프로파일 러를 사용하는 것이 좋습니다 . 좋은 valgrind 프론트 엔드는 alleyoop 입니다.



5

다음은 (다른 답변을 바탕으로) 이미 실행중인 프로세스를 감시하는 매우 간단한 스크립트입니다. 인수로 보려는 프로세스의 pid로 실행하십시오.

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

사용법 예 :

max_mem_usage.sh 23423


1

힙 트랙 은 GUI 및 텍스트 인터페이스가있는 KDE 도구입니다. 프로세스의 메모리 사용량을 이해하는 것이 valgrind보다 더 자세하고 화염 그래프를 제공하기 때문에 더 적합합니다. valgrind를 덜 검사하기 때문에 더 빠릅니다. 또한 최대 메모리 사용량을 제공합니다.

어쨌든 rss와 vss를 추적하는 것은 페이지를 공유 할 수 있기 때문에 오해의 소지가 있습니다 memusg. 실제로해야 할 일은 Pssin /proc/[pid]/smaps또는 use 의 합계를 추적하는 것 pmap입니다. 그놈 시스템 모니터 는 그렇게했지만 너무 비쌌습니다.


1

손으로 만든 bash 스크립트를 사용하여 바퀴를 다시 발명하십시오. 빠르고 깨끗합니다.

내 유스 케이스 : RAM이 적은 Linux 시스템을 모니터링하고 사용량이 많을 때 컨테이너 사용량을 스냅 샷으로 찍고 싶었습니다.

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

샘플 출력 :

2017-10-12 13:29:33 : 임계 값 30 %로 사용 가능한 메모리 모니터 실행

2017-10-12 13:29:33 : 사용 가능한 충분한 여유 메모리 : 69.4567 %

2017-10-12 13:30:03 : 사용 가능한 충분한 여유 메모리 : 69.4567 %

2017-10-12 16:47:02 : 사용 가능한 메모리 18.9387 %가 30 % 미만

사용자 정의 명령 출력


1

macOS에서는 대신 DTrace를 사용할 수 있습니다. "Instruments"앱은이를위한 훌륭한 GUI이며 XCode afaik과 함께 제공됩니다.



-2

질문에 반드시 답변하십시오. 세부 정보를 제공하고 연구 결과를 공유하십시오!

죄송합니다. 여기에 처음 왔으며 질문 만 할 수 있습니다…

제안 된 사용 :

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

그때:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

이것은 top비슷한 순간에 명령이 보여주는 것과는 매우 다릅니다 .

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

Valgrind의 측정 단위는 무엇입니까?

/usr/bin/time -v ./test.sh대답 결코 - 당신이 직접에 실행 공급합니다 /usr/bin/time같은 :

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.