January 27, 2014

[MySQL 5.6] Percona Server 5.6.15(及之前版本)的优化点

Percona版本的MySQL 5.6目前已经GA了几个版本,本文大概理一下Percona版本相比Oracle版本的主要不同之处。 本文基于Percona Server 5.6.15,不排除后续有更多的新特性。 总的来说,Percona版本的5.6最吸引我的地方在于,强化了后台线程的优先级(例如Page cleaner),让后台线程多干活,同时弱化用户线程对全局资源(buffer pool)的管理介入;这在大负载写入的场景下,可以有助于性能稳定(例如通常我们在redo log推进到74%左右的时候,会发现急剧的性能下降,性能下降一半都是常有的事儿…) 1.社区PORT的特性   # 线程池 似乎最初port自mariadb,并做了持续的优化,具体的针对线程池的分析见我另外一篇博客(http://mysqllover.com/?p=826);值得一提的是,那篇博客中提到的blueprint也差不多在新版本中实现了,总的来说,更加接近Oracle版本线程池的实现方式; #超时SQL (statement timeout) 该特性port自 Twitter MySQL 允许设定一条SQL的最大执行时间,当到达设定的时间,如果SQL还没有执行完的话,就会自动中断SQL; 可以针对用户grant权限时设置超时时间,也可以通过变量设置; 该特性的好处时,可以避免大量烂SQL并发长时间运行造成实例负载飙升甚至不可用。 #Atomic write support for Fusion-io Port 自Mariadb。支持对FIO设备的原子写,需要硬件支持,据说该特性无需开启double write buffer,没有测试过 #优化Memory引擎 原生版本不支持创建列类型为TEXT/BLOB的memory表 貌似port自社区,线上不使用memory引擎,不关心,有兴趣的可以点开连接细看,文档有实现的细节 2.从Percona 5.5 port过来的特性 #多个AHI分区 降低AHI锁btr search latch竞争; #对buffer pool的mutex进行拆分 #对trx_sys和创建read view的优化) 另外一篇博客有讲这部分内容:http://mysqllover.com/?p=834 #可以调整redo log块的大小,默认为512字节,但我们可以把redo 调整到4086字节以适应SSD的块大小 #相比官方的innodb_flush_method,增加了新的值ALL_O_DIRECT 这也是我们在5.5时代的默认配置,表示使用O_DIRECT去打开数据文件和日志,但只对数据文件做fsync #优化了函数BUF_READ_AHEAD_AREA,对应的bug#54814 ,用于表示预读的page数 MySQL5.6中每次都会去计算该值,实际上这个值基本上是不会变动的;将计算后的值保存下来,每次直接用即可 注:在MySQL5.7.4,这个问题被fix掉了。 # 支持不加锁显示slave信息 语法:show slave status nolock;代价就是显示的位点信息可能不准确 […]