1 分間に約 23万クエリ流れる DB が全部で 4台な環境がある。
innodb_buffer_pool_size はだいたい 70 GB
innodb_buffer_pool_instances を調整することで、mutex への競合が減りパフォーマンスが向上する。
innodb_buffer_pool_instances = 1
OS Waits: 2,383,265
Spin Waits: 60,1417
innodb_buffer_pool_instances = 20
OS Waits: 1,522
Spin Waits: 27,1328
バッファプール
mutex への競合が減ることによってパフォーマンスが向上し、バッファプールが効率よく使える様になった。
今回の場合、バッファプールがいっぱいになったのでディスクへの読み書きが増えることを確認できた。
innodb_buffer_pool_instances = 1
Read: 5.37 IOPS
Write: 337.8 IOPS
innodb_buffer_pool_instances = 20
Read: 32.7 IOPS
Write: 404.2 IOPS
結果
スロークエリ、レプリ遅延が無くなり幸せになれました。
innodb_buffer_pool_instances = 1
スロークエリ: 250
レプリ遅延: 1
innodb_buffer_pool_instances = 20
スロークエリ: 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 様でした。