web-dev-qa-db-ja.com

MySQLサーバーが遅くなり、リクエストが時々タイムアウトする理由を特定する方法は?

MySQLデータベースを多用する最初のプロジェクトに取り組んでおり、自分が抱えているパフォーマンスの問題を理解するのに苦労しています。

ほとんどの場合、サーバーから迅速に応答が返されますが、バックグラウンドで多数のクエリ(データの読み取りと書き込みの両方)を実行する特定のスクリプトを実行すると、他の要求が応答を受信するのが遅いことがわかります。または完全にタイムアウトしています。

例として、昨日PHPスクリプトが大量のデータベースクエリを実行するスクリプトを実行していたときに、応答を返す前に多数のクエリを実行したページのサーバーへのリクエストがタイムアウトしました-できませんでしたNavicatでもデータベースに接続しないでください。タイムアウトも発生します。

上記の例では、SSHコンソールでtop/htopを実行したところ、CPUの使用率が非常に低く、メモリの使用率が約50%しかなかったことがわかりました。このため、問題はデータベースにあると思いますが、次の原因が原因であるかどうかなど、問題の原因を理解できません。

  • 遅いクエリ
  • あまりにも多くの接続
  • 1秒あたりのクエリが多すぎます
  • 私が知らない他の潜在的な問題

遅いクエリログについては知っていますが、非常に遅いクエリはありません。

MySQLデータベースの速度低下の原因を特定するために使用できる方法またはツールはあります。リクエストがタイムアウトになることもあります。

5
Nate

データベースを調整する必要があります。これは多くの変数と決定木を持つ複雑なプロセスです。詳細がなければ、私たちは本当にここであなたを始めることができます。

大量のSQLを実行し、DBの速度を低下させるスクリプトがあり、実行中のCPUとメモリの使用量が良好な場合、おそらくI/Oの問題が発生しています。つまり、ディスクを叩いています。スクリプトで使用されているSQLを調べて調整する必要があります。たとえば、テーブル全体のスキャンを大量に生成したり、DBの速度を低下させるトランザクションログを作成しすぎたりする可能性があります。まず、不要な全表スキャンが実行されているかどうかを確認し、関連する列にインデックスを追加してI/Oを削減できるかどうかを確認します。それから報告して、そこから行くことができます。

上記のリンクされたMySQLtunerスクリプトは優れていますが、データベースに慣れていない場合、結果を理解するのは難しいかもしれません。始める前に、メインページの免責事項をお読みください: http://mysqltuner.com/

6
Andrew Brennan

ボトルネックの本当の原因を見つける必要があります。

メモリ使用量は50%だけですか? mysqlに十分なメモリを割り当てていない可能性があります。 MySQLTuner Skript を試してください。サーバーのどこが悪いのかを指摘するかもしれません。

使用されているコアが1つだけで、コアの数が多いかどうかを確認してください。CPUの使用率が低いという誤った印象を与える可能性があります。

3
Jens W.

問題の診断に役立つように、Perconaには percona-toolkit collection があり、無料で使用できます。特に、サーバーが直面している問題を診断するためにpt-stalkを使用したい場合があります。これらのツールから生成された出力は、何を調整するか、またはどのようにサーバーを調整するかを決定するのに役立ちます。

また、MySQLのすべての使用についてクエリパフォーマンスの洞察へのアクセスを提供するホスティングサービスである Percona Cloud Tools も用意されています。このサービスはベータ版ですが、試してみることをお勧めします。

2
jerichorivera

MySQLツール http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html を使用して、IO読み取り/書き込み、バッファー読み取りなどを確認します。バックグラウンドプロセスの実行中に問題が発生するとおっしゃるように、バッファーを確認したり、ファイルロックの可能性を確認したりできます。バックグラウンドタスクが何をしているのかを知らずに答えるのは困難です。更新や削除と比較して、直接選択します。

タイムアウトを引き起こす多くのクエリを実行するスクリプトについて言及します。このスクリプトは接続を適切に開いたり閉じたりしますか、一度に1つずつ完了してクエリを整理しますか、それとも複数のループを実行していますか?メモリ/プロセッサが動作していないからといって、PHPがアプリケーション、MySQL、またはWebサーバーと同様にメモリを使い果たしているわけではありません。

操作が速くなるまで一度に1つずつ試して、すべての作業に変更を加えます。

2
EJW

私の経験では、

-簡単なスクリプトを作成してみてください。したがって、スクリプト(PHP)で問題を解決できる場合は、データベースを使用しないでください。

-MySQLで多くの作成プロシージャを実行しないでください。パフォーマンスが低下する可能性があるためです。

だからあなたは試すことができます。

1
Uchsun