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

men*_*fon 6 linux memory

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

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

tuk*_*kan 4

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

  • -t...显示总计
  • -a...自动调整列宽
  • -s uss...根据uss列对结果进行排序

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

要获得pid 3120的 2 秒刷新监控:

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... Massif工具的输出文件
  • 演变......应该监控的应用程序

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

搜索mem_heap_Bgrep出现的地方。去掉字符串,这样我们就只能得到数字结果。我们通过通用数字排序对其进行排序,并取最大的数字,返回排序数字的第一行。sed -emem_heap_Bsort -gtail -n 1

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

检查内存峰值记录

要显示输出文件evolution_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
...
Run Code Online (Sandbox Code Playgroud)

编辑以添加所有子项

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