Linux에서 애플리케이션 종료 후 최대 메모리를 측정하는 방법

Linux에서 애플리케이션 종료 후 최대 메모리를 측정하는 방법

Linux에서 실행되는 애플리케이션의 최대 메모리를 측정하는 방법은 무엇입니까?

현재 메모리를 보고하므로 RSS를 사용할 수 없도록 이 앱을 일괄적으로 실행하고 있습니다. 마지막에 애플리케이션에서 사용하는 최대 메모리를 보고해야 합니다.

VmPeak은 할당된 메모리를 보고하고 실제 RAM이 아닌 하드 디스크에서 계산하므로 솔루션이 아닙니다.

답변1

프로세스의 최대 메모리 사용량을 추적하는 두 가지 방법은 다음과 같습니다.

시럽

저는 이 도구를 사용하지 않았지만 귀하가 찾고 있는 도구인 것 같습니다. 그것은 알려져있다시럽.

설명하다

Syrupy는 시스템 리소스 사용량에 대한 프로필을 동적으로 구축하기 위해 하나 이상의 실행 중인 프로세스에 대해 주기적으로 메모리 및 CPU 로드 스냅샷을 찍는 Python 스크립트입니다.

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

예, 아이러니하게도 GNU time 명령은 프로세스의 최대 메모리 사용량을 제공할 수 있습니다. 다음과 같이 최대 메모리를 보고합니다 Maximum resident set size (kbytes).

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    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): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    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

인용하다

답변2

이 주제는 꽤 오래되었지만 cgroups Linux 커널 기능에서 파생된 또 다른 프로젝트를 공유하고 싶었습니다.

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

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

이를 수행하기 위해 프로세스를 자체 cgroup에 넣습니다.

예를 들어, 프로세스 A는 10MiB를 할당하고, 20MiB를 할당하는 하위 프로세스 B를 분기하고, 30MiB를 할당하는 하위 프로세스 C를 분기합니다. 세 프로세스 모두 할당으로 인해 해당 RSS(Resident Set Size) 메모리 사용량이 발생하는 시간 창을 공유합니다.

이제 질문은 A를 실행하면 실제로 얼마나 많은 메모리가 사용됩니까?

답: 60MiB

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

사용 예는 다음과 같습니다.

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB

관련 정보