1

ajax コマンドを使用して更新することで新しいエントリを表示する Web チャットをプログラムしました。このコマンドは php ファイルを起動し、最新の 25 エントリを示すチャット ログを作成しました。Ajax は、すべてのユーザーに対してこれを毎秒更新しました。

その後、約 10 人のユーザーがオンラインになったとき、Web サイト全体が信じられないほど遅くなり、クラッシュするようになりました。遅さは、phpスクリプトが頻繁に(毎秒10回以上)更新されることが原因であると考えました。

vserver を調べ、htop を起動してプロセスを表示しました。CPUはほとんど使用されていませんでした。それは 0% の間で、5% までピークに達しました。RAM は半分しか使用されておらず、1 GB の約 500 MB でした (チャットがオンラインになる前であっても、これは標準です)。

チャット ログの html キャッシュ サイトを 1 つだけ作成する cron ジョブを作成し、それをユーザーに配布することで、この問題を解決しました。

それでも、CPU と RAM がまったくビジーではないのに、なぜサーバーがこんなに遅くなるのだろうか?

4

1 に答える 1

1

CPU を最大限に活用していない場合は、他のリソースをブロックしています。いくつかの可能な候補:

  • すべてのリクエストに対して db クエリはありますか? もしそうなら、彼らはどのくらいの時間がかかりますか?

  • リクエストを処理するために利用できるスレッドはいくつありますか? 各リクエストにはどのくらいの時間がかかりますか? リクエストを処理するスレッドが 1 つしかない場合、1 秒あたり 100 リクエストの受信負荷 (あなたが行っているように聞こえます) は、リクエストがせいぜい 10 ミリ秒以上かかるとバックアップを開始します。

一般的な戦略として、タイマーを追加して問題を分割しようとします。リクエストの最初と最後に時間をかけてください。これが小さい場合は、遅延が別の場所にあることがわかります。

また、この種のワークロードでは、ポーリングではなく更新のプッシュを検討する必要があります。こうすることで、リッスンしているクライアントを更新するために単一のメッセージをプッシュでき、新しいメッセージをすぐに取得するために頻繁にポーリングする必要がなくなります。

于 2012-09-19T06:12:40.357 に答える