2011-11-27 45 views
2

我有一個應用程序,我一直試圖讓「內存泄漏免費」,我已經通過在Linux上使用Totalview的MemoryScape的堅實的測試,沒有發現泄漏。我已經將應用程序移植到Solaris(SPARC),並且有一個漏洞,我試圖找到...LIBUMEM說沒有內存泄漏,但Solaris上的PRSTAT顯示泄漏?

我已經在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 
> 

的「7個超大漏水,851968個字節」如果我通過應用程序或10000個發送郵件10封郵件永遠不會改變......它始終是「7 oversi zed泄漏,851968字節「。這是否意味着應用程序不會根據「libumem」泄漏?

令人沮喪的是,在Linux上內存保持不變,從不改變......但在Solaris上,我看到這種緩慢但穩定的增長。

任何想法這是什麼意思?我正確使用libumem嗎?什麼可能導致PRSTAT在這裏顯示記憶力增長?

對此的任何幫助將不勝感激....感謝百萬。

+0

我想這將是有益的:HTTP://theunixshell.blogspot.com/2013/11/finding-memory-leaks-on-solaris-is-no.html – Vijay

回答

2

如果SIZE列不增長,則表示沒有泄漏。

RSS(常駐套裝尺寸)是多少內存積極使用,這是正常的值隨時間變化。如果您泄漏,SIZE會隨着時間的推移而增長(並且RSS可能保持不變,甚至縮小)。

+0

感謝info,但是大小確實從44mb增長到了48mb,儘管libumem說沒有持續泄漏?並且在Linux上沒有泄漏......很奇怪 –

+0

讓它更長。有些東西並不完全在您的控制之下,可能會在您的應用程序(例如套接字/管道使用的I/O緩衝區)上收費,直到您第一次實際使用它們時,它們可能不會「可見」。在應用程序「啓動」期間(即開始實際開始工作時)有幾個兆字節的增長並不是一個擔憂,如果它很快就會變平。監視它更長的時間。 – Mat

+0

太好了,我會檢查一下,明天再報告給你......再次感謝......--) –

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進程內存佔用不會逐漸增加,相反,當它需要額外的內存並將其用於長期運行時,似乎會佔用大塊內存。 (純粹基於觀察,沒有對其內存分配機制進行任何研究)。所以你應該發送更多的數據(10K信息並不大)。
  3. 您可以嘗試dtrace工具來檢查solaris上的內存問題。

傑克