「メモリ リークをなくす」ことを試みているアプリケーションがあります。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
>
「7 つの特大リーク、851968 バイト」は、アプリケーションを介して 10 メッセージまたは 10000 メッセージを送信しても変化しません...常に「7 つの特大リーク、851968 バイト」です。それは「libumem」によるとアプリケーションがリークしていないということですか?
非常に苛立たしいのは、Linux ではメモリが一定のままであり、決して変化しないことです....しかし、Solaris では、このゆっくりとした、しかし着実な成長が見られます。
これが何を意味するか分かりますか?libumem を正しく使用していますか? ここで PRSTAT がメモリの増加を示している原因は何ですか?
これに関するどんな助けも大歓迎です....百万に感謝します。