負荷の軽いApache HTTPD 2.0を実行しているアプリケーションで、Apacheプロセスの1つ(またはそれ以上)が100%CPUを消費するという問題が時々発生しました。現在、HTTPD 2.2を実行していますが、これも2.2で見たことがあるかもしれません。よくわかりません。場合によっては、CPU使用率が原因で、HTTPDをホストしているWindowsサーバーへのコンソールアクセスを除くすべてがブロックされました。 Apacheがこれを行う原因を突き止めることはできませんでした。
環境は、mod_rewriteを使用して静的コンテンツを直接提供するApache HTTPDですが、それ以外のカスタム構成はほとんどありません。 HTTPDはmod_jk
(1.2.25)を介してApache Tomcat(5.x)と通信しています。
他の誰かがこれに遭遇して解決しましたか?インストールした回避策は、次の構成で、各Apache HTTPDサブプロセスをリクエストの最大数に制限することです。
MaxRequestsPerChild 1000
アプリケーションはHTTP/1.1を使用するため、これは実際には子プロセスごとに1000を超えるリクエストであり、子プロセスごとに100,000リクエストに近いものです。
ロックアップは、Apache自体ではなくモジュールで発生している可能性が高いです。あなたの設定はかなり最小限に聞こえるので、私は疑うだろうmod_jk
を犯人として。 MaxRequestsPerChild
を制限することで問題が解決した場合、それは許容できる回避策です。モジュールのバグがトリガーされるのは、長い時間または多くのリクエストがあった後である可能性があります。これを追跡することに本当に熱心でない限り、おそらくそれで十分です。
それを追跡したい場合、最初に行うことは、サーバーユーザーが書き込み可能な場所を指すようにCoreDumpDirectory
を構成することです。問題のプロセスにコアファイルを残してもらうことができる場合は、問題の原因を追跡するのに役立ちます。 Apache Debugging Guide でこれを行うためのいくつかのヒントを見つけることができます。
私がこれを見てきたのは、次の理由によります。-ホストされているアプリまたはスクリプトが問題の原因です。たとえば、無限ループまたは何かがある-ロックまたはその他の問題が原因でOSが不安定になり、再起動すると問題が一時的に解決した。
私の提案:-マシンを再起動します。 -待って、これが再び発生するかどうかを確認してください-modなどを使用せずにサーバーを再起動します。 -各modを1つずつオンにし、毎回使用法を観察します。
apache用のmod_proctitleをインストールする
実際には、これは存在しないログディレクトリがある場合に発生します。なぜそれがうまく処理されないのかはわかりませんが、すべてのログディレクトリが存在し、プロセスがそれらに書き込むことができることを確認したい場合があります。
Apacheコードのすべての部分でチェックが行われるわけではないため、RLimitCPUが常に役立つとは限りません。
MaxRequestsPerChildも役に立たない可能性があります。これは、比較的「新鮮な」子でこれを確認したためです。
私の場合、それは私たちが使用しているモジュール(mod_Perl)と関係があるのではないかと思います。おそらくソケット接続が壊れています。この問題は、接続しているブラウザーでのみ発生するようで、wgetやcurl(「データ配信」に頻繁に使用されます)からではありません。
MaxRequestsPerChildを制限することはメモリの使用に役立ちますが、あなたが話している方法でCPUに影響を与えるべきではありません。起こっている可能性が高いのは、mod_jkがクラッシュしていて、それがApacheモジュールであるため、httpdプロセスの下に表示されることです。