ちゃんるいすのブログ

オタクエンジニアの雑記

MySQL innodb_buffer_pool_instances を調整したら幸せになれました


1 分間に約 23万クエリ流れる DB が全部で 4台な環境がある。
f:id:rarirureluis:20200324135113p:plain

innodb_buffer_pool_size はだいたい 70 GB

セマフォ

innodb_buffer_pool_instances を調整することで、mutex への競合が減りパフォーマンスが向上する。

innodb_buffer_pool_instances = 1

f:id:rarirureluis:20200324161003p:plain

OS Waits: 2,383,265
Spin Waits: 60,1417

innodb_buffer_pool_instances = 20

f:id:rarirureluis:20200324161058p:plain

OS Waits: 1,522
Spin Waits: 27,1328

バッファプール

mutex への競合が減ることによってパフォーマンスが向上し、バッファプールが効率よく使える様になった。
今回の場合、バッファプールがいっぱいになったのでディスクへの読み書きが増えることを確認できた。

innodb_buffer_pool_instances = 1

f:id:rarirureluis:20200324162304p:plainf:id:rarirureluis:20200324162304p:plain

Read: 5.37 IOPS
Write: 337.8 IOPS

innodb_buffer_pool_instances = 20

f:id:rarirureluis:20200324162442p:plain

Read: 32.7 IOPS
Write: 404.2 IOPS

結果

スロークエリ、レプリ遅延が無くなり幸せになれました。

innodb_buffer_pool_instances = 1

f:id:rarirureluis:20200324135315p:plain

スロークエリ: 250
レプリ遅延: 1

innodb_buffer_pool_instances = 20

f:id:rarirureluis:20200324135713p:plain

スロークエリ: 0
レプリ遅延: 0

ちなみに Aurora とかはどうなってるかというと

Aurora 5.6.10a m5.2xlarge (MEM: 64GB) でしか確認してないけど innodb_buffer_pool_instances = 8 になっていた。
MySQL 5.6 の innodb_buffer_pool_instances はデフォルトで 1 だけど、ここは流石の AWS 様でした。