2

私は約12.000ユーザー(書き込みが多い)のコミュニティWebサイトを所有しており、1GbRAMを備えた単一のVPSで最大100人の同時ユーザーがいます。負荷が3を超えることはめったになく、応答は非常に良好です。

現在、DBクエリ結果を保存するために単純なファイルキャッシュが使用され、DBの負荷が軽減されていますが、Webサイトでは220を超える同時ユーザーの速度が低下する可能性があります(負荷テスト)。

ボトルネックが何であるかをどのように知ることができますか?

キャッシュは正常に機能しているのでDBは正常だと思いますが、ディスクIOが問題を引き起こす可能性があります。各ページロードには、DBまたはファイルキャッシュからの約10個のインクルードと10〜20個のクエリに加えて、多くのphp処理が含まれています。

ファイルキャッシュの代わりにmemcacheを使用してみましたが、驚いたことに、負荷テストではファイルキャッシュの方が好きだったようです。

代替PHPキャッシュを使用する予定ですが、そのキャッシュがどのように無効化されるのかまだよくわかりません。私はすべてのリクエストを処理する単一のindex.phpを持っています。キャッシュは個々のリクエストの結果を保存しますか?インクルード(またはキャッシュからのクエリ結果)の1つが変更された場合、キャッシュは自動的にクリアされますか?

ボトルネックを見つけるための他の提案(xdebugを試しました)?

ありがとう、ハムレット

4

5 に答える 5

5

代替PHPキャッシュを使用する予定ですが、そのキャッシュがどのように無効化されるのかまだよくわかりません。私はすべてのリクエストを処理する単一のindex.phpを持っています。キャッシュは個々のリクエストの結果を保存しますか?インクルード(またはキャッシュからのクエリ結果)の1つが変更された場合、キャッシュは自動的にクリアされますか?

APCは出力をキャッシュしません。コンパイルされたバイトコードをキャッシュします。

基本的に、通常のPHPリクエストは次のようになります。

  1. PHPファイルは解析され、バイトコードにコンパイルされます
  2. PHPインタープリターがバイトコードを実行します

APCは最初のステップの結果をキャッシュするため、同じコードを何度も再解析/再コンパイルする必要はありません。デフォルトでは、stat()すべてのリクエストでPHPファイルが使用され、キャッシュされたコピーがコンパイルされてからファイルが変更されているかどうかが確認されます。コードを変更すると、キャッシュされたコピーが自動的に無効になります。

memcachedを使用するのと同じように、任意のユーザーデータを保存するためにAPCを使用することもできます。ただし、次の点に注意してください。

  1. memcachedサーバーは、複数のサーバーにデータを提供できます。APCにキャッシュされたデータは、実際にはローカルでのみ使用できます。個々のサーバーのAPCにそのギグのデータの4つのコピーを用意するよりも、1つのmemcachedボックスから4つのサーバーにギグのデータを提供する方が適切です。
  2. 私の経験では、Memcachedは、単一のキャッシュキーへの多数の同時書き込みの処理に優れています。
  3. APCは、キャッシュがいっぱいになった場合にうまく対処できないようです。断片化が増加し、パフォーマンスが低下します。

また、注意してください。何らかのロックメカニズムを設定していない限り、ファイルベースのキャッシュは同時書き込みのために破損する可能性があります。ロックを実装している場合、それ自体がボトルネックになる可能性があります。IMO、並行性には注意が必要です。memcached/APC/データベースに処理させてください。

于 2009-11-17T16:32:03.040 に答える
1

XDebugを使用したとおっしゃっていますが、何ができなかったのですか?通常、ボトルネックの追跡を開始するには、リクエストのプロファイリングを有効にしてから、結果の「cachegrind」ファイルをKCacheGrindまたはWinCacheGrindで表示します。

キャッシュシステムの使用に関しては、あなたのような動的スクリプトは一般的にこのようなことをします

  • スクリプトへの一意の入力からキャッシュ「キー」を作成します
  • そのキーのデータがあるかどうかをキャッシュシステムに確認します。もしそうなら、あなたは行ってもいいです!
  • それ以外の場合は、データを生成するためにすべてのハードワークを実行し、次回のために目的のキーの下にデータを保存するようにキャッシュシステムに依頼します。

APCキャッシュは、解析されたバージョンのPHPコードをキャッシュすることにより、処理をさらに高速化するのに役立ちます。

于 2009-11-17T16:21:48.353 に答える
0

MySQL独自のクエリキャッシュがあります。

query_cache_size以上に設定することで有効にできます0

クエリが逐語的に繰り返され、非決定論的関数、セッション変数、およびここで説明されている他のいくつかのものなどの特定のものが含まれていない場合、クエリ結果はキャッシュから取得されます。

DMLクエリのキャッシュは、基になるクエリのいずれかに対して操作を発行することによって無効になります。

于 2009-11-17T16:20:44.717 に答える
0

テストサーバーでAPCをオンにして構成したところ、パフォーマンスが約400%向上しました。

応答時間が最大1.4秒の300人の同時ユーザー:)開始に適しています。


アップデート:

ライブサーバーのテスト結果

オリジナル:

APCなし: 220の同時ユーザー、サーバー負荷20、応答時間5000ms

APCなし: 250人の同時ユーザー、20人以上のサーバー負荷、サイトは利用できません

新しい:

APC対応: 250人の同時ユーザー、サーバー負荷2、応答時間は600ミリ秒

APC対応: 350の同時ユーザー、サーバー負荷10、応答時間は1500ms

APC対応: 500人の同時ユーザー、サーバー負荷20、応答は5000ミリ秒+サイトは完全に動作していますが、少し遅いですが、通常どおり使用できます

提案をありがとう、これはかなり大きな改善です。

サイトの書き込みが多いため、クエリキャッシュは無効になります。したがって、テーブル全体でキャッシュが常に無効になります。

于 2009-11-17T18:10:45.120 に答える
0

データベースがIOバウンドである可能性が高いと言えます。「VPS」が何であるかは正確にはわかりませんが、ある種のVMの場合、IOのパフォーマンスが非常に低いことがほぼ保証されます。

できるだけ早く実際のハードウェアに取り込んでください。かなりの量のRAMを入手します(1Gは小さいですが、16Gの方が合理的です)。

次に、dbを調整して、正しく動作できるようにすることができます。あなたのデータは合計でどれくらいの大きさですか?それらのすべて(またはほとんど)をデータベースキャッシュ(危険なクエリキャッシュではなく、適切なinnodbバッファープールのキャッシュ)に収めることができる場合は、そうします。

私はあなたがinnodbエンジンを使用していると仮定しています。その場合は、すべてのデータに対して十分な大きさになるようにバッファプールを設定します。十分なRAMがない場合は、必要になるまで追加購入します(いいえ、本当に!)。

そうすれば、dbクエリはかなり悪い場合でも高速になるはずです(はい)。

トリッキーな点は、単一のマシンを使用している場合、mysqlとPHPの間でRAMの使用量を分割する方法です-Webサーバー(私はApacheを想定しています)、特にpreforkと多数のMaxClientsを使用している場合、RAMの負荷を使い果たして奪う可能性がありますそれのあなたのデータベース。

(トレンドを使用して)ジョブを適切に監視し、慎重に変更を加え、変更を加えたタイミングを正確に記録します。

于 2009-11-17T22:33:09.080 に答える