【问题标题】:How does /usr/bin/time measure memory usage?/usr/bin/time 如何测量内存使用情况?
【发布时间】:2013-10-29 22:22:08
【问题描述】:

我正在实现一个算法,并想测量它的时间和内存消耗。为了帮助我,我编写了自己的测量实用程序,它从/proc/[pid]/stat 读取用户和系统消耗的时间量,以及虚拟内存和驻留集的峰值大小。 (我不是 100% 清楚这两个内存统计数据之间的区别,但这不是手头的问题。)

到目前为止一切顺利,但随之而来的是一个第三方实现,我希望与我自己的程序进行比较。由于我不想摆弄它的来源,我无法使用我自己的测量程序来收集有关其效率的数据(我也许可以,但这需要我重新考虑我的测量方案)。所以我发现/usr/bin/time也采取了这些措施。

当我比较输出时,我发现/usr/bin/time 确实报告了与我自己的工具相同的时间使用情况,但内存数据却大不相同。首先,/usr/bin/time 没有报告任何关于虚拟内存使用的信息,它只提供了关于最大驻留集大小的帖子。其次,/usr/bin/time 报告的驻留集大小大约是我自己测量的六到八倍。

所以,我一直试图找出/usr/bin/time 实际如何进行测量,以及为什么差异如此根本。另外,哪个是正确的值?

输出示例(单位为 MB):

<program>: <virtual mem> <resident set size>
autotest (my own utility): 23.2266 2.19531
/usr/bin/time: N/A 11.23437

我正在使用 GNU/Linux 3.8.13 Mageia 3 x86_64。

编辑:为了增强信心,我发现 KDE 系统监视器支持我自己的实用程序报告的数据。事实上,它和我从同一个地方获取信息。所以信任来自/proc/[pid]/stat 的数据应该是相当安全的。但问题仍然存在......

EDIT2:根据下面的答案,推断wait3() 是GNU time 使用的命令。它以手册页 getrusage(2) 中描述的形式返回数据。在 RSS 上,它说:

这是使用的最大驻留集大小(以千字节为单位)。

手册页还提到了proc/[pid]/stat,上面写着

驻留集大小:进程在实际内存中的页数。这只是计入文本、数据或堆栈空间的页面。这不包括未按需加载或已换出的页面。

那么,第二个版本是否更准确地测量我的程序的内存使用情况,而第一个版本也测量某种外部库使用情况?

【问题讨论】:

  • 为什么不阅读它的源代码?
  • 你看过这个答案了吗:*.com/questions/774556/…
  • (上一条评论不正确。)哦。呃。没想到。这样做表明它执行wait3()
  • @Paul:是的,它似乎没有衡量总体峰值使用量,这正是我想知道的。
  • 定义内存使用的含义。问题是有几种不同的可能定义:例如,您是否计算mmapped 文件中的内存。地址空间?在执行期间的任何时候换入的总金额?在任何给定时间换入的最大金额?整个程序映像,包括从未交换过的数据?

标签: c++ linux time


【解决方案1】:

我没有检查time 的来源。但是有wait3wait4函数可以获取子进程的rusage

pid_t wait3(int *status, int options, struct rusage *rusage);
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);

struct rusage 包含最大驻留集大小值。

手册页 getrusage(2) 描述了struct rusage

【讨论】:

  • 对。我确实检查了源代码,它确实调用了wait3()
  • 我用这个信息编辑了 OP。我仍然不明白为什么这些数字差异如此之大。
【解决方案2】:

我查看了源代码(很短)。它使用getrusage()

【讨论】: