今日、ファイル/スクリプトのロードに3秒以上かかったときに、サーバーで問題が発生しました。解決策は単純でした。MaxClientsを推定メモリ制限まで増やすだけでした。しかし、私はそのソリューションのスケーラビリティについて心配しており、信頼性が高すぎるようには見えません。負荷がわずかに増加すると、問題が再び発生します。
私たちが開発しているWebサービスの性質(小さなオンラインゲーム)では、クライアントがオンラインであることを示すビーコンを15秒ごとに送信するAJAXメカニズムを組み込む必要があります。
次の設定を想像してみましょう。 Apache 2(mpm_prefork)、MaxClients = 150、KeepAlive = on、KeepAliveTimeout = 5。オンラインには300人のユーザーがいます。 300人のユーザー全員が同時にビーコンを送信する場合(POSTを使用してbeacon.phpスクリプトを取得するだけ)、最初の150人のクライアントはほぼ瞬時に回答を受け取り、他の150人は5秒間待ってから回答?
そして2番目の質問。私の場合の最良の解決策は何ですか?キープアライブを無効にしますか?
Apache 2のMaxClientsは、すべてのApacheプロセスで処理される同時リクエストの最大数です。 prefork mpmを使用すると、これは、同時に実行されるApacheプロセスの最大数であり、Webサーバーへの開いている着信ネットワーク接続の最大数でもあります。
KeepAliveの要点は、サイトにアクセスするときにすべてのHTTPリクエストに対して新しいTCP接続を開始するオーバーヘッドを削減することです。新しいページごとに数十のドキュメント(初期html、css、javascript)が必要になる可能性があるためです。 、画像など)。最終結果は、ページの読み込みが速くなります。
MaxKeepAliveTimeoutは、接続を閉じる前にWebサーブがアイドル状態のクライアントからの追加のhHT要求を待機する時間を示し、新しい着信接続を処理できるようにします。
あなたの場合、キープアライブを有効にして一度に150のクライアントがビーコンを送信している場合、他のユーザーがビーコンを送信できるようになるまでにさらに5秒かかります。15秒ごとにビーコンを送信する要件を想定すると、最大同時ユーザー数は450になります。
ソリューション:
maxKeepAliveTimeoutを2秒に減らすことができます。これを増やすと、収穫逓減が発生します。最大の利点は、最初のページの読み込みであり、これらの要求の間に実質的に遅延はありません。
ほとんどのユーザーがゲーム内でほとんどの時間を費やしていると仮定すると、KeepAliveを完全に無効にして、すべてのページの読み込み時間を増やすことができます。
キープアライブを使用するには、サーバー側だけでなくクライアント側でも有効にする必要があります。クライアント側のJavaScriptを制御しているとすると、次のコマンドを使用して、特定のリクエストに対してクライアント側でキープアライブを無効にすることができます。
connection.setRequestProperty("Connection", "close");
同様に、接続応答ヘッダーを操作することにより、サーバー側で特定のhttp要求に対してキープアライブを無効にすることができます。
お役に立てれば!
Apache2キープアライブメカニズムがどのように機能するかの全体的な概念は、この記事で非常によく説明されています Apacheのチューニング
これを使用するには、MaxClientsとKeepAliveTimeoutの値のバランスを見つける必要があります特徴。サーバーで使用可能なメモリに応じて最初のメモリを増やすか、2番目のメモリを減らします。