如何测量进程树的峰值内存使用情况?

如何测量进程树的峰值内存使用情况?

我所说的进程树是指进程及其以任何方式执行的所有内容。

我尝试过/usr/bin/time -v,但结果完全错误。例如,npm test在我们的一个项目中运行 14GiB 可用 RAM 和 8GiB 可用交换会导致 OOM 杀手开始杀死我的应用程序(最常见的是浏览器和 IDE)。time报告仅使用了 800MiB,尽管实际内存消耗一定非常高,超过 20GiB...

答案1

首先,我将使用smem.例如,您可以用来smem -tas uss进行概述。

  • -t...显示总计
  • -a...自动调整列宽
  • -s uss...根据以下内容对结果进行排序号航空母舰柱子

要查看每个进程的详细信息,最好的方法是使用pmap.要获取详细信息,您应该使用-Xswitch。要获取内核提供的所有信息,您可以使用-XX这通常是一种矫枉过正。

获得 2 秒刷新监控PID3120:

watch -n 2 pmap -X 3120

编辑:要真正达到峰值 以上有助于监测,但并未显示实际峰值。我忘了。

我个人会使用valgrindmassif工具。

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=evolution_massif.out evolution; grep mem_heap_B evolution_massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

解释:

  • --page-as-heap=yes...告诉 Massif 它应该占用所有内存而不仅仅是堆
  • --massif-out-file...的输出文件地块工具
  • 进化...应该监控的应用程序

下一部分是找出记录的最大数量。

搜索grep次数为内存堆B发生。sed -e去掉字符串,mem_heap_B这样我们就只能得到数字结果。我们通过sort -g通用数字排序对其进行排序,并取最大的数字,tail -n 1返回排序数字的第一行。

应用程序终止后valgrid会打印出一个数字,即内存峰值(以[B]ytes为单位)。

检查内存峰值记录

显示输出文件进化_massif.out,可以使用ms_printMassif的后处理工具。

很简单:

ms_print evolution_massif.out

输出应如下所示(这是输出的第一页),您可以在其中看到哪个快照是峰值 -10(峰值)

--------------------------------------------------------------------------------
Command:            evolution
Massif arguments:   --pages-as-heap=yes --massif-out-file=massif.out
ms_print arguments: massif.out
--------------------------------------------------------------------------------


    GB
10.09^        #                                                               
     |        #                                                               
     |        #                                                               
     |        #                                                               
     |        #                                                               
     |        #                                                               
     |        #      @:::::@::::::::::::::::@@:::::@:::::@::::::@::::@:::::@::
     |        #      @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::::@:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |        #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |     @  #::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
     |  :::@::#::::: @:::::@: :::::::: :::: @@:::::@:::::@::::::@::::@:::::@::
   0 +----------------------------------------------------------------------->Gi
     0                                                                   8.927

Number of snapshots: 97
 Detailed snapshots: [7, 10 (peak), 17, 24, 43, 44, 50, 60, 70, 80, 90]

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0           16,384           16,384             0            0
  1    149,772,704      393,547,776      393,547,776             0            0
  2    243,902,287      398,592,800      398,592,800             0            0
  3    396,613,298      558,157,704      558,157,704             0            0
  4    504,752,503      638,138,760      638,138,760             0            0
  5    604,812,936      639,894,808      639,894,808             0            0
...

编辑以添加所有子项

要添加所有后代(子级),您可以将该--trace-children=yes选项添加到valgrind命令中。

相关内容