mysqldプロセスのCPU使用率が常に100%付近
はじめまして。P1K1と申します。
いつも拝見させて頂いております。
今回Zabbixの監視において、表題の件で投稿させて頂きました。
20M程のログファイルを5種類監視するアイテムをZabbixエージェントサーバ6台に行い、更に監視対象文字列を検知したらアクションを実行する設定をZabbixにて行いました。
アイテムを有効にした直後に、取得対象のメッセージを大量に取得し、1秒に複数回アクションを実行する状況が長時間続きました。
ZabbixサーバのCPU使用率を確認してみると、アイテムを有効にした直後よりCPU使用率が急上昇し、70%付近の値をとっておりました。
その際にZabbixサーバのログを確認したところ、以下と同種のログが繰り返し出力されておりました。
1429:20110929:220922.494 [Z3005] Query failed: [1213] Deadlock found when trying to get lock; try restarting transaction [delete from escalations where escalationid=54111]
1429:20110929:220922.654 [Z3005] Query failed: [1213] Deadlock found when trying to get lock; try restarting transaction [delete from escalations where escalationid=55202 and status=4]
1427:20110929:220925.754 [Z3005] Query failed: [1213] Deadlock found when trying to get lock; try restarting transaction [delete from escalations where actionid=25 and triggerid=44638 and status not in (1,4,5) and (esc_step<>0 or status<>0)]
1429:20110929:220928.190 Escalation cancelled: Event [4350270] deleted.
1429:20110929:220932.404 Escalation cancelled: Event [4350282] deleted.
監視開始から4時間後あたりに監視対象文字列を減らす事で、サーバ側で取得するログを減らしたところ、上記のDeadLockエラーは出力されなくなりました。
しかしCPU使用率は上昇し、常に97%前後の値を出力するようになりました。
監視対象のログはAM4時に一度圧縮され、別ディレクトリに保存されます。
再度ログファイルが作り出されるのはAM8時ごろであり、その時ログ監視が再開されるのですが、その時にCPU使用率が97%から80%程に低下しました。
その際、上記のようなDeadLockも少数発生しておりました。
CPU使用率の減少や、DeadLockの発生も5分程度したら治まり、現時点ではCPU使用率は97%前後を示しています。
topコマンドを実行したところ、CPU使用率が上昇している原因はMySQLのプロセス(mysqld)だと分かりました。
※以前、同一のログを監視した際にも大量のログを取得し、DeadLockは発生しておりましたが、その時はアイテムを無効にする事でDeadLockは出力されなくなりました。
今回のログ監視は、そのアイテムを再度有効にしただけです。
こちらのmysqldプロセスの使用率を平常状態に戻したいのですが、何か良い解決方法などありますでしょうか?
ご教授頂ければ幸いです。
以上です、宜しくお願い致します。
tsuzuki - 投稿数: 78
鈴木です。
まず、mysqldプロセスの消費していると書かれているCPU使用率のほとんどは、waitで消費されているのではないでしょうか。(これはtopコマンドなどで、waitの使用割合がわかります)
waitは、IOで待たされている時に発生することがほとんどです。
つまり、使用環境のIOが追いつかないためにCPU使用率が上昇していると考えられます。
書かれているログからも、mysqlの負荷の限界が来ていると思われます。
対策として、以下を検討してください。
(1.) mysqlのチューニング
mysqlにマシンのリソースがあまり割り当てられていない可能性があるので、設定をしてください。
table_cache、max_connections、thread_cache_size、innodb_file_per_table、innodb_buffer_pool_size、innodb_log_file_size など設定する項目がありますが、まずは innodb_buffer_pool_size として搭載メモリ量の60%程度設定するだけで改善するかもしれません。
(2.)監視アイテムを減らす
不要なアイテムを減らせば負荷を減らせます。
あと、ログファイル監視や文字列監視のような文字を扱う監視は処理が重くなります。
特に、ログファイル監視は重くなりますので、書かれているように監視対象文字列を減らすことは効果があります。
また、ログファイルを一度に転送すると負荷が向上するので、一気に大量のログを読ませないようにすると改善が見込めます。
(3.)メモリを増やして innodb_buffer_pool_size に多く割り当てたり、早いIOを持つマシンに切り替える
メモリを増やしたり、IOが早くなると、改善します。
よろしくお願いします。