tl; dr:当Perl httpd进程耗尽内存时,如何转储perl堆栈跟踪.
我们有一个mod_perl 2服务器,Perl 5.8.8,RHEL 5.6,Linux 2.6.18.
偶然且不可预测的是,子httpd进程开始以惊人的速度耗尽所有可用内存.我们至少使用过BSD :: Resource :: setrlimit(RLIMIT_VMEM,…),因此在关闭服务器之前,进程会因“Out of memory”而死亡.
我们不知道代码在哪里发生,并且很难在没有数小时负载测试的情况下重现.
我们真正喜欢的是在进程耗尽内存之前获取Perl堆栈跟踪的方法,因此我们知道导致此问题的代码.不幸的是,“Out of memory”是一个untrappable error.
以下是我正在考虑的选项,每个选项都有其缺点:
1)使用$^M emergency memory pool.要求我们使用-DPERL_EMERGENCY_SBRK和-Dusemymalloc重新编译perl.
2)放入大量日志语句,然后分析日志以查看进程停止的位置.
3)编写一个不断扫描httpd进程池的外部脚本,如果它看到一个使用大量内存的脚本,则向它发送一个USR2信号(我们已安排转储堆栈跟踪).
4)不知何故,进程会持续监视自己的内存,并在内存变高但“内存不足”错误之前转储堆栈跟踪.
谢谢!
乔恩