大师。
我有一个 perl 脚本,它需要在无限循环中运行并监视我的 gnu/linux 的平均负载和空闲 ram,如果负载/ram 高于/低于设置的值,则使用 google 的帐户发送电子邮件。
我找到了这些
并按照建议使用 undef ,但这似乎没有帮助,因为很可能我有一些永远不会被清除/释放的东西。
这是内存使用量如何不断增加的示例,并且在一天后它可以分配相当多的内存。
这是 perl 脚本本身。有人可以指出我如何解决这个问题。谢谢。
大师。
我有一个 perl 脚本,它需要在无限循环中运行并监视我的 gnu/linux 的平均负载和空闲 ram,如果负载/ram 高于/低于设置的值,则使用 google 的帐户发送电子邮件。
我找到了这些
并按照建议使用 undef ,但这似乎没有帮助,因为很可能我有一些永远不会被清除/释放的东西。
这是内存使用量如何不断增加的示例,并且在一天后它可以分配相当多的内存。
这是 perl 脚本本身。有人可以指出我如何解决这个问题。谢谢。
泄漏可能隐藏在模块的 XS 部分中。Perl 部分似乎没有泄漏。您可以尝试将外部模块一个一个移除,并检查泄漏何时停止。
无论如何,它看起来足够小,并且在迭代之间没有任何持久数据。为什么不把它放在 cron 上每分钟运行一次,而不是一直保存在内存中呢?
除了使用 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 连接。一旦通过使用一些子例程使主循环变小,就更容易确定。