web-dev-qa-db-ja.com

mySQLのパフォーマンスの問題をどのように追跡およびデバッグしますか?

Mac OS X 10.4(Darwinカーネルバージョン8.10.1)で実行されているサーバーシステムがあります。このサーバーは主にBugzillaサーバーとして使用されますが、他にもいくつかのWebベースのサービスが実行されています(Testlink、TikiWiki)。

Bugzillaデータベースには約60000のバグがあり、システムには約300のアクティブユーザーがいます。

Bugzillaはバージョン3.0で、Perl 5.8.6、Apache 1.3.33、mySQL5.0.38で実行されています。

時々、Bugzillaがデータベースエラーをスローするという深刻な問題が発生します。

Software error:

Can't connect to the database.
Error: Too many connections

私はすでにこの問題の可能な解決策にいくつかの手がかりを持っていますが、これらのタイプの問題をどのようにデバッグするかについて、より一般的な質問を提起したいと思いました。

現在、mySQLデータベースを監視するために以下を設定しています。

  • 5分ごとに完全なmysqlプロセスリストをダンプするcronジョブ
  • My.cnfでlog-slow-queriesを有効にして、15秒以上かかるクエリをログに記録します

このデータの収集を開始して、「接続が多すぎる」問題の理由を見つけることができるかどうかを確認しました。

MySQLデータベースを監視し、問題の根本原因を診断するのに役立つと考えられる他のことはありますか?

6
Palmin

これらのタイプのエラーを診断するときに従うべき攻撃の2つの異なる計画があります:

最初に、実際に使用されているソフトウェアに関連する問題である可能性があります。何かが本質的に接続を吸い上げて、接続を解放していません(スレッドのハングまたはスレッドのいずれかで)遅いクエリの観点から妥当な時間)。

遅いクエリログは問題の診断に非常に役立ちますが、15秒という値はほとんど役に立ちません。クエリに15秒かかる場合は、完全に停止することになります。一般的な経験則として、実行に1〜2秒以上かかるクエリを探します。 EXPLAINキーワードを使用してこのログに表示されるものをすべて処理し、速度低下の原因を調べます(不正な結合、一時テーブルが必要な並べ替えなど)-クエリのキャッシュとインデックスを使用した巧妙な魔法が、それが不可能な場合に役立つことがよくあります。コード/データベースの設計をさらに深くいじくりまわします。

また、mysqlの一般的なクエリログを見落とさないでください。本番サーバーで(長い間)オンのままにしたくない場合でも、1つのクエリに時間がかかるのではなく、ソフトウェアの特定の機能が何百もの小さなデータベースを処理しているかどうかをすばやく判断できます。クエリ。明らかに、この種の問題を解決する唯一の方法は、コードをリファクタリングすることです。

Secondly、ソフトウェアの構成に問題があるかどうかを調査する必要があります。同時にいくつの接続が発生していますか? mysqlで設定されている実際の最大接続数はいくつですか。それは、Apacheが100の同時リクエストを処理しているのと同じくらい単純なものかもしれませんが、mysqlは20の接続のみを受け入れるように構成されています-明らかに何かが与えるでしょう。処理する予定のトラフィック量を測定できる場合は、すべてのコンポーネントのバランスをとるのに常識が必要です(正しい設定を見つけるためにGoogleを少し使用することもあります)。

6
Ian

ダンプ用のcronジョブは非常に便利ですが、実際にグラフ化する準備ができていない場合に備えて、監視用のMySQLプラグインを備えた munin をお勧めします。

  • スループット
  • クエリ
  • データベースのサイズ
  • 遅いクエリ
  • スレッド

これはスパイクを決定するのに非常に役立ちます。デフォルトでは5分間隔で実行します。

昨年それを使用して、私はそれがなければ完全に気づかれずに通過する前にそれで非常に興味深い状況を発見しました。

1
mark

Apacheワーカーは何人いますか?許可した最大mysql接続はどのくらいですか? Apacheはリクエストを処理するときにhttpdワーカーごとにcgiプロセスを生成するため、前者が後者よりも大きい場合、Apacheはmysqlが許可するよりも多くの接続を開くことができます。

次のログ設定をお勧めします

log_slow_queries
log-queries-not-using-indexes
set-variable = long_query_time=1
1
Dave Cheney