5.6 nutshell - 性能优化

21
5.6 nutshell -- 性性性性 2014-04-15

Upload: hui-liu

Post on 24-Jul-2015

651 views

Category:

Technology


7 download

TRANSCRIPT

Page 1: 5.6 nutshell  - 性能优化

5.6 nutshell -- 性能优化

2014-04-15

Page 2: 5.6 nutshell  - 性能优化

5.6 的改进之处

可扩展性 (性能 )优化器 &执行

复制可操作性面向开发者的新功能安全

Page 3: 5.6 nutshell  - 性能优化

只读事务优化• 问题: 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

Page 4: 5.6 nutshell  - 性能优化

数据文件并发扩展优化• 现象:一个 ibd 扩展空间,导致全局锁• 本质: fio_io 过程持有 fil_system->mutex

( 仅扩展过程,正常读写不需要 )• 解决: 1) 一把小锁来替代大锁 (AliSQL-5.5)

2) 对 node 新增标志位 being_extended 标记 (5.6)

Page 5: 5.6 nutshell  - 性能优化

死锁检测算法优化• 触发:加锁不成功需要等待时判断• 本质:检测循环依赖• 优化:典型的 push-pop 深度遍历

Page 6: 5.6 nutshell  - 性能优化

死锁检测算法优化

Page 7: 5.6 nutshell  - 性能优化

更快的锁原语• 问题: flush pipeline• 解决:在 spin-wait-delay 中增加 PAUSE ,在

在退出 spin 时,给 CPU 一个 hint, 避免引起内存序列冲突,导致 CPU不必要的预测(优化 )

Page 8: 5.6 nutshell  - 性能优化

InnoDB 并发控制的优化• 5.5 的 FIFO— condwait/signal• 5.6 的 smart adaptive – sleep/retry• 矛盾: condwait/signal 线程的上下文切换

开销 VS. sleep-retry 的效率问题• 求和:线程池• 效果:不担心 RT 和大并发 (RO-TRX)

Page 9: 5.6 nutshell  - 性能优化

多个独立的 purge 后台线程• 目的: 1) MVCC 2)DELETE• 改进: srv_master_thread 中独立出来,并

且提供 batch 功能,限制一次最大 purge 数量的间隔时间等

• 缺陷:稳定性

Page 10: 5.6 nutshell  - 性能优化

"Kernel Mutex" 的拆分• “ 巴黎会议”— G5• Lock_sys->mutex• Trx_sys->mutex

Page 11: 5.6 nutshell  - 性能优化

数据词典缓存• 问题: 10W 级别的表• 解决:缓存,多了就踢

Page 12: 5.6 nutshell  - 性能优化

改进自适应刷脏算法• 问题:如何判断一次刷多少脏页? • 改进:待优化

Page 13: 5.6 nutshell  - 性能优化

CRC32 checksum 算法• 与 fast-checksum 兼容问题• 效率:目前看最快

Page 14: 5.6 nutshell  - 性能优化

全局锁 LOCK_open 的拆分• 表的 metadata ( MySQL Server 层)增加一

系列 mutex• LOCK_open 只保护新表的创建和表

metadata 的变更– metadata_locks_hash_instances– metadata_locks_cache_size

Page 15: 5.6 nutshell  - 性能优化

支持多个 table_open_cache_instances 实例

• 性能大概能有 ~10% 的提升 Dim的blog, 线上环境 5.5 中统配为 table_open_cache 为 2000个, instance 推荐 16(table_open_cache_instances)

Page 16: 5.6 nutshell  - 性能优化

ICP (Index Condition Pushdown)

• 利用索引捞数据时,将可过滤的 where 条件传递到 SE 层,减少回表的次数

• 典型的场景 : select * from db.table where and idx_c1>? and idx_c2<? and non-idx_c3=?

• 其执行的逻辑解释

Page 17: 5.6 nutshell  - 性能优化

MRR (Multi-Range-Read)

• 顺序读非聚簇索引中结点 , 将符合条件的PK 全部捞出来并排序,然后再到聚簇索引中一次性把记录捞出来处理。

• 典型场景: SELECT * FROM t WHERE key_part1 >= 1000 AND key_part1 < 2000 AND key_part2 = 10000;

• 其执行的逻辑解释

Page 18: 5.6 nutshell  - 性能优化

MRR

Page 19: 5.6 nutshell  - 性能优化

BKA(Batched Key Access)

Page 20: 5.6 nutshell  - 性能优化

更快的 ORDER BY ... LIMIT ...

• 基本原理: filesort• 优化点:如果足够小, select 部分全部放在

sort buffer 中

Page 21: 5.6 nutshell  - 性能优化

总结• 5.6还不错,有优化空间,有期待!

• 后期讨论:移步 ATA