我所说的进程树是指进程及其以任何方式执行的所有内容。
我尝试过/usr/bin/time -v
,但结果完全错误。例如,npm test
在我们的一个项目中运行 14GiB 可用 RAM 和 8GiB 可用交换会导致 OOM 杀手开始杀死我的应用程序(最常见的是浏览器和 IDE)。time
报告仅使用了 800MiB,尽管实际内存消耗一定非常高,超过 20GiB...
答案1
首先,我将使用smem
.例如,您可以用来smem -tas uss
进行概述。
-t
...显示总计-a
...自动调整列宽-s uss
...根据以下内容对结果进行排序号航空母舰柱子
要查看每个进程的详细信息,最好的方法是使用pmap
.要获取详细信息,您应该使用-X
switch。要获取内核提供的所有信息,您可以使用-XX
这通常是一种矫枉过正。
获得 2 秒刷新监控PID3120:
watch -n 2 pmap -X 3120
编辑:要真正达到峰值 以上有助于监测,但并未显示实际峰值。我忘了。
我个人会使用valgrind
该massif
工具。
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_print
Massif的后处理工具。
很简单:
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
命令中。