LIBUMEM говорит, что нет утечек памяти, но PRSTAT на Solaris показывает утечки?
У меня есть приложение, которое я пытался получить "без утечек памяти", я прошел тщательное тестирование на Linux, используя TotalView MemoryScape, и утечек не обнаружено. Я перенес приложение в Solaris (SPARC), и я пытаюсь найти утечку...
Я использовал "LIBUMEM" на Solaris, и мне кажется, что он не обнаруживает утечек...
Вот моя команда запуска:
LD_PRELOAD=libumem.so UMEM_DEBUG=audit ./link_outbound config.ini
Затем я немедленно проверил PRSTAT в Solaris, чтобы увидеть, как использовалась память при запуске:
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 МБ памяти, как показано ниже:
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 показывает рост памяти?
Любая помощь по этому вопросу будет принята с благодарностью.... спасибо миллион.
2 ответа
Если SIZE
колонка не растет, вы не протекаете.
RSS
(размер резидентного набора) - это объем памяти, который вы активно используете, обычно это значение меняется со временем. Если бы вы протекали, SIZE
будет расти со временем (и RSS
может остаться постоянным или даже сжаться).
- проверить эту страницу. предпочтительный вариант
UMEM_DEBUG=default, UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1.
это опции, которые я использую для устранения проблемы утечки памяти в Solaris, и она прекрасно работает для меня. - основываясь на моем опыте с
RedHat REL version 5
и солярисSunOS 5.9/5.10
Объем памяти процесса linux не увеличивается постепенно, вместо этого кажется, что он захватывает большую порцию памяти, когда ему требуется дополнительная память, и использует их в течение длительного времени. (чисто на основе наблюдений, не проводил никаких исследований механизма распределения памяти). поэтому вы должны отправить гораздо больше данных (10K сообщений невелики). - ты можешь попробовать
dtrace
инструмент для проверки проблем с памятью в солярисе.
Джек