tl; dr:如何在Perl httpd进程内存不足时转储perl堆栈跟踪。从Perl获取堆栈跟踪“内存不足”错误
我们有一个mod_perl 2服务器,Perl 5.8.8,RHEL 5.6,Linux 2.6.18。
偶尔和不可预知的是,子httpd进程开始以惊人的速度使用所有可用内存。我们至少使用了BSD :: Resource :: setrlimit(RLIMIT_VMEM,...),这样在关闭服务器之前,进程就会因“内存不足”而死亡。
我们不知道在代码中发生了什么,并且在没有负载测试小时的情况下很难重现。
我们真正想要的是一种在进程内存耗尽之前获得Perl堆栈跟踪的方法,因此我们知道是什么代码导致了这种情况。不幸的是,“内存不足”是untrappable error。
这里是我考虑的选项,各自有各自的缺点:使用$^M emergency memory pool
1)。要求我们用-DPERL_EMERGENCY_SBRK和-Dusemymalloc重新编译perl。
2)输入大量的日志语句,然后分析日志以查看过程停止的地方。 3)编写一个不断扫描httpd进程池的外部脚本,如果它看到一个使用大量内存的脚本,则向它发送一个USR2信号(我们已经安排转储堆栈跟踪)。
4)以某种方式持续监视自己的内存,并在内存变高但在“内存不足”错误之前转储堆栈跟踪。
谢谢!
乔恩
是否可以在[Devel :: NYTProf](http://search.cpan.org/perldoc?Devel::NYTProf)下运行该进程? – 2011-06-14 18:53:14
就像我说的那样,这个问题很少发生 - 比如在一小时的负载测试之后 - 所以如果我们运行在性能分析或重度日志记录的情况下,我们将不得不收集大量的数据。另外,解决方案可以在生产环境中工作,显然,我们无法在Devel :: NYTProf下运行。 – 2011-06-14 19:07:23