我想查看command
的峰值内存使用情况。我有一个参数化算法,我想知道该程序何时由于我的计算机(12GB RAM)上的内存不足错误而崩溃。
我尝试过:
/usr/bin/time -f "%M" command
valgrind --tool=massif command
第一个给我1414168
(1.4GB;感谢ks1322指出它是以KB为单位!),而valgrind给了我
$ ms_print massif.out
--------------------------------------------------------------------------------
n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B)
--------------------------------------------------------------------------------
75 26,935,731,596 22,420,728 21,956,875 463,853 0
我有点困惑我应该选择哪个数字,但让我们假设“总数”(22MB)。
massif-visualizer
告诉我
现在对于同一命令,我有3个不同的数字:
valgrind --tool=massif command
+ ms_print
:22MB valgrind --tool=massif command
+ massif-visualizer
:206MB(这是我在htop
中看到的,我想这是我感兴趣的东西)time -f "%M" command
:1.4GB 我应该看哪个号码?为什么数字完全不同?
答案 0 :(得分:0)
/usr/bin/time -f "%M"
测量最大的RSS(驻留集大小),这是RAM中但未换出的进程所使用的内存。该内存包括堆,堆栈,数据段等。
这将单独测量子进程(包括子孙)的最大RSS(而不是子RSS总数的最大值)。
valgrind --tool=massif
,如文档所述:
仅测量堆内存,即使用malloc,calloc,realloc,memalign,new,new []和其他一些类似函数分配的内存。这意味着它不会直接测量通过低级系统调用(例如mmap,mremap和brk)分配的内存。
这仅测量孩子(而不是孙子)中的记忆。 这不会测量堆栈,也不会测量文本和数据段。
(诸如--pages-as-heap=yes
和--stacks=yes
之类的选项可以进行更多测量)
所以您的情况是:
time
不考虑孙子孙,而valgrind
不考虑孙子time
不能衡量换出的内存,而valgrind
可以衡量time
测量堆栈和数据段,而valgrind
不测量您现在应该:
valgrind --tool=massif --stacks=yes
进行分析以检查堆栈valgrind --tool=massif --pages-as-heap=yes
进行性能分析,以检查其余的内存使用情况