ApacheがMaxClientsに到達してサーバーをロックする


9

私は現在、Apache2のサーバがで実行しているmpm-preforkmod_php512Mリアル/ 1024Mバースト可能RAMとOpenVZのVPS(無スワップ)に。いくつかのテストを実行した後、Apacheが取得する最大プロセスサイズは23MであることがわかりましたのでMaxClients、25に設定しました(23M x 25 = 575 MB、大丈夫です)。私は自分のサーバーでいくつかの負荷テストを実行することに決めました、そして結果は私を困惑させました。

私が使用しているabWordPressのブログからメインページを要求し、私のデスクトップマシン上で。

ab24の同時接続で実行すると、すべてが正常に見えます。確かに、CPUは上がり、空きRAMは下がり、その結果、リクエストごとに約2〜3秒の応答時間になります。

しかしab、25の同時接続(サーバー制限)で実行すると、Apacheは数秒後にハングします。リクエストの処理を開始してから応答を停止し、CPUは100%アイドル状態に戻り、abタイムアウトします。Apacheログはそれが達しMaxClientsたと言います。

これが発生すると、Apacheは25の実行中のプロセス(サーバーのステータスを確認するとすべて「W」になっています)でロックされたままで、TimeOut設定が終了するとプロセスが停止し、サーバーが再び応答し始めます(私の場合は設定されています) 〜45)。

私の質問:それは予想される動作ですか?なぜApacheは到達したときに死ぬのMaxClientsですか?24の接続で動作する場合、25で動作する必要はありません。各リクエストへの応答に残りの時間を要し、残りをキューに入れるだけです。

abサーバーへの同時接続を設定するだけで、実行している子供が一人でWebサーバーを停止できるのは、ちょっと奇妙に聞こえますMaxClients

回答:


17

ハ!ようやく自分で問題を見つけました。それはサーバー管理よりもプログラミングに関連していますが、とにかく答えをここに置くことにしました。Googleを検索したところ、そのような問題を抱えているのは私だけではないことがわかりました(そして、Apacheがハングしているため、最初の問題は問題があることです。サーバーで)。

問題はApacheではなく、私のWordpressにあります。より具体的には私のテーマで。Lightworldというテーマを使用していますが、ブログのヘッダーへの画像の追加をサポートしています。それを可能にするために、PHPの関数を使用して画像サイズをチェックしますgetimagesize()。この関数は画像を取得するためにサーバーへの別のhttp接続を開いていたため、からの各リクエストabは内部でPHPから別のリクエストを作成していました。サーバーで利用可能なすべてのスロットを使用していたため、これらのPHPリクエストはキューに入れられましたが、Apacheはプロセスにすべてのプロセスがロックされ、スロットがPHP内部リクエストを完了するのを待機していたためロックされませんでした。

基本的に、PHPは私のサーバーをデッドロック状態にしており、Apacheはこれらの接続が「子」リクエストを待機してタイムアウトした後にのみ正常に動作し始めました。

この機能をテーマから削除した後ab、サーバーに必要な数の同時接続を使用できるようになり、Apacheは期待どおりにそれらをキューに入れます。


これをここに投稿してくれてありがとう、私はここ数日間、まったく同じ症状の問題を解明しようと努めてきました-私たちにもデッドロックのキャストがあると思います!
James Yale

これをどのようにして決定しましたか。主に、セカンダリアウトバウンドリクエストを決定するために使用したログとツールに関心があります。
Anirudh Goel 2017

2

ここで起こっているのは、接続を受け入れることができる25のスレッドがあり、26の同時要求を送信していることです。その最後のリクエストは、バックログのサイズに応じてソケットキューに置かれます。

2番目の問題は、実行中のものが2〜3秒かかる場合、25の同時接続によって速度が低下するのに十分な時間がかかるということです。sleep(1)は機能するかもしれませんが、mysqlからファイルロックまたはテーブルロックを行っている場合、各並列リクエストは45秒のタイムアウトに達するまで完了する前に待機している可能性があります。

23mbは、mod_phpとモジュールがロードされているapacheプロセスでは小さく聞こえるので、アプリケーションの実行中にこれらのapacheプロセスがもう少しRAMを消費しているのを目にしているのではないかと思います。MaxClientsとそのようなメモリを使って数学を実際に行うことはできません...少し近いですが、決してわかりません。

www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start

56Mおよび49Mプロセスの1台のマシンがあります。

別のマシン:

www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start

別のマシン:

www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start

したがって、メモリの使用量は、どのモジュールが読み込まれるかなどのタスクに大きく依存します。最後の2つでは、pdoとpdo_mysqlを無効にしたのは、そのアプリケーションがそれらを使用していないためです。

本当の質問は、あなたが何をしているのですか?今日の世界では、それは永遠であり、「ブロッキング」アプリケーションと見なされます。Apacheは通常死ぬことはありませんが、それらを処理できるようになるか、待機中の要求がタイムアウトするまで、これらのスレッドをバックログキューに残します。あなたのアプリケーションがおそらくApacheのタイムアウトを引き起こしていると思います。phpinfo()だけを含むページで試してください。結果が同じかどうかを確認します。


すべてのヒントをありがとう!まだ多くのことを最適化する必要があることは承知しています(数日前にサーバーの構成を開始したばかりで、VPSを使用したのはこれが初めてです)。問題はそれよりも深いものでした...回答を投稿しました私の特定のケースで何が問題であったかを説明する質問。
Rodrigo Sieiro、2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.