1

私は小さなチームと協力して、PHP 5.3.9、MySQL 5.0.77 で実行される内部 Web サイトを運営しています。すべてのファイルとデータベースは、次の構成の専用 Linux マシンでホストされます。

Intel Xeon E5450 8 CPU コア @3.00GHz、2992.498 MHz、キャッシュ 6148 KB、Cent OS – Red Hat Enterprise Linux Server リリース 5.4

最初は小規模でしたが、データベースが大きくなり、Web サイトのパフォーマンスが大幅に低下しました。多くの場合、サーバー スペースのオーバーラン、mysql の過負荷などの問題が発生します。これらの問題に対処した経験はあまりありません。最近、パフォーマンスを向上させるために使用することを考えていた別のサーバーを入手しました。構成が優れているため、すべてを新しいマシンに完全に移行したいと考える人もいました。しかし、パフォーマンスを最適化するために両方のマシンを利用する方法を見つけようとしています。MySQL クラスタリング、ロード バランサーなどのオプションを見つけました。この状況に対して、「短期間で 2 台のマシンを使用して最高のパフォーマンスを得るにはどうすればよいか」という提案が得られるかどうか疑問に思っていました。短期的には、1 か月ほどで導入できるものを探しています。

お時間をいただきありがとうございます。

4

3 に答える 3

3

ある種の負荷分散を備えた 2 つのサーバーで Web サイトを実行することは、予想よりもはるかに困難です...

この問題に対する私のアプローチは、チームの誰かに、SLOW QUERIES などのデータベースに関連する問題を調べてもらい (MySQL は、完了するまでに一定時間以上かかったクエリをログに記録するように構成できます)、次にチェックすることです。その理由 (MySQL EXPLAIN を使用)。重大な障害点を修正し、確実で長期的な解決策を考え出す時間を与えてくれるインデックスはほとんどありません。データベースの最適化が非常に悪い場合、これにより、今のところ他のことをする必要がなくなる可能性さえあります!

MySQL を同じネットワーク内の別のマシンに移動できるため、Web サーバーの負荷と DB の負荷を分離できます。

あまり頻繁には変更されないが、Web サイトのすべての要求で読み込まれるデータの一部をキャッシュすることを検討してください。Memcached、redis キャッシュ、ファイル キャッシングなど、何でも構いません。

もう 1 つの短期的な解決策 (そして開発者の時間に比べて安価) は、特にディスクが頻繁にシークする必要があるクエリがある場合に、HDD を SSD に置き換えることです。私の個人的な経験では、劇的な違いを生む可能性があります。

于 2012-11-21T23:08:51.453 に答える
1
  • 2009 年 1 月にリリースされた MySQL 5.0.77 を使用しています。MySQL のパフォーマンスとスケーラビリティが大幅に改善されました。この記事の執筆時点では、現在のバージョンである 5.5.28 にアップグレードする必要があります。それだけで、パフォーマンスが大幅に向上するはずです。

  • クエリを分析して、インデックスが適切に選択されていることを確認する必要があります。これは、パフォーマンスを向上させるための重要なステップです。これを行う方法のヒントについては、私のプレゼンテーションHow to Design Indexes, Reallyを参照してください。

  • InnoDB は、ほとんどの場合、MySQL の最新バージョンの MyISAM よりも優れたストレージ エンジンの選択肢です。MyISAM がより高速に実行されるエッジ ケースがいくつかあるため、必ずテストを行ってください。InnoDB にはさらに多くのチューニング パラメータがありますが、デフォルトでは十分なパフォーマンスを得るには低すぎるため、適切に設定することが重要です。私のプレゼンテーションMySQL 5.5 Guide to InnoDB Statusで、InnoDB の構成パラメーターを調整するための洞察を得ることができます。

  • データベースは、アプリケーションとは別の専用サーバーに配置する必要があります。通常、パフォーマンスを向上させる最善の方法は、innodb_buffer_pool_size(InnoDB ストレージ エンジンを使用していると仮定して) 専用のメモリ量を増やすことです。

  • @Veseliq が示唆しているように、データ ディレクトリを SSD ドライブにアップグレードすることは、パフォーマンスを向上させる優れた方法です。

  • MySQLtmpdirも SSD ドライブを使用するように構成します。

  • SSD ドライブを入手できない場合、次善の策は、ライトバック キャッシュを備えた RAID コントローラーです。

  • skip_name_resolveアプリケーションが接続するときの DNS リバース ルックアップへの依存を排除​​するようにMySQL 構成を設定します。これを行う場合、ホスト名ではなく IP アドレスで SQL 権限を付与する必要があります。

  • その他のさまざまな Linux チューニングの改善:

    • Linux のデフォルトの ext3 ではなく、データディレクトリでXFSファイルシステムを使用します。
    • noatimeオプションでファイルシステムをマウントします。
    • Linux のデフォルトの cfq ではなく、デッドラインディスク I/O スケジューラを使用します。
于 2012-11-21T23:28:52.340 に答える
0

最も簡単な最初のステップは、データベースとフロントエンド アプリケーションのプロセスを分離し、これらを別のマシンに配置することです。mysqldこれにより、通常、設定を変更することで、プロセスにより多くのメモリを割り当てることができmy.cnfます。

いつものように、スタックとバックエンドを最新バージョンに更新して、ハードウェアを最大限に活用してください。

システムで実行されているデータベース呼び出しに細心の注意を払い、これらを高速化する方法がないか確認してください。EXAMINE多くの場合、特定の呼び出しの実行戦略をSELECT例として示すことができ、多くの場合、すべての中で最大のパフォーマンスの低下である、欠落しているインデックスがある場所を明らかにします。「テーブルスキャン」または「ファイルソートの使用」でヒットしている場合は、基本的に大規模なデータセットで水に浸かっています。インデックスまたは別のスキーマが必要です。

2 番目のステップは、より多くのフロントエンド アプリケーション サーバーを階層化し、何らかのロード バランサーを追加することです。これにより、負荷をより適切に処理するための追加のフロントエンド容量が得られますが、データベースの負荷もさらに低下します。

3 番目のステップは、通話中に不要なJOIN操作を行っていないことを確認することです。SELECTデータベースから必要なものを注意深く調べ、一度に 1 つのテーブルからすべてを取得してみてください。多くの場合、戦術的な非正規化が解決策になりますが、これを適切に行うことに注意しないと、同期の問題が発生します。これを行うときは細心の注意を払い、広範なテスト カバレッジがあることを確認してください。

4 番目のステップは、多くの場合、 Memcachedなどのキャッシュを使用してデータベースでの大量の読み取りアクティビティをバッファリングし、データベースに頻繁にアクセスしないようにすることです。最速のデータベース呼び出しは、作成しないものであることに注意してください。

特効薬はありませんが、その順番でやれば勝機はあるはずです。

于 2012-11-21T23:33:05.203 に答える