web-dev-qa-db-ja.com

ApacheWebサーバーの断続的なストール

私たちのSOAP WebサーバーはCentOS上のApacheのPHPで実行されており、MySQLを多用しています。サーバーに対する需要は非常に高く、ほとんどのリクエストは非常に小さいです。必要なMySQLクエリは2つか3つだけですが、非常に多くあり、ピーク時には1秒あたり数百になる可能性があります。各リクエストのデータトラフィックは通常1Kb未満で、多くの場合数バイトです。

これが実行されているハードウェアはかなりまともで、32 Gb RAMを備えた18コアであり、一般的に非常にうまく対応します。 CPU使用率が実際に30%を超えることはなく、物理RAM消費量が50%を超えることはありません。ただし、サーバーが停止し、Apacheが停止することがよくあります。これは、約1分前まで続く可能性があります。再び緩み、通常のサービスが再開されます。

私はこれをかなり深く分析して、ストール中に何が起こっているかを確認しました。 Apacheはその接続が限界に達しており、そのほとんどすべてが「読み取り」状態にあります。 CPU使用率はほとんどゼロになり、メモリ使用量は変化せず、ネットワークとディスクIO両方が急落するため、システムは完全にアイドル状態になっているように見えます。

多くのグーグルを行った後、これはいくつかのタイムアウト設定に関係している可能性があると信じられました-ネットワーク接続が十分に速く解放されず、Apacheが不足しています。これは、Apacheがしばらくすると通常の操作を再開し、すべてがタイムアウトするのを待ってから続行する理由を説明します。 'netstat -an'を実行すると、TIME_WAITに多くの接続が表示されるため、これがサポートされます。ただし、Apache構成のあらゆる種類のタイムアウト設定を減らし、sysctl.confのさまざまなネット設定も減らしましたが、問題を解決するものは何もないようです。

Apacheのエラーログには何もありません。 「ab」を使用してApacheのストレステストを試みました。断続的なストールが少し早く発生するようですが、それから実際に判断できるのはそれだけです。 ApacheとMySQLの最大接続は両方とも高い値に設定されています。実際の同時接続は、Apache接続が最大になるストール中を除いて決して閉じません。

他に何を試すべきかよくわかりません。私がここで見逃しているかもしれないことについてのアイデアや指針はありますか?

-編集-

いくつかの追加の観察。ストールが発生していると、ESTABLISHED状態の接続数が大幅に増加し、数秒後にCLOSE_WAITの接続数が続きます。

また、ストールが発生すると、「ソケットのリッスンキューがオーバーフローした回数」と「ソケットをリッスンするSYNが無視された」回数が急速に増加します。ストールの合間に、これらの数値はまったく変化しません。

これらの数字が失速の原因なのか結果なのかはわかりません。それ以上の助けをいただければ幸いです。

1
Mark Williams

私はこれを解決したので、他の人が同じ問題を経験した場合に備えて解決策を投稿します。

私たちのWebトラフィックはすべてHTTPSを経由していることを忘れてしまいましたが、それが原因のようです。ストール中に、straceとpstackを使用して、アイドル状態のApacheプロセスの1つが何をしているかを確認しました。 SSLセッションキャッシュのミューテックスを待機してスタックしました。

Apacheの構成を見ると、5分のタイムアウトでSSLSessionCacheが有効になっていることがわかりました。これを無効にするのが修正です。

私の推測では、セッションキャッシュがいっぱいになり、Apacheは古いセッションがタイムアウトするのを待ってから続行しました。

2
Mark Williams

Apacheマニュアル によると

KeepAliveTimeoutディレクティブ

説明:サーバーが永続接続で後続の要求を待機する時間構文:KeepAliveTimeout秒デフォルト:KeepAliveTimeout 5コンテキスト:サーバー構成、仮想ホストステータス:コアモジュール:コアApacheが実行する秒数接続を閉じる前に、後続の要求を待ちます。要求が受信されると、Timeoutディレクティブで指定されたタイムアウト値が適用されます。 KeepAliveTimeoutを高い値に設定すると、負荷の高いサーバーでパフォーマンスの問題が発生する可能性があります。タイムアウトが長いほど、アイドル状態のクライアントとの接続を待機しているサーバープロセスが多くなります。名前ベースの仮想ホストコンテキストでは、NameVirtualHostのセットで最初に定義された仮想ホスト(デフォルトのホスト)の値が使用されます。他の値は無視されます。

したがって、最初の(デフォルトの)ホストで、KeepAliveTimeout 3を設定し、構成内の他の場所でディレクティブへの参照を削除し、ストレステストを再実行して、最大同時接続の問題であることを確認します。

0
Ron Lawhorn