3

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

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

4

1 回答 1

3

/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以检查其余的内存使用情况
于 2019-09-25T20:31:06.383 回答