サイトが 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 クラッシュが必要なだけです。または、同時ヒットが多すぎると、「未知のテーブル エンジン」が発生します。エラー」、私はこれを何度も見ました)
- InnoDB では FULLTEXT を利用できません
- 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 でコンパイルされたコード キャッシュが必要です。
現在の負荷に対して、できることがいくつかあります。最も高価ですが、最も詳細な回答は、「Gomez」などのエンタープライズ アプリケーションを通じて提供されます。
ただし、これを自分で行う場合は、以下の以前の回答を参照するか、htop、top、w などのシェル ユーティリティを使用して、Apache サーバー ステータスを利用してください
質問修正前の以前の回答:
あなたが求めているのは、アプリケーションのプロファイリングと呼ばれることがあります。
次のような大まかな記憶式を作成する必要があります:
httpd ram + php のメモリ使用量 + mysql プロセスの使用量 =リクエストの合計メモリ フットプリント
CPU 式も必要になりますが、負荷テスト中にトップを目で確認することもできます。
Apache にはコマンド 'ab' があります。
「ab は、Apache Hypertext Transfer Protocol (HTTP) サーバーのベンチマークを行うためのツールです。これは、現在の Apache インストールがどのように機能するかの印象を与えるように設計されています。これは特に、Apache インストールが 1 秒あたりに処理できるリクエスト数を示します。 " http://httpd.apache.org/docs/2.0/programs/ab.html
一般的な 'ab' ベンチマーク コマンド ラインは次のとおりです。
ab -n 10 -c 1 http://www.yoursite.com/
# qty 10 total requests, 1 request at a time
戦略は、Web ページ要求から完了まで、アプリケーションのプロセス (ユーザー) ごとの負荷をテストすることです。 Apache、PHP、および MySQL が各リクエストで使用する RAM の量を特定できれば、システム容量をすばやく特定できます。
おそらく、vmstat や top、iostat や ps などの診断ツールを組み合わせて使用して、システムから要求される要求の数のスナップショットを取得する必要があります。
最後に、Xdebug をインストールします。このツールは、アプリケーションの PHP 側のプロファイリングに役立ちます。http://xdebug.org/
Xdebug のインストールに関する IBM のチュートリアルは次のとおりです。
http://www.ibm.com/developerworks/opensource/library/os-php-fastapps2/