测量程序的RAM使用率


46

time 如果您想弄清楚给定命令需要多少CPU时间,这是一个很棒的命令。

我正在寻找类似的东西,可以测量程序和任何子级的最大RAM使用率。最好,它应该区分已使用和未使用的已分配内存。也许它甚至可以给出内存使用率的中位数(因此,长时间运行时您应该期望的内存使用率)。

所以我想做:

rammeassure my_program my_args

并获得类似于以下内容的输出:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

我已经看过memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82,但我认为这有点黑。

Answers:


24

您可以使用tstime来衡量进程的高内存使用量(RSS和虚拟)。

例如:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

它还支持更易于解析的输出模式(-t)。


我喜欢。它甚至与《./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange》

3
“进程使用的RAM”不是一个明确定义的值:如果同一程序正在运行多个实例,则它们共享可执行文件。大多数程序都共享glibc(和其他各种库一样,它们被称为“共享”)。许多守护程序将配置加载到内存和fork(2)子级中,然后它们共享配置数据。然后,在内核管理的预读/后写缓冲区中有数据。然后,有一些服务是由松散耦合的进程组成的(想想您的桌面环境及其所有小程序和背景材料)。
vonbrand 2013年

@ vonbrand,Linux内核如何计算RSS / VSS值已明确定义。
maxschlepzig 2013年

@maxschlepzig,它很可能会计算出一些随机值,但这并不意味着它们意味着您所认为的含义:驻留集只是进程当前地址空间中内存中的页面。那不是 “此过程使用的内存”,它包括共享的内容。
vonbrand 2013年

@vonbrand大多数测量进程的内存使用情况的用例都希望测量未共享的匿名页面,这对于相同的输入应该是非常可预测的。
弗拉基米尔·潘捷列夫

28

time是您的Shell的内置组件。如果您愿意time但需要更多信息,请time以详细(-v)模式尝试GNU :

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

在包管理器中搜索包“时间”或“ gnutime”。


3
请注意,GNU时间报告的某些信息可能不准确。例如在Ubuntu 10.04下:手册页指出“数字仅与wait3(2)返回的数字一样好”。即wait3填充一种结构,具体说明如下getrusage(2):'在Linux下,并非所有字段都是有意义的。[..]'。
maxschlepzig 2011年

4
例如,在精确分配10 MB(并触摸每个页面)的测试程序上-GNU时间报告的maxRSS为42608 KiB- tstime报告的为10652 KiB。再次在Ubuntu 10.04下。
maxschlepzig 2011年

如果真是如此简单,我本来会喜欢的。在我的Ubuntu计算机上,我尝试了:/usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'。top表示大约需要570 MB,但时间表示为2.3 GB。在实践中,这个数字对我来说是不可用的。
奥莱·丹吉

因数4在GNU时间1.7中是固定的,因此按预期工作。
Ole Tange

重要说明:“最大居民集大小”仅从Linux 2.6.32开始有效。
2014年

17

也许矫kill过正,但我​​刚刚发现它valgrind有一个名为的好工具massif。我测试了xterm

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

您会得到一个不错的内存使用情况图:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

以及过于详细的内存使用信息。有关详细信息,请参见valgrind手册

程序的运行速度将降低约20倍。另外,我在中运行了一些命令xterm。由于存在--trace-children=yes该选项,因此已考虑到它们的内存占用量!


1
20倍的速度损失使我无法承受这种情况。否则非常漂亮的图形!
奥莱·丹吉

1
看起来至少在我使用的valgrind 3.8.1版本中,布尔值仅以“是/否”而不是“真/假”的形式被接受。我的抱怨!:-)
MakisH

6

即使话题很老,我还是想分享另一个来自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是回答此类问题的工具。


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.