2

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

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

现在,我对进程生命周期内的最大总分配内存使用量(大约 50 毫秒)很感兴趣。如何生成随时间推移的总分配内存使用量图表(所有 malloc 的总和减去所有空闲的总和),或者只是它的最大值。我尝试手动跟踪所有分配的内存块,但超出了 dtrace 关联数组大小限制。

4

1 回答 1

1

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

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

现在,关于你的问题。

  1. 您可以通过跟踪传入的数据来获取随时间变化的图片。只需printa(@)在每次调用后打印聚合的当前值即可@ = sum(...)

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

  3. 如果您更喜欢第一个解决方案,但也想要一个准确的时间轴,就trace(walltimestamp)在您调用printa(@)第一个示例之前。

如果您不打算使用 DTrace,您始终可以使用/usr/bin/time -lp(在 Mac OS X 上 - 对于其他平台存在相同的东西,但参数不同)来获取有关进程资源利用率的一些静态信息。

% /usr/bin/time -lp 'date'
Tue Jun 25 14:14:35 PDT 2013
real         0.00
user         0.00
sys          0.00
    561152  maximum resident set size
         0  average shared memory size
         0  average unshared data size
         0  average unshared stack size
       158  page reclaims
         0  page faults
         0  swaps
         0  block input operations
         0  block output operations
         0  messages sent
         0  messages received
         0  signals received
         0  voluntary context switches
     3  involuntary context switches
于 2013-05-21T23:09:10.390 回答