结束后如何在Linux上测量应用程序的峰值内存


11

如何测量在Linux上运行的应用程序的峰值内存?

我批量运行此应用程序,因此无法使用RSS,因为它会报告当前内存。我需要该应用程序过去曾被报告的峰值内存。

VmPeak也不是一种解决方案,因为它报告已分配的内存,并且也不从实际的Ram而是从硬盘进行计算。


您正在什么操作系统上运行该应用程序?
的CVn

我正在Linux上工作
des_user 2013年

此线程应该对你有所帮助:serverfault.com/questions/387268/...
雅各布·科尔曼

Answers:


13

这是跟踪进程的峰值内存使用情况的两种方法。

糖浆

我没有使用过此工具,但听起来像您要找的东西。这就是所谓的糖浆

描述

Syrupy是一个Python脚本,它定期捕获一个或多个正在运行的进程的内存和CPU负载的快照,以便动态建立它们对系统资源使用情况的配置文件。

$ 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

参考文献


3

即使话题很老,我还是想分享另一个来自cgroups Linux内核功能的项目。

https://github.com/gsauthof/cgmemtime

cgmemtime衡量一个进程及其后代进程的高水位RSS + CACHE内存使用情况。

为此,它将进程放入自己的cgroup中。

例如,进程A分配10 MiB,而分支B的孩子B分配20 MiB,而分支C的孩子C分配30 MiB。这三个进程共享一个时间窗口,在此它们的分配导致相应的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它wait4与cgroups(memory.max_usage_in_bytes)结合使用来捕获进程出口,这似乎很有意义。有关更多详细信息,请参见github上的README。
弗拉德·弗洛洛夫

谢谢,但我的意思更多是关于您的答案。就目前而言,它并不是在回答问题,而只是指向一些可能的外部资源。另外,您已经在其他地方发布了完全相同的答案,从而引发了自动标记。请编辑您的答案,并提供一个示例,说明该程序如何完成OP的要求。
terdon

2
@terdon是的,我做到了!因为我搜索了相同的问题,并且问题几乎相同,并且答案都相同:“ parse ps output”,这太疯狂了!我花了一个星期的时间才偶然进入了cgmemtime项目,这对于我评论过的所有这些问题都是完美的选择!
弗拉德·弗洛洛夫

1
很公平。如果您能举例说明如何使用它,那就太好了。它将改善您的答案。无论如何,感谢您抽出宝贵的时间发布此信息,我相信其他人也会发现它有用。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.