web-dev-qa-db-ja.com

Apacheを起動してマシンを強制終了するときに、大量のApacheプロセスが生成されるのを防ぐにはどうすればよいですか?

私は1台のdebianマシン上で非常にトラフィックの多いアプリケーションを使用しており、Apacheは奇妙な動作を始めました。

Apacheを起動するたびに、大量のApacheプロセスが生成され、アプリはまったく読み込まれず、非常に迅速にマシン全体がフリーズし、再起動するには電源を入れ直す必要があります。

Apacheを起動した直後にtopを取得します。

 top-20:14:44 up 1:16、2 users、load average:0.48、0.10、0.03 
 Tasks:330 total、5 running、325 sleeping、0 stopped、0 zombie 
 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 
 Mem:合計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 w ww-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を停止しない場合、マシンが死ぬまで負荷は数分以内に上昇し続けます。

 top-20:15:34 up 1:17、2 users、load average:2.17、0.62、0.21 
 Tasks:1850 total、5 running、1845 sleeping、0 stopped、0 zombie 
 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 
 Mem:合計8179920k、使用済み1938524k、無料6241396k、バッファ60860k 
スワップ:合計2097136k、使用0k、無料2097136k、キャッシュ44196k 

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

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

ありがとう!

55
Adam Gries

おそらく、すべてのRAMをはるかに超えて使用するようにApacheを構成するというエラーを犯したのでしょう。これは簡単な間違いです。

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

一般的な場合、これはMaxClientsを、サーバーに対処するのに十分なRAMがあるポイントまで減らすことを意味します。

MaxClientsに一般的に使用されるデフォルト値(150が一般的)は、Preforkモデルを使用している場合、ほとんどのマシンでインプロセスのヘビーウェイトアプリケーションサーバーを実行するのに適していません(ほとんどのアプリケーションサーバーは、スレッドモデルの)。

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

サーバーの状態(mod_statusで提供)に注意する必要があります。

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

42
MarkR

ps -auxを使用します| Apacheを実行しているプロセスの数を調べるには、grep Apacheを使用します。各プロセスで使用されるメモリの推定値を提供する「RSS」列に注目してください。または、「top」を使用して、+ fをシフトし、%MEM列を選択して、メモリ使用量でプロセスをソートできます。

プロセスの数は、Apache.confファイルの「MaxClients」ディレクティブによって決定されます。この図に到達する方法は、 このページ ;

  1. ルートとしてサーバーに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メモリを減算します。これにより、無料のプールが提供されます。
  11. FREE MEMORY POOLの値に0.8を掛けて、利用可能な平均Apacheプールを見つけます(これにより、バースト期間に20%のメモリ予約が可能になります)。
  12. Httpdで使用される最高のRESメモリで使用可能なApacheプールを分割します。これにより、システムに設定する必要があるMaxClients値が得られます。 (端数部分がある場合は、この値よりも小さい最も近い整数に丸めます。)

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

Debianでは、Apache confファイルは/etc/Apache2/Apache2.conf

16
David Okwii

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

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

これが役に立たない場合は、Apacheの外を見てみましょう。接続を高速で開いているプロセスがあります(テストプロセスが実行されている可能性があります)。

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

10
kdgregory

この質問は古くからありますが、既存の回答はすべてOPからの重要な情報を見落としているため、ここに回答を追加せざるを得ません。負荷が数分間上昇し始めた後、topまだ十分なCPUおよびメモリリソースが利用可能であること。通常は1つの犯人が残っており、それがI/Oです。

df -hの完全なパーティションがあるかどうかを確認します。そうでない場合は、アプリケーションがvmstat 1 10またはiostat 1 10を使用してディスクをスラッシングしているかどうかを確認します(これらはDebian/Ubuntuの 'sysstat'パッケージで提供されます)。それでも問題が表示されない場合は、デバイスレベルのI/Oエラーまたはネットワークマウントされたストレージのネットワーク障害がある可能性があります。システムおよびデーモンのログファイルを確認します。

5
realgeek

既に述べたように(Prefork Apacheを想定)-MaxClients =一度に最大プロセス。

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

  1. 静的コンテンツ用に別個の軽量のApacheプロセス(またはlighttpd)をセットアップします。そうすれば、小さくて静的なものがすべて、重いアプリのプロセスを「汚染」することはありません。これは同じサーバー上でも、異なるサーバー上でもかまいません。関係ありません。
  2. Apacheプロセスの前にSquidのようなリバースプロキシを配置します。リバースプロキシは、Apacheからコンテンツをすばやく吸い取り、メモリに保存してから、クライアントにパーセルバックします。このようにして、14.4kbモデムのAOLユーザーは、貴重なApacheスロットを占有しません。ボーナスとして、このようなセットアップは、コンテンツの一部をキャッシュしてApacheプロセスの負荷を軽減するように構成できます。
3
Cory R. King

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

おそらく、Apacheプロセスは実際に多くのリソースを使用しています。 PHPアプリを実行している場合、eAcceleratorをインストールして最適化とキャッシングの良い仕事をしますPHPコード。他の事柄には、重いMySQLクエリ、遅いDNSリゾルバーなど。さらに、どのプログラムがヒットして何をしているのかをより深く理解します。

2
Brandon