サイトが Cookie などを必要とする場合、ab は少し面倒です。ab は単純すぎます。
基本的に、いくつかの内破した PHP Web サイトを修正した経験から、通常は次のようになります。
1) 人々は MySQL を使用しています
MySQL、facebook、flickr を完全に使用できます (mysql ファンボーイはこれらが大好きです)。
- 読み取り専用でない MyISAM テーブルと 100 us を超えるクエリ (select を含む) がある場合、あなたは死んでいます
私が修正したあるサイトでは、「彼のサイトにはパワーが必要だ」という理由で、その男はダブル クアッド コア サーバーをレンタルしていました。彼のサイトを見て、メンバー数が 10 万人を超える前のサイトと、Via C7 マイクロハーフピザボックス サーバーで実行されているトレント トラッカーを見て、あなたのサイトは私の地下室にある Celeron 300 で正常に実行されていることを彼に伝えます。 、それはやり過ぎです。Xeon の半額でレンタルできます (笑)。
その男は優れた開発者であり、本当にナイスガイであることが判明しましたが、彼は MySQL が苦手だったので、彼のサイトには典型的な検索クエリ フロム ヘルがあり、どんな Web サイトも殺すことができました。
- 毎秒 10 件の検索クエリ (彼の違法ウェアーズ サイトには 30 万人のメンバーがいた)
- 地獄からの検索クエリは約 0.1 ~ 0.2 秒かかります
- 物事を盛り上げるために、同じ MyISAM テーブルへの同時更新の小さなストリーム
=> すべてのクエリの総シリアライゼーション (MyISAM 書き込みロック)。1 コア 100%、アイドル状態の 7 コア、loadavg > 1000 (はい、彼は apache を使用していました)、ページ時間 > 30 秒、動作します。
修正は簡単でした。検索クエリを地獄から最適化し、以下のポイント 2) を修正し、InnoDB に切り替え、lighttpd に切り替えます。loadavg が 0.02 に低下
2) 更新
ページカウンターには誰も興味がありません。すべてのページ ビューに対して 1 回の UPDATE を発行すると、あなたは死んでしまいます。MyISAM を追加して、さらに効果を高めます。また、ロックではなく、同期ディスク IO 待機に関する InnoDB のキラーです。
3) 全文
- ロックのため、MyISAM は読み取り/書き込みテーブルには使用できません。
- MyISAM は ramdisk と同じくらい信頼性があります (実際には、より少ない : RAM ディスクを破損するために OS クラッシュが必要です。MyISAM テーブルを破損するには、MySQL クラッシュが必要です。または同時にヒットしすぎると、「不明なテーブル エンジン エラー」が発生します。何度も見ました)
- FULLTEXT は InnoDB では利用できません
- FULLTEXT インデックスに挿入すると、ほぼ完全なインデックスの再構築がトリガーされます (フォーラムの投稿を挿入すると、400 MB のインデックスが再構築されました)。
==> 全文索引付け、パフォーマンス、および信頼性が必要な場合は、Sphinx または Xapian を使用してください。
私は Sphinx を試したことはありませんが (人々はそれについて良いことを言っています)、Xapian は 4GB のテキストを簡単に検索できます。
4) 人々は apache を使用します。
これは、上記のポイントとうまく組み合わされます。
CPU 使用率が検出できない lighttpd のような適切なサーバーとは異なり (C7 経由で 100 HTTP ヒット/秒を処理し、lighttpd は 1% 未満の CPU を使用していました)、apache はボックスを強制終了します。
MySQL が停止し始めると (簡単に停止します)、クライアントが F5 キーを強く押し始め、すぐに約 1000 の apache プロセスができ、それぞれが PHP インタープリターを保持し、各 PHP インタープリターはアイドル状態の MySQL 接続を保持し、MyISAM ロックを待機します。 1つを除いて、ページビューカウンターの些細なUPDATEを行っていますが、サーバーが1000のapacheと1000のphpと1000のmysqlプロセスのためにランチスワッピングに移行しているため、時間がかかります。
Lighttpd は静的ページに CPU を使用しません。lighttpd が CPU を飽和状態にする唯一の方法は、apachebench で 20K リクエスト/秒のようにハードヒットする場合です。次に、Lighttpd は、少数の MySQL 接続と通信する 10 個の php-fcgi バックエンド (コアごとに 2 ~ 4 個が適切) などのいくつかと通信します。その結果、すべてがはるかに高速になり、過負荷になると、爆発的にではなく、優雅に劣化します.
元の質問にたどり着くには、間違いなく SQL クエリをプロファイリングする必要があります。クエリ ログを PHP アプリケーションに追加すると、クエリのリストと所要時間、および PHP スクリプトの開始から終了までの時間が表示されます (ヘッダー/フッター インクルードは適切な場所です)。これ)。
複雑なページ (検索を除く) の場合、約 3 ミリ秒の MySQL と 3 ミリ秒の PHP が予想されます。これは適切なターゲットです。もちろん、PHP でコンパイルされたコード キャッシュが必要です。