59

ある Debian マシンでトラフィックの多いアプリケーションを使用していますが、apache が異常な動作をし始めました。

apache を起動するたびに、大量の apache プロセスが生成され、アプリがまったく読み込まれず、すぐにマシン全体がフリーズし、再起動するには電源を入れ直さなければなりません。

Apacheを起動した直後にトップに表示されるものは次のとおりです。

トップ - 20:14:44 アップ 1:16、2 ユーザー、負荷平均: 0.48、0.10、0.03
タスク: 合計 330、実行中 5、睡眠 325、停止 0、ゾンビ 0
CPU: 12.0%us、21.4%sy、0.0%ni、65.7%id、0.2%wa、0.1%hi、0.7%si、0.0%st
メモリ: 合計 8179920k、使用済み 404984k、空き 7774936k、バッファ 60716k
スワップ: 合計 2097136k、使用済み 0k、空き 2097136k、キャッシュ 43424k


10251 www-data 15 0 467m 8100 4016 S 6 0.1 0:00.04 apache2
10262 www-data 15 0 467m 8092 4012 S 6 0.1 0:00.05 apache2
10360 www-data 15 0 468m 8296 4016 S 6 0.1 0:00.05 apache2
10428 www-data 15 0 468m 8272 3992 S 6 0.1 0:00.05 apache2
10241 www-data 15 0 467m 8256 4012 S 4 0.1 0:00.03 apache2
10259 www-data 15 0 467m 8092 4012 S 4 0.1 0:00.04 apache2
10274 www-data 15 0 467m 8056 4012 S 4 0.1 0:00.03 apache2
10291 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2
10293 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2
10308 www-data 15 0 468m 8296 4016 S 4 0.1 0:00.02 apache2
10317 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.02 apache2
10320 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2
10325 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2

などなど..より多くのapache2プロセスを使用します。

1 分も経たないうちに、負荷が 0.48 から 2.17 になったことがわかります。この時点で apache を停止しないと、マシンが停止するまで負荷が数分以内に上昇し続けます。

トップ - 20:15:34 アップ 1:17、2 ユーザー、負荷平均: 2.17、0.62、0.21
タスク: 合計 1850、実行中 5、睡眠中 1845、停止 0、ゾンビ 0
CPU: 0.3%us、2.1%sy、0.0%ni、96.4%id、0.0%wa、0.1%hi、1.0%si、0.0%st
メモリ: 合計 8179920k、使用済み 1938524k、空き 6241396k、バッファ 60860k
スワップ: 合計 2097136k、使用済み 0k、空き 2097136k、キャッシュ 44196k

サイトへのアクセスが許可されていることがわかっているアドレスをホワイトリストに登録するファイアウォールがあります。

問題が何であるかについてのアイデアは大歓迎です。

ありがとう!

4

6 に答える 6

42

RAM のすべてよりもはるかに多くを使用するように Apache を構成するという誤りを犯した可能性があります。これは犯しやすい間違いです。

Prefork Apache とインプロセス アプリケーション サーバー (PHP や mod_perl など) を使用していると想定しています。このモデルでは、最大 (MaxClients * プロセスごとのアプリケーションの最大メモリ使用量) のメモリが使用されることになります。それほど多くない場合は、どちらか、または両方を減らすときです。

一般的なケースでは、これは MaxClients を、サーバーが処理するのに十分な RAM を持つポイントまで減らすことを意味します。

MaxClients に通常使用されるデフォルト値 (150 が一般的) は、Prefork モデルを使用している場合、中程度のマシンでインプロセスの重いアプリケーション サーバーを実行するのには適していません (ほとんどのアプリケーション サーバーは、この使用をサポートしていないか、推奨していません)。のねじ込みモデル)。

ただし、MaxClients を減らすと、特にキープアライブがオンで、キープアライブ タイムアウトが長すぎる場合は、最終的にアプリケーションが使用できなくなります。接続を維持するだけのプロセス (サーバーステータスの状態 K) は依然として大量の RAM を使用しており、これが問題になる可能性があります。キープアライブのタイムアウトを最小限に抑えるか、完全にオフにしてください。

サーバーステータス (mod_status によって提供される) を監視する必要があります。

もちろん、結果を理解している場合にのみ、これらの変更を行う必要があります。よく考えて、設定を一度変更してください。同様の仕様の非運用マシンでシミュレートされた負荷で変更をテストする能力がある場合は、そうしてください。

于 2009-02-01T19:23:17.003 に答える
17

ps -aux | を使用します。apache が実行されているプロセスの数を確認するには、grep apache を実行します。各プロセスで使用されるメモリの推定値を示す "RSS" 列に注意してください。または、「top」を使用することもできます。この場合、shift + f を押してから %MEM 列を選択し、プロセスをメモリ使用量で並べ替えます。

プロセスの数は、apache.conf ファイルの「MaxClients」ディレクティブによって決まります。この図に到達する方法は、このページで説明されているとおりです。

  1. root としてサーバーに SSH 接続します。
  2. トップを実行します。
  3. Shift + m を押します。
  4. httpd が使用する最高の RES メモリに注意してください。
  5. トップを終了するには、Q を押します。
  6. 実行: service httpd stop (debian の場合sudo service apache2 stop)
  7. httpd が停止したら、次のコマンドを実行します: free -m
  8. 「使用済み」の下にリストされているメモリに注意してください。
  9. VPS プランの保証メモリを見つけます。保証額が見つからない場合は、サポートが保証額を教えてくれます。
  10. プランで保証されているメモリから、USED メモリを差し引きます。これにより、基本の FREE MEMORY POOL が提供されます。
  11. FREE MEMORY POOL の値に 0.8 を掛けて、平均の AVAILABLE APACHE POOL を求めます (これにより、バースト期間に 20% のメモリを予約できます)。
  12. AVAILABLE APACHE POOL を、httpd が使用する最高の RES メモリで割ります。これにより、システムに設定する必要がある MaxClients 値が得られます。(小数部がある場合は、この値より小さい最も近い整数に丸めます。)

「MaxClients」の適切な値により、Apache サーバーに適切なメモリが割り当てられます。それが私がそれを解決した方法です。

Debian では、apache conf ファイルは/etc/apache2/apache2.conf

于 2014-07-29T17:43:40.767 に答える
11

最近、構成ファイルを変更しましたか? はいの場合、差分のために古いバージョンを保持していると思いますか?

そうでない場合は、「StartServers」、「MaxSpareServers」、および「MinSpareServers」ディレクティブを検索します。通常、これらはデフォルトのままにしておく必要がありますが、意図的に高く設定されている (悪い考え) か、不適切な構成編集のために誤ってそのように設定されている可能性があります。

これで問題が解決しない場合は、Apache の外部にあるプロセスを調べて、高速で接続を開いているプロセスを探します (暴走しているテスト プロセスがある可能性があります)。

最初のステップはアクセスログです。2 番目のステップは、netstat を実行して、接続がどこから来ているかを確認することです。また、同じシステムで実行されている場合は、/proc/*/fd を調べて、接続の両端を見つけることができます。

于 2009-02-01T18:01:37.683 に答える
3

言われているように (Prefork Apache を想定) - MaxClients = 一度に最大プロセス数。

実際のトラフィック (StartServers/Min/MaxSpareServers の設定ミスではない) に悩まされている場合は、他にできることがいくつかあります。

  1. 静的コンテンツ用に個別の軽量 apache プロセス (または lighttpd) をセットアップします。そうすれば、すべての小さな静的なものが重いアプリ プロセスを「汚染」することはありません。これは、同じサーバー上または別のサーバー上にある可能性があります。関係ない。
  2. Squid のようなリバース プロキシを Apache プロセスの前に置きます。リバース プロキシは、Apache からコンテンツをすばやく吸い上げてメモリに格納し、クライアントに戻します。このようにして、14.4kb モデムの AOL ユーザーは貴重な Apache スロットの 1 つを占有しません。おまけとして、このような設定を構成してコンテンツの一部をキャッシュし、Apache プロセスの負荷を軽減することができます。
于 2009-02-25T22:40:48.607 に答える
2

「トップ」出力は、十分な空きメモリがあることを示しているため、MaxClients は問題ではないと思います (Apache が 2GB を超えるメモリを割り当てることに問題がない限り?)より多くの子を作成するのに問題があります。

ほとんどの場合、Apache プロセスは実際に多くのリソースを使用しています。PHP アプリを実行している場合は、PHP コードの最適化とキャッシュを適切に行う eAccelerator をインストールしてみてください。その他には、大量の MySQL クエリ、低速な DNS リゾルバなどが含まれる場合があります。それ以上に、どのプログラムが攻撃を受け、何を行っているかをより深く理解することができます。

于 2009-06-11T19:03:30.400 に答える