Linux에서 종료 된 후 애플리케이션의 최대 메모리를 측정하는 방법 사용할 수 없습니다. 마지막에

Linux에서 실행되는 응용 프로그램의 최대 메모리를 어떻게 측정합니까?

이 응용 프로그램을 일괄 처리하여 RSS를 사용할 수 없으므로 현재 메모리를보고하므로 RSS를 사용할 수 없습니다. 마지막에 응용 프로그램이보고 된 피크 메모리가 필요합니다.

VmPeak는 할당 된 메모리를보고하고 실제 Ram뿐만 아니라 하드 디스크에서도 계산하기 때문에 해결책이 아닙니다.



답변

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

시럽

나는이 도구를 사용하지 않았지만 당신이 찾고있는 것처럼 들립니다. Syrupy 라고 합니다 .

기술

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 시간 명령은 프로세스의 최대 메모리 사용량을 제공 할 수 있습니다. 최대 메모리를 다음과 같이보고합니다 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

참고 문헌


답변

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

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

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

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

예를 들어 프로세스 A는 10MiB를 할당하고 20MiB를 할당하는 하위 B를 분기하고 30MiB를 할당하는 하위 C를 분기합니다. 세 개의 프로세스는 모두 시간이 할당되어 할당에 따라 해당 RSS (상주 세트 크기) 메모리 사용이 발생합니다.

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

답변 : 60 MiB

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