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