프로그램의 RAM 사용량 측정


46

time 주어진 명령에 걸리는 CPU 시간을 알아 내려면 훌륭한 명령입니다.

프로그램과 모든 자식의 최대 RAM 사용량을 측정 할 수있는 비슷한 것을 찾고 있습니다. 바람직하게는 사용 된 메모리와 사용되지 않은 할당 된 메모리를 구별해야합니다. 아마도 중앙 메모리 사용량을 줄 수도 있습니다 (따라서 오랫동안 실행될 때 예상되는 메모리 사용량).

그래서 나는하고 싶습니다 :

rammeassure my_program my_args

다음과 비슷한 출력을 얻습니다.

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

나는 memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82를 보았지만 다소 해킹으로 간주합니다.

답변:


24

tstime 을 사용하여 프로세스의 고용량 메모리 사용량 (RSS 및 가상)을 측정 할 수 있습니다 .

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

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

또한 출력 모드 ( -t) 를보다 쉽게 ​​파싱 할 수 있습니다.


나는 그것을 좋아한다. 그것도 옳은 일을했다./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange

3
"프로세스 별 RAM 사용량"은 잘 정의 된 값이 아닙니다. 동일한 프로그램의 여러 인스턴스가 실행중인 경우 실행 파일을 공유합니다. 대부분의 프로그램은 공유합니다 glibc(그리고 다른 여러 라이브러리는 "공유"라고합니다). 많은 데몬이 구성을 메모리 및 fork (2) 자식으로로드 한 다음 구성 데이터를 공유합니다. 그런 다음 커널이 관리하는 readahead / writebehind 버퍼에 데이터가 있습니다. 그리고 느슨하게 결합 된 프로세스의 무리 인 서비스가 있습니다 (데스크탑 환경과 모든 애플릿 및 백그라운드 항목을 고려하십시오).
vonbrand

@vonbrand, Linux-Kernel이 RSS / VSS 값을 계산하는 방법은 잘 정의되어 있습니다.
maxschlepzig

@maxschlepzig, 그것은 임의의 값을 잘 계산할 수 있습니다. 이것이 의미하는 바를 의미하는 것은 아닙니다. 상주 세트는 프로세스 메모리의 현재 공간에있는 페이지입니다. 이는 "이 프로세스에서 사용하는 메모리" 가 아니며 공유하는 모든 것을 포함합니다.
vonbrand

@vonbrand 프로세스의 메모리 사용량을 측정하는 대부분의 유스 케이스는 공유되지 않은 익명 페이지를 측정하려고합니다. 동일한 입력으로 매우 예측 가능해야합니다.
블라디미르 판 텔레 예프

28

time쉘에 내장되어 있습니다. 이 마음 time만 더 자세한 정보가 필요, GNU 시도 time(자세한에서 -v) 모드 :

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

패키지 관리자에서 "time"또는 "gnutime"패키지를 검색하십시오.


3
GNU 시간에보고 된 일부 정보는 정확하지 않을 수 있습니다. 예를 들어 Ubuntu 10.04에서 : 맨 페이지에는 'wait3 (2)에 의해 반환 된 숫자만큼만 숫자가 있습니다'라고 나와 있습니다. 즉 wait3, getrusage(2)'Linux에서 모든 필드가 의미있는 것은 아닙니다. [..] '.
maxschlepzig

4
예를 들어 정확히 10MB를 할당하고 각 페이지를 터치하는 테스트 프로그램에서-GNU 시간은 최대 RSS 42608 KiB를 tstime보고하고 10652 KiB를보고합니다. 우분투 10.04에서 다시.
maxschlepzig

나는 이것이 간단하다면 사랑했을 것입니다. 내 우분투 컴퓨터에서 다음을 시도했습니다 /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top은 약 570MB가 필요하지만 시간은 2.3GB입니다. 실제로 그 숫자는 나에게 쓸모가 없습니다.
Ole Tange

4의 요소는 GNU 시간 1.7에서 고정되어 있으므로 예상대로 작동합니다.
Ole Tange

중요 사항 : "최대 상주 세트 크기"는 Linux 2.6.32 이후에만 작동합니다.
Jan Hudec

17

어쩌면 과잉 일 수도 있지만 방금 valgrind이름이 멋진 도구가 있다는 것을 알았습니다 massif. 나는 그것을 테스트했다 xterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

그리고 멋진 메모리 사용 그래프를 얻습니다.

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

지나치게 자세한 메모리 사용량 정보와 함께. valgrind 매뉴얼의 세부 사항 .

그러나 프로그램은 약 20 배 느리게 실행됩니다. 또한 내부에서 몇 가지 명령을 실행했습니다 xterm. --trace-children=yes옵션이 있으므로 메모리 풋 프린트가 고려되었습니다 !


1
Thx 20 배의 속도 패널티는 내 상황에 적합하지 않습니다. 그렇지 않으면 매우 예쁜 그래프!
Ole Tange

1
적어도 내가 사용하는 valgrind 버전 3.8.1에서 부울은 "true / false"가 아닌 "yes / no"형식으로 만 허용됩니다. 내 불평! :-)
MakisH

6

주제가 아주 오래되었지만 cgroups Linux 커널 기능에서 나온 다른 프로젝트를 공유하고 싶습니다.

https://github.com/gsauthof/cgmemtime :

cgmemtime은 프로세스 및 해당 하위 프로세스의 상위 워터 RSS + CACHE 메모리 사용량을 측정합니다.

그렇게하려면 프로세스를 자체 cgroup에 넣습니다.

예를 들어 프로세스 A는 10MiB를 할당하고 20MiB를 할당하는 하위 B를 분기하고 30MiB를 할당하는 하위 C를 분기합니다. 세 개의 프로세스는 모두 할당 시간이 해당 RSS (상주 세트 크기) 메모리 사용을 초래하는 시간 창을 공유합니다.

이제 문제는 A를 실행 한 결과 실제로 얼마나 많은 메모리가 사용됩니까?

답변 : 60 MiB

cgmemtime은 이러한 질문에 대답하는 도구입니다.


3

Linux> = 3.0의 루트가 아닌 경우 tstime이 더 이상 작동하지 않는 것 같습니다. 다음은 문제를 해킹하기 위해 작성한 폴링 유틸리티입니다. https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -v최신 버전에서 올바른 출력을 제공합니다. 이전 버전에서는 정확한 양을 얻기 위해 4로 나누면됩니다.
Ole Tange

그러나 time -v가 최대 메모리 크기 (RSS 만 해당)를 지원한다고 생각하지 않습니다. 누구든지 최신 버전에서 이것을 확인할 수 있습니까?
jhclark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.