MySQLの高CPU使用率[終了]


191

最近、サーバーのCPUが非常に高くなっています。

CPU負荷の平均は13.91(1分)11.72(5分)8.01(15分)で、私のサイトのトラフィックはわずかしか増加していません。

topコマンドを実行した後、MySQLが160%のCPUを使用していることがわかりました。

最近、テーブルを最適化していて、永続的な接続に切り替えました。これにより、MySQLで大量のCPUが使用される可能性がありますか?


4
永続的な接続は、ほとんどの場合、使用するのが適切ではありません。
ジェイソン

1か月前にCPUが2を超えたことを覚えていないので、今すぐそれらを外して違いを確認します。
2009

2
サーバーは複数のコアを持つ傾向があります。CPU使用率は1つのコアに対して計算されます。別の言い方をすると、2つのコアを完全に使用しているプロセスのCPU使用率は200%です。ここで、MySQLは1つのコアの100%と別のコアの60%を使用しています。これは、すべてのCPUが使い果たされていることを意味するものではなく、おそらく2つ以上の空きCPUが残っている可能性があります。
xaav 2011

CPUが高いと、ほとんどの場合、クエリが非効率になります。これは通常、より良いインデックス付け(特に「複合」)やクエリの再編成によって解決されます。
リックジェームズ

回答:


265

まず、永続的な接続を無効にすることをお勧めします。永続的な接続は、ほとんどの場合、害を及ぼすよりも害が大きいためです。

次に、MySQLユーザーを再確認したいのですが、リモートサーバーから誰も接続できないようにするためです。これは、確認する必要のある主要なセキュリティ項目でもあります。

3番目に、MySQLスロークエリログをオンにして、時間がかかっているクエリを監視し、クエリを使用してキーテーブルが長時間ロックされないようにすることをお勧めします。

チェックできる他のいくつかのことは、CPU負荷が高いときに次のクエリを実行することです。

SHOW PROCESSLIST;

これにより、現在実行中のクエリ、または実行するキューにあるクエリ、クエリの内容、および実行中のクエリが表示されます(このコマンドは、クエリが長すぎる場合はクエリを切り捨てます。SHOWFULL PROCESSLISTを使用して完全なクエリテキストを表示できます)。 。

また、これらのすべてのメモリ割り当ては、MySQLを引き起こす可能性があるクエリのパフォーマンスに影響を与える可能性があるため、バッファサイズ、テーブルキャッシュクエリキャッシュ、およびinnodb_buffer_pool_size(innodbテーブルを使用している場合)などにも注意が必要です。 CPUを使い果たします。

また、いくつかの優れた情報が含まれているため、おそらく以下を読み返してください。

プロファイラーを使用することも非常に良い考えです。必要なときにオンにできるもので、アプリケーションが実行しているクエリ、重複するクエリがある場合、それらがかかっている時間などを示します。このような例は、私が取り組んできたものの1つです。PHPプロファイラーですが、世の中にはたくさんあります。Drupal、Joomla、Wordpressなどのソフトウェアを使用している場合は、コミュニティ内で質問することをお勧めします。手動で何も統合しなくても、この情報を取得できるモジュールが利用できる可能性があるためです。


12
これをありがとう、私は永続的な接続を削除し、遅いクエリログを設定しました。ログを読んだところ、ほとんどのクエリは2つのテーブルからのもので、テーブルのインデックスが適切に作成されていませんでした。約10分しか
経過して

同じ問題、プロセスを遅くするテーブルにインデックスを付けることで解決しました。スティーブンとジャドリングに感謝します
ガブリレム

@ジャドリングテーブルにインデックスを付ける方法について詳しく教えてください。おそらくいくつかのリンク?久しぶりですが、これは初めてです。noobishの質問で申し訳ありません
JayVDiyk

遅いクエリをログに記録すると、CPU使用率が高いという特定の問題を見つけるのに役立ちました。私の場合、それはWordpressプラグイン(ultimate-tag-cloud-widget)であり、人気のあるタグを表示するためにすべてのヒットで巨大なクエリを実行していました。これは素晴らしいプラグインですが、なんらかのキャッシュを使用して拡張する必要があります(問題を解決するためにカスタマイズしました)。
jkincali 2017年

別の問題を解決したもう1つのことは、上記のパラメーターinnodb_buffer_pool_sizeを変更することでした。CPU使用率が高い原因を見つけようとしているときに、innodb_buffer_pool_sizeが少なくとも/ var / lib / mysqlにあるファイルibdata1のサイズである必要があることをどこかで読みました。InnoDBは、メモリに常駐できると、はるかに効率的に機能するようです。ibdata1は巨大になる可能性があるため、状況によってはこれが難しい場合があります。また、innodb_log_buffer_sizeがinnodb_buffer_pool_sizeのサイズの25%であることを確認するためにどこかで提案されました。
jkincali 2017年

167

これは、MySQLの高CPU使用率または負荷をググった場合のトップポストであるため、追加の回答を追加します。

2012年7月1日、現在のUTC時間にうるう秒が追加され、潮による地球のゆっくりとした回転を補正しました。ntp(またはntpd)を実行すると、この秒がコンピューター/サーバーのクロックに追加されました。MySQLdは、一部のOSではこの余分な秒を気に入らないようで、高いCPU負荷をもたらします。クイックフィックスは(rootとして):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start

22
元の投稿は約3年前だったので、それが元の投稿者の問題の原因ではないかと思います。しかし、それが私の問題の原因であり、今私を救ってくれました-だからありがとう!さらに詳しい情報:blog.mozilla.org/it/2012/06/30/...
ラッセルG

5
Ubuntu 12.04でも同じ問題と解決策があります。わずかに異なる解決手順:service ntp stop && date -s " date" && service ntp start MySQLのCPU使用率が50〜100%から0〜1%に即座に低下
David Laing

2
これは確認のためだけに実行できますか?つまり、理由がなくても実行しても安全ですか?
Muhammad Gelbana 2013

2
2015年7月1日-Amazon Linuxを実行している現在のAWS EC2サーバーで、このうるう秒のバグが発生しました。sudo service ntpd stopこの構成で使用します。
Matt van Andel、2015

1
このソリューションの+1。私のMySQLは何の理由もなく何ヶ月にもわたって50〜60%で動作していましたが、このソリューションを適用した後、現在の0.0〜0.3%まで低下しました。どうもありがとう。
Zeeshan

32

このサーバーが外の世界から見える場合は、外の世界から接続するためのリクエストがたくさんあるかどうか(つまり、侵入しようとしている人)を確認する価値があります。


1
これが一部のシステムの過去の原因であったことを考えると、なぜこれが匿名の反対票を集めたかはわかりません。
Rowland Shaw

2
MySQLを外部に公開することは良い考えではないため、反対票が投じられたと思います。
MikeKulls 2013

9
@MikeKullsいいえ、それは多くの人々がエントリーを試みて獲得するためのターゲットとして機能し、CPU負荷が高くなるため、それは良い考えではありません。
Rowland Shaw

16
誰かが反対票を投じて行くとき、私はそれを嫌います!
Muhammad Gelbana 2013

1
+1は、これがMySQLのCPU使用率が高くなる正当な理由であり、これが正解であるすべての人が本当にこの情報を必要としているためです。
Chris Browne
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.