5.6 nutshell -- 性能优化
2014-04-15
5.6的改进之处
可扩展性(性能)
优化器&执行
复制
可操作性
面向开发者的新功能
安全
只读事务优化
• 问题:RO-TRX为rw-trx,ReadView构造开销
• 解决:1) 移植对Bug49169的修复 2)移除ro-
trx-list 3)移植线程池(后面再提)
• 效果: TC RO-TRX模型测试,比AliSQL-t...
数据文件并发扩展优化
• 现象:一个ibd扩展空间,导致全局锁
• 本质:fio_io过程持有 fil_system->mutex (仅
扩展过程,正常读写不需要)
• 解决:1)一把小锁来替代大锁 (AliSQL-5.5) 2)
对node新...
死锁检测算法优化
• 触发:加锁不成功需要等待时判断
• 本质:检测循环依赖
• 优化:典型的push-pop深度遍历
死锁检测算法优化
更快的锁原语
• 问题:flush pipeline
• 解决:在spin-wait-delay中增加PAUSE,在在
退出spin时,给CPU一个hint, 避免引起内存
序列冲突,导致CPU不必要的预测(优化)
InnoDB并发控制的优化
• 5.5的FIFO— condwait/signal
• 5.6的smart adaptive – sleep/retry
• 矛盾: condwait/signal线程的上下文切换开
销 VS. sleep-re...
多个独立的purge后台线程
• 目的:1) MVCC 2)DELETE
• 改进: srv_master_thread中独立出来,并
且提供batch功能,限制一次最大purge数量
的间隔时间等
• 缺陷:稳定性
"Kernel Mutex"的拆分
• “巴黎会议”—G5
• Lock_sys->mutex
• Trx_sys->mutex
数据词典缓存
• 问题: 10W级别的表
• 解决:缓存,多了就踢
改进自适应刷脏算法
• 问题:如何判断一次刷多少脏页?
• 改进:待优化
CRC32 checksum算法
• 与fast-checksum兼容问题
• 效率:目前看最快
全局锁LOCK_open的拆分
• 表的metadata(MySQL Server层)增加一系
列mutex
• LOCK_open只保护新表的创建和表metadata
的变更
– metadata_locks_hash_instances
–...
支持多个
table_open_cache_instances实例
• 性能大概能有~10%的提升 Dim的blog, 线上环境
5.5中统配为table_open_cache为2000个,instance
推荐16(table_open_ca...
ICP (Index Condition Pushdown)
• 利用索引捞数据时,将可过滤的where条件
传递到SE层,减少回表的次数
• 典型的场景: select * from db.table where and
idx_c1>? a...
MRR (Multi-Range-Read)
• 顺序读非聚簇索引中结点, 将符合条件的PK
全部捞出来并排序,然后再到聚簇索引中
一次性把记录捞出来处理。
• 典型场景:SELECT * FROM t WHERE
key_part1 >= 1...
MRR
BKA(Batched Key Access)
更快的ORDER BY ... LIMIT ...
• 基本原理:filesort
• 优化点:如果足够小,select部分全部放在
sort buffer中
总结
• 5.6还不错,有优化空间,有期待!
• 后期讨论:移步ATA
Upcoming SlideShare
Loading in …5
×

5.6 nutshell - 性能优化

870 views

Published on

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

5.6 nutshell - 性能优化

  1. 1. 5.6 nutshell -- 性能优化 2014-04-15
  2. 2. 5.6的改进之处 可扩展性(性能) 优化器&执行 复制 可操作性 面向开发者的新功能 安全
  3. 3. 只读事务优化 • 问题:RO-TRX为rw-trx,ReadView构造开销 • 解决:1) 移植对Bug49169的修复 2)移除ro- trx-list 3)移植线程池(后面再提) • 效果: TC RO-TRX模型测试,比AliSQL-t1提高 36%,比AliSQL-5.5提高45%, 8.7WQPS/6msRT • 后续:1. RO移除RV 2)研究官方的100W QPS
  4. 4. 数据文件并发扩展优化 • 现象:一个ibd扩展空间,导致全局锁 • 本质:fio_io过程持有 fil_system->mutex (仅 扩展过程,正常读写不需要) • 解决:1)一把小锁来替代大锁 (AliSQL-5.5) 2) 对node新增标志位being_extended标记 (5.6)
  5. 5. 死锁检测算法优化 • 触发:加锁不成功需要等待时判断 • 本质:检测循环依赖 • 优化:典型的push-pop深度遍历
  6. 6. 死锁检测算法优化
  7. 7. 更快的锁原语 • 问题:flush pipeline • 解决:在spin-wait-delay中增加PAUSE,在在 退出spin时,给CPU一个hint, 避免引起内存 序列冲突,导致CPU不必要的预测(优化)
  8. 8. InnoDB并发控制的优化 • 5.5的FIFO— condwait/signal • 5.6的smart adaptive – sleep/retry • 矛盾: condwait/signal线程的上下文切换开 销 VS. sleep-retry的效率问题 • 求和:线程池 • 效果:不担心RT和大并发 (RO-TRX)
  9. 9. 多个独立的purge后台线程 • 目的:1) MVCC 2)DELETE • 改进: srv_master_thread中独立出来,并 且提供batch功能,限制一次最大purge数量 的间隔时间等 • 缺陷:稳定性
  10. 10. "Kernel Mutex"的拆分 • “巴黎会议”—G5 • Lock_sys->mutex • Trx_sys->mutex
  11. 11. 数据词典缓存 • 问题: 10W级别的表 • 解决:缓存,多了就踢
  12. 12. 改进自适应刷脏算法 • 问题:如何判断一次刷多少脏页? • 改进:待优化
  13. 13. CRC32 checksum算法 • 与fast-checksum兼容问题 • 效率:目前看最快
  14. 14. 全局锁LOCK_open的拆分 • 表的metadata(MySQL Server层)增加一系 列mutex • LOCK_open只保护新表的创建和表metadata 的变更 – metadata_locks_hash_instances – metadata_locks_cache_size
  15. 15. 支持多个 table_open_cache_instances实例 • 性能大概能有~10%的提升 Dim的blog, 线上环境 5.5中统配为table_open_cache为2000个,instance 推荐16(table_open_cache_instances)
  16. 16. ICP (Index Condition Pushdown) • 利用索引捞数据时,将可过滤的where条件 传递到SE层,减少回表的次数 • 典型的场景: select * from db.table where and idx_c1>? and idx_c2<? and non-idx_c3=? • 其执行的逻辑解释
  17. 17. MRR (Multi-Range-Read) • 顺序读非聚簇索引中结点, 将符合条件的PK 全部捞出来并排序,然后再到聚簇索引中 一次性把记录捞出来处理。 • 典型场景:SELECT * FROM t WHERE key_part1 >= 1000 AND key_part1 < 2000 AND key_part2 = 10000; • 其执行的逻辑解释
  18. 18. MRR
  19. 19. BKA(Batched Key Access)
  20. 20. 更快的ORDER BY ... LIMIT ... • 基本原理:filesort • 优化点:如果足够小,select部分全部放在 sort buffer中
  21. 21. 总结 • 5.6还不错,有优化空间,有期待! • 后期讨论:移步ATA

×