找到Perl内存泄漏

解决,请参阅编辑2

你好,

我一直在编写一个Perl程序来处理本地(专有)程序的自动升级(对于我工作的公司).

基本上,它通过cron运行,不幸的是有内存泄漏(或类似的东西).问题是泄漏只发生在我不看的时候(也就是说当通过cron运行时,而不是通过命令行).

我的代码不包含任何循环(或其他)引用,因此常用的工具对我没用(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,如果你提交你的评论作为答案,我会接受它,因为它导致我发现问题.

结束编辑

谢谢,
布赖恩

附:我可以发布小代码片段,但不是由于公司政策而发布的全部内容.

解决方法

你怎么知道这是内存泄漏?我可以想到操作系统会杀死一个程序的许多其他原因.

我要问的第一个问题是“这个程序是否始终在命令行中正常工作?”.如果答案是“否”,那么我先解决这些问题.

另一方面,如果答案是“是”,我会调查在cron和命令行下执行程序之间的所有区别,以找出它为什么行为不端.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...