Perl スクリプトをサーバー上で安定して実行できません。これが問題です。
スクリプトが 1 秒間に 5 回以上アクセスされると、サーバーがフリーズします。そしてしばらくすると、サーバーが永久にハングします。SSH が応答しないため、サーバーを再起動する必要があります。
でApacheを使用していmod_perl
ます。
スクリプトは、Ubuntu の下の仮想専用サーバーでホストされます。SSHで操作しています。これらはサーバー パラメータです CPU: 400 MHz RAM: 256 MB
スクリプトの最大実行時間は 200 ミリ秒です。
「top」ユーティリティを使用してサーバーの負荷を監視しました。問題は表示されません。これは、1 秒あたり 5 つのスクリプトのロード中の CPU 統計です。
CPU: 12.1%us、0.6%sy、0.0%ni、0.0%id、0.0%wa、0.0%hi、0.0%si、87.2%st
スクリプトを問題なく動作させるために必要なオプションは何ですか?
これは、ps aux | fgrep perl
ロードの瞬間の結果です。
ps補助 | fgrep パール www データ 2925 0.3 6.5 45520 17064 ? R 17:00 0:01 /var/www/perl/loa -k start www データ 2926 0.2 6.5 45520 17068 ? R 17:00 0:01 /var/www/perl/loa -k start www データ 2927 0.4 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k start www データ 2928 0.3 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k start www データ 2929 0.2 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k start www データ 2931 0.4 6.5 45740 17076 ? R 17:00 0:01 /var/www/perl/loa -k start root 2968 0.0 0.2 3196 656 ポイント/0 R+ 17:06 0:00 fgrep perl
アップデート
ボトルネックを発見しました。コードの周りでDateTimeモジュールを何度も使用しています。次の DateTime モジュール メソッドは非常に遅いようです。
- 新着()
- 今()
- 設定(...)
- デルタ_ミリ秒(...)
それらを高速なアナログに置き換えます。
もう一つの懸念。mod_perl インスタンスは大量のメモリを消費します。そして、私には理由がわかりません。モジュールをインポートしない単純な perl スクリプトを実行しようとしました。Apacheの再起動直後に実行します。スクリプトは 37M のメモリを必要とします。なぜそれが起こるのですか?mod_perl が余分なメモリを使用しないようにする方法を知っていますか?
mod_perl をサポートしない通常の perl スクリプトは、3 ~ 5M のメモリを必要とします。
みんな、本当に助けてくれてありがとう、こんなに素晴らしい反応を期待していなかった!
更新 2
もう1つの事実を見つけました。5 秒間待機するだけの単純な perl スクリプトを作成しました。
#!/usr/bin/perl
use CGI;
my $query= new CGI;
my $content = "5 second delay...\n";
$query->header(
'-Content-type' => "text/plain",
'-Content-Length' => length($content)
);
print $content;
sleep(5);
次に、これらのスクリプトを同時に多数生成します。トップ ユーティリティのステルス時間 (st) は 0% から 80% に跳ね上がり、スクリプトが完了するまで高いままです。
この負荷はどこから来るのですか?
また、すでに述べたように、各 perl インスタンスは 36M のメモリを必要とします。