MySQL服务器 IO 100%的案例分析

【问题】mysql

有台MySQL 5.6.21的数据库实例以写入为主,IO %util接近100%sql

 

写入IOPS很高数据库

 

【分析过程】安全

一、经过iotop工具能够看到当前IO消耗最高的mysql线程服务器

 

二、查看线程49342的堆栈,能够看到正在进行redo log的刷新,对应的是9号文件微信

 

三、9号文件对应的是redo log的第一个文件工具

 

为何mysql进程会频繁的刷新redo log文件,要结合redolog的刷盘策略来分析,关键是innodb_flush_log_at_trx_commit参数,性能

默认是1,最安全,但在写压力大的状况下,也会带来较大的性能影响,每次事务提交时MySQL都会把log buffer的数据写入log file,而且flush(刷到磁盘)中去。测试

 结合这个集群的写入场景来看,大部分都是小事务的写入,每次事务提交都会触发刷盘动做,这种场景下经过增大innodb_log_buffer_size和innodb_log_file_size的优化效果不明显优化

 

【优化方案】

一、应用层面,对于写压力大的系统,能够将单条的insert语句优化为小批量的insert语句,这样事务commit的次数减小,redo log刷盘减小,性能理论上会有提高

二、MySQL层面,对于日志类型的系统,若是容许宕机的状况下少许数据丢失,能够将innodb_flush_log_at_trx_commit参数调整为2,

当设置为2时,则在事务提交时只作write操做,只保证写到系统的page cache,所以实例crash不会丢失事务,但宕机则可能丢失事务

在这台服务器上测试,将参数调整为2时,IO的请求从200M/S降到约10M/S压力会减小10倍以上

三、系统层面,更换性能更佳的磁盘

 

 获取更及时的文章信息,请关注个人微信公众号

 

相关文章
相关标签/搜索