使用while(1)的perl脚本中的内存泄漏

时间:2012-06-21 11:26:35

标签: perl memory memory-leaks

大师。

我有一个perl脚本需要在无限循环中运行并监视我的gnu / linux的平均负载和免费ram,如果load / 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本身。有人可以指点我如何解决这个问题。感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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连接,即使你不打算发送消息。一旦你通过使用一些子程序使主循环变小,就更容易确定了。