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) Как-топроцесс непрерывно контролирует собственную память и выводит трассировку стека, когда объем памяти увеличивается, но до появления ошибки «Недостаточно памяти».
Спасибо!
Джон