以下dtrace脚本将给出进程已执行的所有分配的总和:
pid$target::malloc:entry { @ = sum(arg0); }
现在,我对这个过程的生命周期内的最大总分配内存使用量感兴趣(大约50毫秒)。如何生成总分配内存使用量(所有mallocs的总和减去所有释放的总和)的时间图,或者仅生成其最大值。我已经尝试手动跟踪所有已分配的内存块,但超出了dtrace关联数组大小限制。
答案 0 :(得分:1)
首先,您的dtrace脚本将为您提供最大内存利用率的上限,因为您不跟踪free
以及malloc
s。你可能不关心这个。如果你关心,因为free
没有接收或返回释放范围的大小,你可能最好跟踪brk()
系统调用返回值,这也是所有元数据的大小malloc
存储在堆上。对此的替代方法(如果您需要确切的答案)是弄清楚malloc
和free
的数据结构如何适用于您的操作系统,并深入研究DTrace中的某些指针算法以获取该信息。
其次,请注意 - 如果您使用它来实现非常快速的分配器,请记住您需要整个堆的大小(而不仅仅是{{{ 1}}返回),因为存储在内存中的值的对齐很重要,而malloc返回的范围不包括这个“死空间”。
现在,问你的问题。
您可以通过跟踪数据来随时间查看图片。每次调用malloc
后,只需使用printa(@)
打印聚合的当前值。
或者,如果您希望生成的图片中有更准确的时间轴,则可以使用@ = sum(...)
大小记录时间戳,例如malloc
。在这种情况下,聚合中的每个条目只包含一个分配大小,而不是到目前为止所有聚合的总和。
如果您更喜欢第一个解决方案但又需要准确的时间轴,请在第一个示例中致电@[walltimestamp] = sum(...)
之前trace(walltimestamp)
。
如果你没有开始使用DTrace,你总是可以使用printa(@)
(在Mac OS X上 - 对于其他平台存在相同的东西,但参数不同)来获取有关进程资源利用率的一些静态信息
/usr/bin/time -lp