development

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

big-blog 2020. 2. 29. 15:27
반응형

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


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

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


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

grep VmPeak /proc/$PID/status

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


[ 편집 : 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
        평균 공유 텍스트 크기 (KB) : 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

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

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

memusg ls -alR /> / dev / null

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

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


발 그린 드 원 라이너 :

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


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

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

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


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
      . . .

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

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

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


프로세스가 적어도 몇 초 동안 실행되면 다음 명령을 사용하여 주어진 명령 줄을 실행 한 다음 피크 RSS를 stderr 인쇄합니다 ( 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

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

/usr/bin/time -l commandToMeasure

grep원하는 것을 가지고 갈 수 있습니다 .


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


time -f '%M' <run_program>

Valgrind 와 같은 도구를 사용하여 이를 수행 할 수 있습니다 .


다음은 (다른 답변을 바탕으로) 이미 실행중인 프로세스를 감시하는 매우 간단한 스크립트입니다. 인수로 보려는 프로세스의 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

Massif 사용 : http://valgrind.org/docs/manual/ms-manual.html


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

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


손으로 만든 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 % 미만

사용자 정의 명령 출력


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


'htop'은 어느 프로세스가 얼마나 많은 RAM을 사용하고 있는지 확인하는 가장 좋은 명령입니다 .....

자세한 내용은 http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html


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

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

제안 된 사용 :

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 /'| 정렬 -g | 꼬리 -n 1

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

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

14673 gu27mox 20 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

참고 URL : https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process



반응형