さまざまな Perl スクリプト (サーバー サイド インクルード) が、Web サイト上の多くの機能を備えた Perl モジュールを呼び出しています。 編集: スクリプトはuse libを使用して、フォルダーからライブラリを参照しています。繁忙期には、スクリプト (ライブラリーではない) がゾンビになり、サーバーに過負荷がかかります。
サーバーには次のリストが表示されます。
319 ? Z 0:00 [scriptname1.pl] <defunct>
320 ? Z 0:00 [scriptname2.pl] <defunct>
321 ? Z 0:00 [scriptname3.pl] <defunct>
私はそれぞれ何百ものインスタンスを持っています。
編集: SSI ディレクティブを除いて、fork、system、または exec を使用していません。
<!--#exec cgi="/cgi-bin/scriptname.pl"-->
私の知る限り、この場合、httpd 自体がプロセスの所有者になります。MaxRequestPerChild が 0 に設定されているため、子プロセスが終了する前に親プロセスが終了することはありません。
これまでのところ、一部のスクリプトを一時的に中断することで、サーバーが機能していないプロセスに対処し、倒壊するのを防ぐことができると考えていましたが、ゾンビ プロセスがまだ形成されていることは疑いの余地がありません。どうやらgbaconは、サーバーが負荷に対処できないという彼の理論に最も近いようです。
httpd がこれらのプロセスを放棄する原因は何ですか? これらの発生を防ぐためのベストプラクティスはありますか?
ありがとう
回答: ポイントはロブに行きます。彼が言うように、SSI を生成する CGI スクリプトはそれらの SSI を処理しません。SSI の評価は、Apache 1.3 要求サイクルで CGI を実行する前に行われます。これは Apache 2.0 以降で修正され、CGI が SSI コマンドを生成できるようになりました。
Apache 1.3 で実行していたため、ページ ビューごとに SSI が無効なプロセスに変わりました。サーバーはそれらをクリアしようとしましたが、実行中のタスクで忙しすぎて成功できませんでした。その結果、サーバーがダウンし、応答しなくなりました。短期的な解決策として、すべての SSI を見直し、一部のプロセスをクライアント側に移動して、サーバー リソースを解放し、クリーンアップする時間を確保しました。その後、Apache 2.2 にアップグレードしました。