한 프로세스의 메모리 사용을 호출하고 추적


14

메모리 소비 프로그램을 실행하고 시간이 지남에 따라 메모리 사용량을 추적하고 싶습니다. 프로그램은 호출 된 후 몇 초 안에 종료됩니다.

이 이전 질문sysstat 패키지를 제안했습니다 . pidstat유틸리티가 내가 원하는 것을 부분적으로 수행 하지만 내 두 가지 요구를 충족시키지 못합니다.

  • 최소 간격을 허용 1s하지만 더 짧은 단위로 측정하고 싶습니다. ( 0.1s괜찮아)
  • 항상 기존 프로세스를 추적하지만 항상 pid를 복사하여 붙여 넣을 수는 없습니다.

호출 및 측정 작업을 더 잘 수행 할 수있는 대체 스크립트 / 유틸리티가 있습니까?


1
프로세스의 메모리 사용량을 덤프하기 위해 간단한 작은 Python 또는 Bash 스크립트를 작성한 /proc/$PID/statm다음 (100 의 첫 정수를 볼 수 있음 ) 100ms 동안 자고 반복해야합니다. 를 statm통해 PID를 계속 던질 수없는 이유는 무엇입니까? cat일부 정규식을 사용하여 여분의 / 필요없는 값을 필터링하고 그냥 sleep 0.01? 일부 운영 체제는 1 초 미만의 sleep값을 허용하지 않으므로이 경우 Python 경로를 가져와야합니다 ( time대신 Python의 내장 라이브러리를 사용하여 잠자기).
획기적인

여러가 가지 방법
munish

답변:


11

필요한 작업을 수행해야합니다. 정보를 가져오고 /proc/$PID/statm(에서 man procfs) 인쇄합니다 .

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

스크립트 :

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

그런 다음 스크립트를 호출하여 프로세스 이름을 입력으로 제공 할 수 있습니다. 예를 들면 다음과 같습니다.

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

노트:

  • 이름이 지정된 단일 실행 프로세스 만 있다고 가정 합니다.

@ björnen 편집 해 주셔서 감사합니다. 당신이 옳습니다, 나는 man거기에 잘못 이 있었으며, 왜 편집이 거부되었는지 모르겠습니다.
terdon

1

몇 년 후 나는 valgrind (또한)가 이것을위한 도구를 가지고 있음을 발견했습니다.

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

참고 : valgrind는 관찰 이상의 기능을 수행합니다. 코드를 삽입하고 메모리 스냅 샷을 작성해야합니다. 통계의 정확성을 떨어 뜨릴 수 있습니다.

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