innodb io优化
TRANSCRIPT
InnoDB IO优化
淘宝希羽
议程
• 高性能存储引发的参数调整
• InnoDB IO原理及实现
• 模拟AIO与AIO的区别
• IO性能与稳定之间的妥协
• Percona对IO的改进
• 备库的IO优化
高性能存储引发的参数调整: 文件存储相关参数
• 日志文件 – 由group内的几个日志文件rotate – 每个文件大小默认设置过小,影响性能 – 顺序读写,建议存储于普通硬盘上
• 系统表空间文件 – 建议存入于普通硬盘上
• 数据文件 – 每个InnoDB表对应一个数据文件 – 固定大小的自增长 – 随机读写,存储于高性能存储介质 – O_DIRECT,无需OS的pagecache干预
高性能存储引发的参数调整: 读写线程相关参数
• 读写线程
– 默认设置过小,不能发挥硬件性能
– 建议读写16,太大作用不明显
• IO吞吐能力
– 默认过小,影响刷脏能力
– 建议2000,过大无优势
高性能存储引发的参数调整: 内核IO调度策略参数
• 四种调度策略
– noop/deadline/AS/CFQ
• 建议选择noop/deadline中之一
InnoDB IO原理及实现: 异步IO
• 读同步IO
– 如果page不在buffer pool中,则从存储层读入
– 当buffer-pool满时,从LRU_LIST尾剔
– 特殊的读,如read-ahead,则是异步
• 写异步IO
– 在buffer pool中修改完成则返回
– 由主线程定时从FLUSH_LIST刷到存储层
– 特殊的写也可以是同步
InnoDB IO原理及实现: IO 工作流程
模拟AIO与AIO的区别: 模拟AIO
• 模拟AIO的优化之处(写入)
– 相邻的IO合并
– 批量的写入
– 大量的slot,sem_wait/full控制,sem触发刷脏
– 可以更多的slot
• 模拟AIO的缺点
– 大量复杂逻辑,触发条件多
– Bug难排查,如DDL丢表问题
模拟AIO与AIO的区别: native AIO
• 易用,让系统去完成之前的绝大部分内容
• 稳定,更广泛的使用与考验
• 恢复更快,提速近1/3
IO性能与稳定之间的妥协: buffer pool中的脏页比例
• 脏页比越高,IO活动可能会减少,恢复越久
• 脏页30%到50%,为的是更快的恢复
Percona对IO的改进: 可分离的doublewrite buffer
• doublewrite buffer
– 位于存储层的系统表空间文件中
– 为保证页写入的一致性
– 如果开启doublewrite,则次先写doublewrite buffer,再写其它文件
– 将其分离到另外的存储分区
Percona对IO的改进: 可配的purge线程
• purge函数
– 寄宿于主线程内,”垃圾回收器”
– 当写入量大时,性能差,可能是瓶颈
– 将其分离到独立的线程,并且线程数可配
Percona对IO的改进: 多buffer pool实例
• 减少buffer pool操作的mutex粒度
• 太多则增加CPU开销
• 线上还没有配置,没有完备的测试验证
Percona对IO的改进: 可配的页大小
• 系统为4K,为何InnoDB采用16K?
– 5分钟原则
• 可配,4K/8K等,增加更的记录命中率
备库的IO优化: 预热工具
• 备库的瓶颈
– 主库的多线程,最终在备库上变成单线程
– 备库有延时
• 解决策略
– Transfer/DRC/relay-fetch
• relay-fetch的实现原理
• relay-fetch开源化