【问题标题】:memory leakage in a perl script using while(1)使用 while(1) 的 perl 脚本中的内存泄漏
【发布时间】:2012-06-23 15:02:51
【问题描述】:

大师。

我有一个 perl 脚本,它需要在无限循环中运行并监控我的 gnu/linux 的平均负载和空闲 ram,如果负载/ram 高于/低于设置的值,则使用 google 帐户发送电子邮件。

我找到了这些

Memory usage of Perl script

How can I find memory leaks in long-running Perl program?

并按照建议使用 undef,但这似乎没有帮助,因为很可能我有一些永远不会被清除/释放的东西。

here's a sample 内存使用量如何不断增加,一天后它可以分配相当多的内存。

Here's the perl script 本身。有人可以指出我如何解决这个问题。谢谢。

【问题讨论】:

    标签: perl memory memory-leaks


    【解决方案1】:

    除了使用 cron 之外,还有很多系统监控工具可以为您完成所有这些工作。

    无论如何 - 如果您按照以下方式编写一些子例程,检查内存的使用位置会更容易:

    while (1) {
      my $cpu = ...
      my $stat = ...
      if (need_to_send_msg($cpu, $stat)) { send_message($cpu,$stat) }
    }
    
    sub send_message {
      my ($cpu, $stat) = @_;
      my $msg_body = compose_message($cpu, $stat);
      transmit_message($msg_body, $from, $to);
    }
    

    这将从脚本的主体中删除一大堆变量,并让您注释掉部分子例程以查看内存的使用位置。

    哦-在我看来,即使您不打算发送消息,您也好像在不断地创建 $smtp 连接。一旦通过使用一些子例程使主循环变小,就更容易确定。

    【讨论】:

    • +1 用于 smtp 连接。我也注意到了这一点。 @ViruSzZ:这会占用时间、内存并在每次迭代中创建一个连接。为什么不只在需要时才创建它,子程序与否?
    • 是的,你是对的。我进行了重写,现在看来脚本分配的内存不超过 9mb。这是重写的样子 => pastebin.com/1JJ50btn 和相关的内存使用 => pastebin.com/fVTs1pzj 有什么技巧可以减少脚本的内存使用吗?
    • 这是您 RAM 的 1.7% 并保持稳定 - 即使您将其使用量再减少 25%,您也不会注意到。不过,我会添加更多的子例程 - 它可以更轻松地查看主循环正在做什么,并且更容易更改脚本的各个部分。
    【解决方案2】:

    泄漏可能隐藏在模块的 XS 部分中。 Perl 部分似乎没有泄漏。您可以尝试将外部模块一个一个移除,并检查泄漏何时停止。

    无论如何,它看起来足够小,并且在迭代之间没有任何持久数据。为什么不把它放在 cron 上每分钟运行一次,而不是一直保存在内存中?

    【讨论】:

    • 是的,我同意使用 cron 是最好的解决方案,但我只是在那里玩脚本 & 不确定内存泄漏是否来自 perl 部分......我是使用 Sys::Statistics::Linux;网络::SMTP::SSL;所以会尝试禁用,看看这是否是由其中任何一个引起的......谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2012-11-16
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多