一次服务器IO占用率高的定位分析

背景:请假在外中,听平台组同事反馈了一个问题,在往生产数据库中导入部分数据时会形成客户端的访问超时,初步定位是由于服务器磁盘占用IO太高,导数据时IO会飙升到100%,所以引发了很多数据库的慢查询操做致使客户端响应超时,无奈只好暂时中止了导入数据的脚本,同时也延误了针对这部分数据的生产测试工做。因而我次日回到公司就投入了对这个问题的跟踪定位工做。mysql


环境描述:linux

  • 操做系统ios

    wKioL1PzHbih3dckAABqlzu8NXs262.jpg

  • 文件系统sql

    wKiom1PzHLOyItieAADf6Fm1BEg633.jpg

  • 数据库数据库

    wKiom1PzHMOg31Y7AADJcKOXs80235.jpg

首先咱们数据库某最大表的数据也不过300w多条,对于MySQL来讲仍是可以正常处理的。并且客户端并发量也不过1K多,数据库的TPS也未过百,我前后使用了top,iostat监测到的IO利用率确实都已经达到极限了。最后使用iotop这个工具发现了一个吃IO的罪犯jbd2服务器

wKioL1PzHf2g6lTuAADhxOHRieM865.jpg

Overview
The Journaling Block Device (JBD) provides a filesystem-independent interface for filesystem journaling. ext3, ext4 and OCFS2 are known to use JBD. OCFS2 starting from linux 2.6.28 and ext4 use a fork of JBD called JBD2.
网络

能够知晓它的主要功能是向文件系统写日志。那么确定是因为对文件系统的操做太频繁致使的IO压力过大,问题这是个系统进程,是系统问题仍是?并发

目前我这台服务器上只有一个应用须要大量操做IO,那就是MySQL数据库,会不会由他致使的?怀着这个疑问我用google将mysql和jbd2联合做为关键字进行搜索,获得了这么一个线索sync_binlog,innodb_flush_log_at_trx_commit这两个mysql的配置项。顿时我仿佛想起了什么,因而翻到《高性能MySQL》这本书的第10章——复制的章节(从上面的环境描述中能够看到我使用了MySQL的主主复制)找到了对sync_binlog的说明ide

wKioL1PzHhLDWouAAAJT10pjdMs726.jpg

那么innodb_flush_log_at_trx_commit呢?工具

  • 若是innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,而且log file的flush(刷到磁盘)操做同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操做。

  • 若是innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,而且flush(刷到磁盘)中去.

  • 若是innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.可是flush(刷到磁盘)操做并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操做。

因为咱们的业务数据的特色,对数据可靠性并不如金融、订单系统那么高因而在权衡下就把sync_binlog设置为每500次刷新一次磁盘,而将innodb_flush_log_at_trx_commit设置为2,再用iotop等工具查看系统IO状况,大大降了下来。好吧,这个借刀杀IO的罪犯终于找到并被处理了。

后记:在此次处理问题的过程当中有两个小插曲。

  1. 某领导找来几我的对此问题进行会诊,有猜想服务器资源不够的,有猜想脚本问题的,有猜想数据库自己效率底下的…我我的很是很是反感在没有通过性能监控和数据的分析而凭空猜想问题的作法。我但愿给全部靠凭空想象定位问题的人提个醒,请不要随意对本身不了解的问题定性,由于别人不会把你看作高手,只会对你视而不见。

  2. 在找出jbd2的问题以后,看到一些论坛解决方案说是因为linux内核的bug能够选择升级系统内核或者修改内核配置项来解决,也许是对的,可是即便能解决这个问题对我来讲成本也很大。我但愿你们遇到问题时在利用网络资源的同时结合本身的状况进行进一步分析再选择采用什么解决方案,适合本身的才是最好的

参考资料:
http://unix.stackexchange.com/questions/86875/determining-specific-file-responsible-for-high-i-o
http://serverfault.com/questions/363355/io-wait-causing-so-much-slowdown-ext4-jdb2-at-99-io-during-mysql-commit
http://blog.itpub.net/22664653/viewspace-1063134/

相关文章
相关标签/搜索