如何使用dtrace确定进程的最大内存使用量

时间:2013-04-03 10:57:19

标签: dtrace

以下dtrace脚本将给出进程已执行的所有分配的总和:

pid$target::malloc:entry { @ = sum(arg0); }

现在,我对这个过程的生命周期内的最大总分配内存使用量感兴趣(大约50毫秒)。如何生成总分配内存使用量(所有mallocs的总和减去所有释放的总和)的时间图,或者仅生成其最大值。我已经尝试手动跟踪所有已分配的内存块,但超出了dtrace关联数组大小限制。

1 个答案:

答案 0 :(得分:1)

首先,您的dtrace脚本将为您提供最大内存利用率的上限,因为您不跟踪free以及malloc s。你可能不关心这个。如果你关心,因为free没有接收或返回释放范围的大小,你可能最好跟踪brk()系统调用返回值,这也是所有元数据的大小malloc存储在堆上。对此的替代方法(如果您需要确切的答案)是弄清楚mallocfree的数据结构如何适用于您的操作系统,并深入研究DTrace中的某些指针算法以获取该信息。

其次,请注意 - 如果您使用它来实现非常快速的分配器,请记住您需要整个堆的大小(而不仅仅是{{{ 1}}返回),因为存储在内存中的值的对齐很重要,而malloc返回的范围不包括这个“死空间”。

现在,问你的问题。

  1. 您可以通过跟踪数据来随时间查看图片。每次调用malloc后,只需使用printa(@)打印聚合的当前值。

  2. 或者,如果您希望生成的图片中有更准确的时间轴,则可以使用@ = sum(...)大小记录时间戳,例如malloc。在这种情况下,聚合中的每个条目只包含一个分配大小,而不是到目前为止所有聚合的总和。

  3. 如果您更喜欢第一个解决方案但又需要准确的时间轴,请在第一个示例中致电@[walltimestamp] = sum(...)之前trace(walltimestamp)

  4. 如果你没有开始使用DTrace,你总是可以使用printa(@)(在Mac OS X上 - 对于其他平台存在相同的东西,但参数不同)来获取有关进程资源利用率的一些静态信息

    /usr/bin/time -lp