[英]Finding a Perl memory leak
已解决,请参阅编辑2
你好,
我一直在编写一个Perl程序来处理本地(专有)程序的自动升级(对于我工作的公司)。
基本上,它通过cron运行,不幸的是有内存泄漏(或类似的东西)。 问题是泄漏只发生在我不看的时候(也就是说当通过cron运行时,而不是通过命令行)。
我的代码不包含任何循环(或其他)引用,因此常用的工具对我Devel::Cycle
( Devel::Cycle
, Devel::Peek
)。
我怎样才能找出内核杀死内存的内存是多少呢 ?
基本上,代码SFTP进入服务器(使用```sftp ...```),调用OpenSSL来验证文件,然后在需要更多文件时更多SFTP并安装它们(解压它们)。
在第一次SFTP会议之前我已经看到了延迟(约15秒),但它从来没有使用太多的内存来杀死(在我面前)。
如果我不能解决这个问题,我需要用不同的语言重写,这将花费宝贵的时间。
编辑:内核打印出以下消息,这使我相信它是内存泄漏:
[100023.123] Out of memory: kill process 9568 (update.pl) score 325406 or a child
[100023.123] Killed Process 9568 (update.pl)
我不相信这是cron的问题,因为在通过命令行运行它时会停止(有时约为15秒)。 此外,没有使用环境变量(至少通过我所写的内容,可能是潜在的事情吗?)
编辑2:我自己找到了这个问题,在mobrule的下面评论的帮助下(回答这个问题)。 事实证明,脚本每天只从用户的crontab(非root用户)调用一次,并且(非root权限)导致特殊的无限循环情况。
对不起伙计们,我觉得以前没有找到这个有点傻,但谢谢。
mobrule,如果你提交你的评论作为答案,我会接受它,因为它导致我发现问题。
结束编辑
谢谢,Brian
PS我可以发布小代码片段,但不是由于公司政策而发布的全部内容。
您可以尝试使用Devel :: Size来分析您的一些对象。 例如在main::
scope(.pl文件本身)中,执行以下操作:
use Devel::Size qw(total_size);
foreach my $varname (qw(varname1 varname2 ))
{
print "size used for variable $varname: " . total_size($$varname) . "\n";
}
将实际使用的大小与您认为每个对象的合理值进行比较。 可能会立即弹出一些可疑的东西(例如,一个听起来很合理的任何东西都会大量膨胀)。
其他尝试:
如果它是由cron运行的,那迭代后不应该死掉吗? 如果是这种情况,我很难看到内存泄漏将是一个大问题...
您确定它是脚本本身,而不是使用内存的子进程吗? 也许它最终会创建一个真正的ssh会话,而不是在一个会话中做一堆东西?
你怎么知道这是内存泄漏? 我可以想到操作系统会杀死一个程序的许多其他原因。
我要问的第一个问题是“这个程序是否始终在命令行中正常工作?”。 如果答案是“否”,那么我先解决这些问题。
另一方面,如果答案为“是”,我将研究在cron和命令行下执行程序之间的所有区别,以找出它为什么行为不端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.