0

達人。

無限ループで実行し、gnu/linux の負荷平均と空き RAM を監視し、負荷/RAM が設定値を上回っている/下回っている場合は Google のアカウントを使用してメールを送信する必要がある perl スクリプトがあります。

私はこれらを見つけました

Perl スクリプトのメモリ使用量

長時間実行されている Perl プログラムでメモリ リークを見つけるにはどうすればよいですか?

undef を使用するように提案されていますが、クリア/解放されないものがある可能性が高いため、それは役に立たないようです。

これは、メモリ使用量が常に増加しており、1 日後にかなりの RAM を割り当てることができるサンプルです。

これが perl スクリプトそのものです。誰かがこれを修正する方法についてどこかを教えてもらえますか。ありがとう。

4

2 に答える 2

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接続を作成しているように見えます。いくつかのサブルーチンを使用してメインループを小さくしたら、確認するのが簡単になります。

于 2012-06-21T12:09:42.303 に答える
1

リークは、モジュールの XS 部分に隠れている可能性があります。Perl部分に漏れはないようです。外部モジュールを 1 つずつ取り外して、漏れが止まるタイミングを確認できます。

とにかく、それは十分に小さく見え、反復間で永続的なデータはありません. 常にメモリに保持するのではなく、毎分実行するようにcronに配置してみませんか?

于 2012-06-21T11:32:46.503 に答える