LIBUMEM说没有内存泄漏,但Solaris上的PRSTAT显示泄漏?

时间:2011-11-27 17:54:20

标签: c memory-leaks solaris libumem

我有一个应用程序,我一直试图让“内存泄漏”,我已经通过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在这里显示内存增长?

对此的任何帮助都将非常感谢....感谢一百万。

2 个答案:

答案 0 :(得分:2)

如果SIZE列没有增长,则表示您没有泄漏。

RSS(驻留集大小)是主动使用的内存量,这个值随时间变化是正常的。如果您泄漏,SIZE会随着时间的推移而增长(RSS可以保持不变,甚至缩小。)

答案 1 :(得分:1)

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