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


11

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

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

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


어떤 OS를 사용하고 있습니까?
CVn

나는 리눅스 작업입니다
des_user

이 글타래는 당신에게 도움이 될 것입니다 : serverfault.com/questions/387268/…
Jacob Coleman

답변:


13

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

시럽

나는이 도구를 사용하지 않았지만 당신이 찾고있는 것처럼 들립니다. 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

참고 문헌


3

주제가 아주 오래되었지만 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

그렇다면이 도구를 사용하여 프로그램이 종료 된 후 프로그램 의 최대 RAM 사용량 을보고 할 수 있습니까?
terdon

@terdon wait4cgroup ( memory.max_usage_in_bytes) 과 함께 프로세스 종료를 잡는 데 사용 됩니다 . 자세한 내용은 github의 README에서 확인할 수 있습니다.
Vlad Frolov

고맙지 만 내 요점은 당신의 대답에 관한 것이 었습니다. 그대로, 질문에 대답하지 않고 가능한 외부 리소스만을 가리 킵니다. 또한 자동 플래그를 올리는 다른 곳에 정확하게 동일한 답변을 게시했습니다 . 답을 수정하고이 프로그램이 OP가 요구하는 것을 어떻게 수행 할 수 있는지 보여주는 예를 포함하십시오.
terdon

2
@terdon 예, 했어요! 같은 질문을 검색했는데 질문이 거의 동일하고 답변이 모두 동일하기 때문에 'parse ps output'은 미쳤습니다! 나는 cgmemtime 프로젝트에 실수로 부딪 치기 전에 일주일을 보냈습니다.이 프로젝트는 내가 언급 한 모든 질문에 완벽하게 일치합니다!
Vlad Frolov

1
그럴 수 있지. 사용 방법에 대한 예를들 수 있다면 좋을 것입니다. 답이 향상 될 것입니다. 어쨌든 이것을 게시하는 데 시간을 내 주셔서 감사합니다. 다른 사람들이 유용하다고 생각합니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.