【问题标题】:What is the difference between 'time -f "%M"' and 'valgrind --tool=massif'?'time -f "%M"' 和 'valgrind --tool=massif' 有什么区别?
【发布时间】:2020-01-18 07:07:52
【问题描述】:

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

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

【问题讨论】:

  • 啊,它是 KB 吗?有趣的。但我还是想知道为什么数字如此不同。
  • 是的,它以 KB 为单位。 command 是否产生任何进程或线程?试试valgrind --trace-children=yes
  • “堆”和“常驻内存”是一样的吗?因为据我了解地块测量“堆”,而时间测量“常驻内存”
  • 驻留内存包括堆,也包括栈。

标签: memory valgrind massif


【解决方案1】:

/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 进行分析以检查剩余的内存使用情况

【讨论】:

  • 谢谢! (+50)- 我会检查这个(可能下周),可能会带着问题回来(或直接接受答案:-))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2014-01-22
  • 2013-02-09
  • 2013-01-16
相关资源
最近更新 更多