Получение трассировки стека из Perl «Недостаточно памяти ”Error

tl; dr: Как выгрузить трассировку стека Perl, когда процессу Perl httpd не хватает памяти.

У нас есть сервер mod_perl 2, Perl 5.8.8 , RHEL 5.6, Linux 2.6.18.

Очень редко и непредсказуемо дочерний процесс httpd начинает использовать всю доступную память с угрожающей скоростью. Мы, по крайней мере, использовали BSD :: Resource :: setrlimit (RLIMIT_VMEM, ...), так что процесс завершается с сообщением «Недостаточно памяти» перед отключением сервера.

Мы не знаем, где в коде это происходит, и его трудно воспроизвести без часов нагрузочного тестирования.

Что нам действительно нужно, так это способ получить трассировку стека Perl непосредственно перед тем, как процессу исчерпается память, поэтому мы знать, какой код вызывает это. К сожалению, «Недостаточно памяти» - это непреодолимая ошибка .

Вот варианты, которые я рассматриваю, каждый со своими недостатками:

1) Используйте аварийную память $ ^ M бассейн . Требует, чтобы мы перекомпилировали Perl с -DPERL_EMERGENCY_SBRK и -Dusemymalloc.

2) Вставьте тонны операторов журнала, затем проанализируйте журналы, чтобы увидеть, где процесс останавливается.

3) Напишите внешний скрипт, который постоянно сканирует файлы. пул процессов httpd, и если он видит, что один из них использует много памяти, отправляет ему сигнал USR2 (который мы организовали для сброса трассировки стека).

4) Каким-то образом заставить процесс постоянно контролировать свою собственную память, и выгрузить трассировку стека при заполнении памяти, но до ошибки «Недостаточно памяти».

Спасибо!

Джон

5
задан Jonathan Swartz 14 June 2011 в 18:20
поделиться