innodb_flush_log_at_trx_commit 変えたらIOめっちゃ減った

Mysql で、innodb_flush_log_at_trx_commit の初期値は 1 となっています。COMMIT時 にログファイルに書き込まれ、同時にログファイルがディスクにフラッシュされます。ディスク上のログファイルに確実に書き込まれてるので、突然クラッシュしてもログから復元できますよ、安全ですよ、という設定です。

これが 0 だと、ログバッファからログファイルへの書き込みは COMMIT頻度にかかわらず毎秒一回、ログファイルのディスクへのフラッシュも毎秒一回です。

これが 2 だと、ログバッファからログファイルへの書き込みは COMMIT時に発生して、ログファイルのディスクへのフラッシュは毎秒一回です。

なので、もし障害などで突然サーバが停止したら、最後の1秒分はディスクにフラッシュされていないので消失してしまいます。

ちょっとでも消えたら困るっていう用途は非常に多いと思うので通常 1 に設定して運用します。

手元の zabbix サーバはだいたいの値が取れてれば良いよね全体の傾向がみれればいいよね、くらいの感じで動かしているので、もし障害が起こって最後の1秒んところで更新のあったデータが消失しましたとなったところで特に困らない。

なので設定をパフォーマンス側に振ってみました。

 

mysql> set global innodb_flush_log_at_trx_commit = 2;
Query OK, 0 rows affected (0.00 sec)

 

ディスクのIO発生のグラフとCPU使用率のグラフを載せときます。

/proc/diskstats の Field #3 Read回数 と Field #7 Write 回数を足したものを単位時間ごと差分とってならべたもの。ディスクの読み書き回数。IOPS みたいなものなのかな。突然減ってるのが、パラメータを変更したところ。

CPU使用率の iowait がガクッと減っているのがパラメータ変更したところ。

COMMIT のたびにフラッシュするのをやめて、毎秒まとめてフラッシュすることで IO が減って気分が楽になりました。ディスクに優しい。

ディスクっちゅうか共有ディスク使っているので他の邪魔をしなくていい。