2020-04-06に更新

MariaDB (MySQL innoDB) が急にダウンする際に行ったパラメーターチューニング

はじめに

処理が遅いアプリの改善を行った後、処理性能が改善されたものの、MariaDB が急に落ちる問題が頻発。
落ちるたびにシステムが停止し悩まされたが、なんとか解決したので備忘録。

結論

  • アプリ側で処理数が上昇した事で、IO 負荷が高くなっていた事が根本原因。
  • ストレージの IOPS を考慮して innodb_io_capacity, innodb_io_capacity_max, innodb_read_io_threads, innodb_write_io_threads を可能な限り増やす。増やすと上昇値が平準化される。負荷が上がり innodb_log_file_size の上限を超えて落ちることが無くなる。
  • innodb_buffer_pool_size は可能な限り上げる。余裕を持たせ処理を平準化させる。
  • innodb_log_buffer_size も一定水準まで上げる。上の対処を行った場合でも、負荷が上昇するとこの数値次第で落ちる原因になる。

環境

項目
筐体・メモリ さくらVPS 16GB
ストレージ SSD
用途 nginx PHP ウェブサーバー + DB サーバー

具体的な my.ini 設定値 (関連値含む)

innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 12
innodb_write_io_threads = 12
innodb_buffer_pool_size = 6144M
innodb_log_buffer_size = 250M

innodb_buffer_pool_instances = 4
innodb_flush_method = O_DIRECT
innodb_checksum_algorithm = CRC32
innodb_change_buffer_max_size = 10
innodb_log_file_size = 256M
innodb_log_files_in_group = 2
innodb_lock_wait_timeout = 10
innodb_lru_scan_depth = 1024
innodb_flush_neighbors = 0
innodb_read_ahead_threshold = 0

経緯や補足など

  • 特定の処理タイミングでのみ落ちていた為、アプリ側の問題を疑ったが、単純な参照と更新を繰り返すだけの処理な為、アプリ側の問題はほぼなかった。
  • MariaDB そのものについての情報が少ない。MySQL の情報はそこそこある為、適宜参考にする。
  • 用いている MariaDB 10 は MySQL 5.6, 5.7 両バージョンをベースとしたキメラで若干ややこしい。
  • 監視ツールの Mackerel の MySQL プラグインが役立った。知識がなくとも何かが制限を超えたような事が見て取れるので当たりが付けられた。
  • innoDB Checkpoint Age (Uncheckpointed) が急激に上昇し MariaDB が落ちていた。当初は innodb_log_file_size を上げて解決を図った。
  • 多少ライフタイムが伸びたが、問題の根本は IO パフォーマンスにある為、上記は本質的な解決策にならず同様の問題が発生していた。
  • IO パフォーマンスはあくまで設定次第であり、物理側の IOPS に併せて勝手にスケーリングされる訳ではない。
  • ストレージが HDD では対処不能だったので SSD で助かった。
  • 上記パラメーターが最善値であるか不明。安定し始めてから1週間程度な為、再調整の可能性あり。

参考

ツイッターでシェア
みんなに共有、忘れないようにメモ

sola

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント