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