web-dev-qa-db-ja.com

Apacheの非常に高いページ読み込み時間

私のDrupal 6サイトは何年もスムーズに稼働していましたが、最近では断続的に極端な速度低下(10〜60秒のページ読み込み)が発生しました。数時間の遅延に続いて、通常のページ読み込み(4〜6秒)が行われます。ページは常にエラーなしでロードされ、場合によっては永遠にロードされます。

------編集-----更新された質問:

この問題をトラブルシューティングするにはどうすればよいですか?

私が使用した:

  1. webpagetest.org
  2. ウィンドウズタスクマネージャー
  3. netstat
  4. ApacheおよびWindowsログ
  5. ファイアウォールパケットキャプチャ

------編集の終了-----------

私のセットアップ:

  • Windows Server 2003
  • Apache/2.2.15(Win32)Jrun/4.0
  • PHP 5 MySql 5.1
  • Drupal 6
  • 常温核融合9
  • VMware仮想環境
  • 企業ファイアウォールの背後にあるDMZ
  • トラフィック:平均1〜3ヒット

    トラブルシューティング

  • Apacheエラーログに該当するエラーはありません
  • drupalイベントログにエラーはありません
  • Drupal開発モジュールは、366.23ミリ秒、ページ実行時間2069.62ミリ秒で242個のクエリを表示します。 (だからクエリとPHPスクリプトは問題ではないようです)
  • 異常に高いCPU、メモリ、またはディスクIOはありません
  • 常温核融合アプリ、およびdrupal以外の静的ページの読み込みも遅い
  • webpagetest.orgのテストでは、1バイト目までの時間が非常に長い

問題は、Apacheがリクエストに応答していることのようですが、以前は100%のCPU負荷でのみこの動作を見てきました。リソースの監視だけで判断すると、ほとんど進行していないように見えます。

ここにキッカーがあります-サイトのアクセスの約半分はLANからのものですが、ファイアウォールルールを無効にしてネットワーク外部からのアクセスをブロックすると、内部(LAN)アクセス(1000以上のデバイス)が高速になります。しかし、外部からのアクセスが回復するとすぐにサイトは機能しなくなります。

Apacheの構成?クローラー/ボット?攻撃者?私はロープの終わりにいますが、どこに問題があるのか​​を判断するためにどこを調べるべきですか?

------編集:-----

15秒の読み込み時間を示すwebpagetest.orgのウォーターフォールチャートを添付すると、数分もかかることがあります。繰り返しますが、サーバーはほとんどの場合正常に動作します。緑色の領域は、ブラウザがリクエストを送信し、サーバーからデータの最初のバイトを受信するのを待っていることを示します。これは確かにバックエンドの遅延ですが、CPUがこの低速の間にほとんど使用されないのは不可解です。

Waterfall Chart

2
Aaron Waller

多くの研究の結果、解決策を見つけたかもしれません。私が正しい場合、それはApacheの設定の問題でした。具体的には、「ThreadsPerChild」ディレクティブ。参照... http://httpd.Apache.org/docs/2.2/platform/windows.html

Apache for Windowsはマルチスレッドであるため、UnixでApacheができるように、リクエストごとに個別のプロセスを使用しません。代わりに、通常2つのApacheプロセスのみが実行されます。親プロセスと、要求を処理する子プロセスです。子プロセス内では、各リクエストは個別のスレッドによって処理されます。

ThreadsPerChild:このディレクティブは新しいものです。使用するスレッド数をサーバーに伝えます。これは、サーバーが一度に処理できる接続の最大数です。したがって、多くのヒットが発生する場合は、この数をサイトに十分高い値に設定してください。推奨されるデフォルトはThreadsPerChild 150ですが、これは受け入れられる同時接続の最大予想数を反映するように調整する必要があります。

結局のところ、このディレクティブは私の設定ではまったく設定されておらず、デフォルトで64に設定されていました。タスクマネージャーで2番目のhttpd.exeプロセスのスレッド数を表示することでこれを確認しました。サーバーが64を超える接続にヒットしたとき、余分な要求はスレッドが開くのを待つだけでした。 httpd.confにThreadsPerChild 150を追加しました。

さらに、Apacheステータスモジュールを有効にしました http://httpd.Apache.org/docs/2.2/mod/mod_status.html

...これにより、サーバー上のアクティブなリクエストの合計数をいつでも確認できます。すぐに、最大80のアクティブリクエストの急増が見られました。時間が経てばわかりますが、これで問題が解決すると確信しています。これまでのところ、しゃっくりなしで30時間。

4
Aaron Waller