web-dev-qa-db-ja.com

負荷が大きい場合にVPSで動作するApache / php / mysqlを最適化する

512mのRAMを搭載したVPSでApache/mysqlサーバーを最適化することに関する質問。通常の負荷では、すべてが高速で実行され、接続の遅延はありません。ただし、トラフィックの多い日(5万回以上の訪問)になると、サイトはクロールし、Apacheからコンテンツを取得するのに30秒以上かかります。

サイトはExpression Engine(CMS)(PHP)で実行されており、私は彼らの高負荷最適化ガイドに従ってきました。私はググって、幸運にもApacheのためにかなりの数をフォローしてきましたが、現在の場所に到達しましたが、一定の応答時間を得る必要があります。

私は十分なRAM(私がやろうとしていることのために)持っているので、これはここでの「メモリ不足のための最適化」の質問とは異なると思います。高負荷下でチョーク。

どんなレコメンデーション?

17
Parrots

PHPの場合、容量を増やす重要なことが2つあります。

  1. Advanced PHP Caching (APC)これはYahoo!で使用されているものです。他にも同様のプロジェクトがありますが、これはラスムスの赤ちゃんです。
  2. FastCGI mod_phpの代わり。 mod_phpが通常最速であるため、この問題については議論があります。ただし、動的なPHPコンテンツと静的アセット(JS、CSS、フラッシュ、画像、PDFなど)の両方を配信する単一のApacheサーバーがあると想定します。これらの静的アセットのリクエスト多くのメモリを消費する必要はありませんが、PHPはモジュールであるため、すべてのApacheスレッドにあります。

Apacheの場合:

  1. worker MPM を使用します
  2. 有効 KeepAlive

Apacheから Lighttpd 、または Nginx への切り替えを検討することもできます。私はアパッチが大好きです。私はその多くの高度な機能から愚か者を使います。それが提供するものが必要なので、私はそのオーバーヘッドを受け入れます。共通のLAMPスタックの場合、必要以上のものであり、リソースの浪費です。

MySQLの場合:

  1. My.cnf値を微調整する代わりに、クエリの分析と修正に費やしたときの最適化の取り組みは10倍の効果をもたらします。キャッシュや接続などを正しくすることは重要ではないとは言っていませんが、ほとんどの人にとってそれは問題の9%にすぎません。
  2. QA中に、staging/dev mysqldで 一般クエリログ をオンにして、送信されたすべてのクエリをキャプチャします。 (本番mysqlサーバーではこれを行わないでください!)
  3. [〜#〜] explain [〜#〜] を使用してクエリを分析します。特に、ORMでフレームワークを使用している場合(DBを抽象化し、独自のSQLを作成できないようにする)、無関係なJOIN、WHERE句のないSELECT、「filesortの使用」を引き起こすORDER BY、およびクエリを削除する必要があります。インデックスを使用しません。
  4. MySQL 5.1を使用している場合 クエリプロファイラを利用

検討する価値のある他のツールは mk-visual-explain です。

私は10の素晴らしい参考文献を引用しました。これらのことはあなたをハミングさせるべきです。どうなるか教えてください。

18
Bruno Bronosky

PHPセッションファイルをtmpfsに移動し、APC(またはその他)を使用して、すべて削除しますallPHP不要なモジュール。削除all不要/使用しないApacheモジュール。

Tmpfs(RAM内のディレクトリ!)を作成するには

mkdir /tmpfs; chmod 777 /tmpfs
mount -t tmpfs -o size=256M tmpfs /tmpfs

/ etc/fstabに以下の行を追加して、再起動時に作成します!

tmpfs     /tmpfs    tmpfs   size=256m,mode=0777    0       0

/ etc/Apache2/php.iniでは、セッションをRAM(tmpfs)に保存するように調整してください!

session.save_handler = files
session.save_path = "/tmpfs"

注:PHPファイルおよびRAM内のセッションファイルを使用すると、ディスクにほとんど触れることがありません。

Apacheでexpires_moduleを使用して、ブラウザがほとんどのものをキャッシュするようにします。

ExpiresActive On
ExpiresDefault "access plus 90 days"
ExpiresByType image/gif "access plus 90 days"
ExpiresByType image/ico "access plus 90 days"
ExpiresByType image/png "access plus 90 days"
ExpiresByType image/jpeg "access plus 90 days"
ExpiresByType image/x-icon "access plus 90 days"
ExpiresByType text/css "Access plus 90 days"
ExpiresByType text/html "Access plus 90 days"
ExpiresByType application/x-shockwave-flash "Access plus 90 days"
ExpiresByType application/x-javascript "Access plus 90 days"

。htaccessを使用しないでくださいファイル!代わりに、vhost構成ファイルにハードコードしてください!すべてのhttpリクエストごとにディスクチェックを大幅に削減/削減します...本当に加算されます。

Options FollowSymLinks 
AllowOverride None

vhost.confファイルで使用される.htaccessの...

<Directory /home/user/www/site.com/secure>
    Order Allow,Deny
    Deny from All
</Directory>
6
Nulled

いくつかのことが頭に浮かびます。

オペコードキャッシュは常に良いアイデアです。私はAPCよりも http://eaccelerator.net/ を好みます。途中でAPCを使用して開発していない場合、それを追加しようとすることはほとんど常に苦痛です。派手ではありませんが、加速器は機能するようです。

リバースプロキシも良いアイデアですが、RAMの使用状況を確認する必要があります。mpm-workerを備えたApache 2.2が相当量のRAM =独自のものです。あなたの場合、Nginxのような軽いものを推奨し、ApacheをPHP FASTCGIとして実行するか、プロセスごとにそのままにします。Varnish、Squid、Nginx、 etcは、静的コンテンツを提供し、ユーザー接続を処理し、アプリケーションサーバーとして扱うApacheにPHPリクエストのみを渡すことです。

Mysql 5.1のかなり最近のバージョン(少なくとも5.1.24など)を実行している場合は、1秒未満の遅いログにアクセスできます。私はlong_query_timeを1または2で開始し、本当に長いもののハンドルを取得したら、それを0.5に下げます。また、Mysqlのネット上には一般的なチューニング情報がたくさんありますが、RAMで十分なことはできません。設定をデフォルトから増やしましたか?ほとんどのデフォルトmy.cnfファイルは約64MBのRAMを使用するように構成されていますが、少なくともkey_bufferを16MBから64MBに増やします。

さらに、MyisamまたはInnodbテーブルを使用していますか? DBでセッションを維持している場合は、セッションレベルを行レベルのロックではなくテーブルレベルのロックを行うMysiamテーブルのままにするのではなく、セッションテーブルをInnodbに変更する(またはCookieにする)必要があります。基本的に、書き込みが20%から読み取りが80%を超えるテーブルは、Innodbへの移行の候補です。 MyisamテーブルとInnodbテーブルの間でRAMの量のバランスをとる必要があることに注意してください。それぞれのバッファは個別に構成されているためです。

そして最後に、別の512MBのRAMは、セットアップで長い道のりを行くか、またはそれがより安いかほぼ同じ価格である場合、Mysqlを実行するためにさらに512MBのVPSになります。実際には、2番目のインスタンスに頼ります。利用可能なディスクIOが2倍になるためです。VPSサーバーの問題の1つは、IOが同じ物理サーバー上の他のユーザーから保護されていないことです。

うーん、私の投稿はすべてまとまっていませんが、見る場所はたくさんあります。幸運を。

5
kashani
  • Apcのようなphpのopcodeキャッシュを使用します。
  • イカやワニスなどのhttpアクセラレータを使用します。
2
wittwerch

ここでの素晴らしい提案を超えて、すべてのVPSが同等に作成されているわけではないことに注意してください。私の経験では、PHPはCPUが重いことがわかりました。

Nginx/apc/phpfpm/mysql(localのA Wordpress ABベンチマーク(ab -n 500 -c 25 http://domain.com/index.php )) )EC2では、エントリレベル「2GB RAM/1 Compute Unit Server」で1秒あたり約2リクエストが発生しました。

512MBのRackspace Cloudserverで同じスクリプト(同一のOSにデプロイされた)に対して同じベンチマークを実行すると、〜80リクエスト/秒が返されます。つまり、この初歩的な実験では、RAMが4倍、パフォーマンスが40倍になります。

ABの最中にtopを表示すると、EC2は同時実行性を処理できず、すぐに100%のCPU負荷に達してロックアップすることがわかります。同じベンチマーク中に512MBサーバー(仮想化されたクアッドコアCPU)を上から見ると、コアは最大60%の負荷に達し、ベンチマークをスムーズに処理します。

VPSは非常に簡単に起動してオフにすることができ、コミットメントがなくても、VM/VPSが常駐するインフラストラクチャをテストするのに支障はありません。

編集1:また、EC2の「高CPU」スモールインスタンスは、1秒あたり最大10を生成することしかできず、CPUは依然としてボトルネックのままでした。私の結論は、EC2では安定性/堅牢性のためにパフォーマンスを犠牲にすることでした。もちろん、そのような環境を必要とする多くのユースケースがあります。

1
iainlbc

メモリが少ない状況(高トラフィックサーバーの場合は512Mbが少ない)では、WebサーバーとDBエンジンの選択を検討する価値があります。

Lighttpは、Apacheが通常多くの微調整の後に作成できるよりも箱から出して軽く、そしてそれよりも軽いオプションがあります。他のサーバーではサポートされていない依存しているApache機能がある場合、これはもちろん不可能です。

sqliteはmySQLよりもはるかにタイトで、多くの条件下でも高速です。使用しているエンジンがこれをサポートしているかどうか、またそれが試せるかどうかを確認してください。

もう1つのオプションである簡単なオプションは、RAM in VM in余裕があれば、さらに入手することです。

1
David Spillett