'time -f“%M”'和'valgrind --tool = massif'有什么区别?

时间:2019-09-17 12:08:25

标签: memory valgrind massif

我想查看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告诉我

enter image description here

现在对于同一命令,我有3个不同的数字:

  • valgrind --tool=massif command + ms_print:22MB
  • valgrind --tool=massif command + massif-visualizer:206MB(这是我在htop中看到的,我想这是我感兴趣的东西)
  • time -f "%M" command:1.4GB

我应该看哪个号码?为什么数字完全不同?

1 个答案:

答案 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进行性能分析,以检查其余的内存使用情况