5


4

LAMPアプリケーションは正常に動作していますが、毎日ユーザー数が増えています。 私はある朝、驚きに見舞われたくないし、過負荷のためにすべてが壊れたことに気づきません。 LAMPの容量の大体の見積もりを得る方法はありますか

私は完全な詳細レポートが勉強に値する多くの本であることを知っていますが、物事がうまくいっているかどうかを確認するためにいくつかの簡単なリトマステストを受けることができます。

それではmysqlコンポーネントについて、どうすればもっと多くの負荷がかかるのかを知ることができますか? 容量は30%、50%ですか。 等

私のApacheでも同じです。 私はDBがapacheの前に死んでしまう気がしますが。

'' '' '

英語は私の母国語ではないので、おそらく私のオリジナルはあまり良くはありませんでした。 私が本当に求めているのは、*現在の*負荷を測定する方法です。 そして、その負荷に基づいて見積もる方法があります。それが失敗するまでにどれだけ先に進むことができますか。 (そしてこれは各コンポーネント、mysqld、httpdに対して別々に行われるべきです)

2 Answer


4


あなたのサイトがクッキーなどを必要とするならば、abは少し厄介です。

基本的に、いくつかの暗黙のPHP Webサイトを修正した私の経験から、それは通常このようになります:

1)人々はMySQLを使っています

あなたはMySQL、facebookそしてflickrを完全に使うことができます(mysqlファンはそれらを愛しています)もしあなたがGOTCHASを知っているなら:

  • もしあなたが読み取り専用ではないMyISAMテーブルと100 usよりも長いクエリを持っているなら(選択さえも)あなたは死んで

私が修正したあるサイトでは、「彼のサイトには電源が​​必要だ」という理由で、男はダブルクアッドコアサーバーを借りていた。 私の彼のサイトを見て、私の前のサイトで100K以上のメンバーと、C7を経由したmicro-half-pizzaboxサーバー上で動くtorrent trackerを見ました。地下室、そしてそれはやり過ぎです、私はあなたのXeonの半分の価格であなたにそれを借りることができます、笑。

その人は優れた開発者であり、本物のいい人でしたが、彼はMySQLを吸っていたので、彼のサイトはどんなウェブサイトも殺すことができる典型的なSearch Query From Hellを持っていました:

  • 毎秒地獄から10件の検索クエリ

  • 地獄からの検索クエリは約0.1 - 0.2秒かかります

  • 物事を盛り上げるための、同じMyISAMテーブルへの同時更新

⇒ すべてのクエリの合計シリアル化(MyISAM書き込みロック)。 1コア100%、 7コアアイドル、loadavg> 1000(はい、彼はApacheを使用していました)、ページ時間> 30秒、作品。

修正は簡単でした。地獄から検索クエリを最適化し、下記の2)を修正し、InnoDBに切り替え、lighttpdに切り替えます。 loadavgが0.02に低下しました

2)更新

誰もがページカウンタに興味を持っていません。 すべてのページビューに対して1 UPDATEを発行すると、あなたは死んでいます。 より多くの効果のためにMyISAMを追加してください。 InnoDBでは、ロックではなく同期ディスクIOの待機についても問題がありました。

3)フルテキスト

  • MyISAMはロックされているため読み書きテーブルには使用できません。

  • MyISAMはRAMディスクと同じくらい信頼性があります(実際にはそれ以下:RAMディスクを破壊するにはOSのクラッシュが必要です。MyISAMテーブルを破損するにはMySQLのクラッシュが必要です。私はこれを何度も見ました)

  • InnoDBではFULLTEXTは利用できません

  • FULLTEXTインデックスに挿入すると、ほぼ完全なインデックスの再構築が行われます(フォーラム投稿を挿入したときには400 MBのインデックスが再構築されていました)

=⇒ フルテキストインデックス、パフォーマンス、信頼性が必要な場合は、 スフィンクスかXapian。

私はSphinxを試したことはありませんが(人々はそれについて良いことを言っています)、Xapianは4GBのテキストを簡単に検索します。

4)人々はapacheを使います。

これは上の点とうまく組み合わさります。

lighttpdのようにCPU使用率が検出できない適切なサーバー(C7のVia C7は100 HTTPヒット/秒を処​​理し、lighttpdは1%未満のCPUを使用していた)とは異なり、apacheはあなたのボックスを殺します。

MySQLが死に始めたとき(それは簡単に死にます)、クライアントはF5に激しくぶつかり始めます。そしてすぐに、それぞれがPHPインタプリタを保持している約1000のapacheプロセスを持ち、各PHPインタプリタはアイドルMySQL接続を保持し、MyISAMロックを待ちます1つを除いて、それはあなたのページビューカウンタのいくらかの些細な更新をしています、しかしサーバは1000のapacheと1000のphpと1000のmysqlプロセスのために昼休みの交換に行っているので時間がかかります。

Lighttpdは静的ページにCPUを使用しません。 lighttpdがあなたのCPUを飽和させる唯一の方法はあなたが20Kリクエスト/秒のようにapachebenchでそれを激しく打った場合です。 それからLighttpdは、php-fcgiバックエンド10個(コアあたり2〜4個が良い)のような少数のMySQL接続と話をする。 その結果、すべてがはるかに速くなり、過負荷になると、爆発的にではなく、適切に劣化します。

元の質問にたどり着くには、間違いなくSQLクエリのプロファイルを作成する必要があります。 (あなただけに)クエリのリストとクエリにかかる時間、そしてPHPスクリプトの開始から終了までの時間(ヘッダ/フッタを含む)を表示するクエリログをあなたのPHPアプリケーションに追加するこの)。

複雑なページ(検索を除く)の場合、MySQLは3ミリ秒、PHPは3ミリ秒を期待します。 もちろんPHPでコンパイルされたコードキャッシュが必要です。


3


現在の負荷については、あなたができることがいくつかあります。 最も高価でありながら最も詳細な回答は、「Gomez」などのエンタープライズアプリケーションを通じて提供されます。

しかし、これを自分でやろうと思っているのであれば、以下の私の前の答えを見るか、またはhtop、top、wのようなシェルユーティリティを使ってApache server-statusを利用してください。

  • 質問改訂前の以前の回答: *

あなたが求めているのは、アプリケーションプロファイリングと呼ばれることもあります。

次のような大まかな記憶式を作成する必要があります。

httpd ram phpメモリ使用量mysqlプロセス使用量=リクエストメモリ合計フットプリント

あなたはまた、CPU式が必要になりますが、あなたはまた、負荷テスト中に眼球の上にすることができます。

Apacheにはコマンド 'ab’があります。

msgstr "" abはあなたのApache Hypertext Transfer Protocol(HTTP)サーバをベンチマークするためのツールです。 これは、現在のApacheインストールがどのように実行されているかの印象を与えるように設計されています。 これは特にあなたのApacheインストールが一秒間に何回リクエストを処理できるかを示しています。」http://httpd.apache.org/docs/2.0/programs/ab.html

これが一般的な 'ab’ベンチマークコマンドラインです。

ab -n 10 -c 1 http://www.yoursite.com/#qty合計10の要求、一度に1の要求

戦略は、Webページの要求から完了までのアプリケーションのプロセス(ユーザー)ごとの負荷をテストすることです。 リクエストごとにApache、PHP、およびMySQLがどれだけのRAMを使用しているかを特定できれば、すぐにシステム容量を特定できます。

おそらくvmstatやtop、iostatやpsなどの診断ツールを組み合わせて使用​​する必要があるでしょう。 いくつかの要求があなたのシステムに要求するもののスナップショットを撮るため。

最後に、Xdebugをインストールします。 このツールは、アプリケーションのphp側をプロファイルするのに役立ちます。 http://xdebug.org/

これがXdebugのインストールに関するIBMのチュートリアルです。