2

我有一个应用程序,我一直试图让“无内存泄漏”,我已经使用 Totalview 的 MemoryScape 在 Linux 上进行了可靠的测试,没有发现泄漏。我已将应用程序移植到 Solaris (SPARC) 并且我试图找到一个泄漏...

我在 Solaris 上使用过“LIBUMEM”,在我看来它也没有泄漏......

这是我的启动命令:

LD_PRELOAD=libumem.so UMEM_DEBUG=audit ./link_outbound config.ini

然后我立即检查了 Solaris 上的 PRSTAT 以查看启动内存使用情况:

PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       
  9471 root       44M   25M sleep   59    0   0:00:00 1.1% link_outbou/3

然后我开始向应用程序发送数千条消息……随着时间的推移,PRSTAT 增长了……

PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       
  9471 root       48M   29M sleep   59    0   0:00:36 3.5% link_outbou/3

就在我最终停止它之前:

PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP       
  9471 root       48M   48M sleep   59    0   0:01:05 5.3% link_outbou/3

现在有趣的部分是当我在这个应用程序上使用 LIBUMEM 时,它显示 48 MB 内存,如下所示:

pgrep link
9471
# gcore 9471
gcore: core.9471 dumped
# mdb core.9471
Loading modules: [ libumem.so.1 libc.so.1 ld.so.1 ]
> ::findleaks
BYTES             LEAKED         VMEM_SEG CALLER
131072                 7 ffffffff79f00000 MMAP
57344                  1 ffffffff7d672000 MMAP
24576                  1 ffffffff7acf0000 MMAP
458752                 1 ffffffff7ac80000 MMAP
24576                  1 ffffffff7a320000 MMAP
131072                 1 ffffffff7a300000 MMAP
24576                  1 ffffffff79f20000 MMAP
------------------------------------------------------------------------
           Total       7 oversized leaks, 851968 bytes

CACHE             LEAKED           BUFCTL CALLER
----------------------------------------------------------------------
           Total       0 buffers, 0 bytes
> 

如果我通过应用程序发送 10 条消息或 10000 条消息,“7 个超大泄漏,851968 字节”永远不会改变......它始终是“7 个超大泄漏,851968 字节”。这是否意味着应用程序没有根据“libumem”泄漏?

令人沮丧的是,在 Linux 上,内存保持不变,从不改变……但在 Solaris 上,我看到了这种缓慢但稳定的增长。

知道这意味着什么吗?我正确使用 libumem 吗?什么可能导致 PRSTAT 在这里显示内存增长?

对此的任何帮助将不胜感激......感谢一百万。

4

2 回答 2

2

如果该SIZE列没有增长,则说明您没有泄漏。

RSS(驻留集大小)是您正在积极使用的内存量,该值随时间变化是正常的。如果您泄漏,SIZE会随着时间的推移而增长(并且RSS可能保持不变,甚至缩小)。

于 2011-11-27T18:37:04.270 回答
1
  1. 看看这个页面。首选选项是UMEM_DEBUG=default, UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1.我用于调试 solaris 内存泄漏问题的选项,它对我来说很好用。
  2. 根据我对RedHat REL version 5和 solaris的经验SunOS 5.9/5.10,linux 进程内存占用不会逐渐增加,相反,当它需要额外内存并长期使用它们时,它似乎会抓取大块内存。(纯基于观察,尚未对其内存分配机制进行任何研究)。所以你应该发送更多数据(10K 消息并不大)。
  3. 您可以尝试dtrace在 solaris 上检查内存问题的工具。

杰克

于 2011-12-29T21:16:23.880 回答