加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

从Perl“Out of memory”错误获取堆栈跟踪

发布时间:2020-12-16 06:25:00 所属栏目:大数据 来源:网络整理
导读: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,…)
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)不知何故,进程会持续监视自己的内存,并在内存变高但“内存不足”错误之前转储堆栈跟踪.

谢谢!

乔恩

解决方法

您可以尝试使用LD_PRELOAD加载malloc / free的自定义版本.没有必要重新链接或重新编译任何东西.只需将LD_PRELOAD设置为具有与malloc相同的接口的.so,并且在运行可执行文件时将加载此预加载版本的malloc而不是正常的系统malloc.例如,这是使用 efence检测内存错误的常用策略.

我不认为efence会在这里对你有用,因为它是用于检测内存覆盖,而不是调试内存不足(我不知道它在OOM上做了什么).我想你可能想要查看failmalloc.我从未使用过这个,但听起来它可能会做你想要的(我只是浏览了头版).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读