gpt4 book ai didi

perl - 发现 Perl 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 12:01:45 30 4
gpt4 key购买 nike

已解决见编辑 2

你好,

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

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

我的代码不包含任何循环(或其他)引用,因此常用的工具对我没有帮助( Devel::CycleDevel::Peek )。

我将如何弄清楚 使用这么多内存的原因是什么?内核杀死它 ?

基本上,代码 SFTP 进入服务器(使用 ```sftp...` `),调用 OpenSSL 来验证文件,然后如果需要更多文件,则 SFTP 更多,并安装它们(解压缩它们)。

我在第一个 SFTP session 之前看到了延迟(约 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 的以下评论的帮助下,我自己发现了这个问题(针对这个问题)。事实证明,该脚本每天仅从用户(非 root)的 crontab 调用一次,并且(非 root 权限)导致了特殊的无限循环情况。

对不起,伙计们,我觉得以前没有找到这个有点愚蠢,但谢谢。

mobrule,如果您提交您的评论作为答案,我会接受它,因为它会导致我发现问题。

结束编辑

谢谢,
布赖恩

附言由于公司政策,我也许可以发布一小段代码,但不能发布全部内容。

最佳答案

您可以尝试使用 Devel::Size分析您的一些对象。例如在 main::范围(.pl 文件本身),执行以下操作:

use Devel::Size qw(total_size);

foreach my $varname (qw(varname1 varname2 ))
{
print "size used for variable $varname: " . total_size($$varname) . "\n";
}

将使用的实际大小与您认为每个对象的合理值进行比较。一些可疑的东西可能会立即弹出(例如,一个非常膨胀的缓存,超出了任何听起来合理的范围)。

其他要尝试的事情:
  • 一次删除一些功能,看看情况是否突然好转;我将从使用任何外部库
  • 开始
  • 不良行为是否仅限于一台特定的机器或特定的操作系统?将程序移至其他系统以查看其行为如何变化。
  • (在单独安装中)尝试升级到最新的 Perl (5.10.1),并升级所有 CPAN 模块
  • 关于perl - 发现 Perl 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663498/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com