前端之家收集整理的这篇文章主要介绍了
JDB2导致磁盘io使用率高,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
前几天碰到jbd2进程占用大量的磁盘io,用iotop查看到的情况大致如下:
@H_
403_2@系统版本:CentOS6.5-64bit
@H_
403_2@

@H_
403_2@

经查为ext4
文件系统的一个bug:
@H_
403_2@

@H_
403_2@先给出
解决方案,处理此问题的优先级为:
@H_
403_2@1、yum update kernel 用yum
升级系统内核,重启之后查看是否有效;
@H_
403_2@2、缓解
方法:
修改commit值,降低
文件系统提交
次数或者禁用barrier特性;
@H_
403_2@建议
文件系统参数为:defaults,noatime,nodiratime,barrier=0,data=writeback,commit=60
@H_
403_2@(可以通过
修改fstab表或者remount重新挂载)
@H_
403_2@3、慎用
方法:
关闭文件系统日志
功能 tune2fs -O "^has_journal" 例如: tune2fs -O "^has_journal" /dev/mapper/VolGroup-lv_home
@H_
403_2@-----------------------------------------------------------------------
@H_
403_2@通过查资料,整理相关信息,解释如下;
@H_
403_2@1、jbd的全拼是journaling block driver
文件系统的日志
功能,jbd2是ext4
文件系统版本;可以肯定的是对
文件系统的操作太频繁,导致IO压力过大。
@H_
403_2@常用的
文件系统使用日志
功能来保证
文件系统的完整性,在写入新的数据到磁盘之前,会先将元数据写入日志;这样做可以保证在写入真实数据前后,一旦发生
错误,
@H_
403_2@日志
功能将很容易回滚到之前的状态,确保不会发生
文件系统崩溃的情况;
@H_
403_2@2、而现在的磁盘上一般都配有内部缓存,以便重新调整批量数据的写入顺序,优化写入
性能,因此
文件系统必须在日志数据写入磁盘之后才能写commit(commit=xx 每xx秒同步所有的数据和元数据。默认是每5秒)记录;若commit记录写入在先,而日志有可能损坏,就会影响数据完整性;EXT4
文件系统默认启用barrier
功能,只有当barrier之前的数据全部写入磁盘,才能写barrier之后的数据;barrier的存在保证了数据完整性;
@H_
403_2@3、使用barrier特性的不利之处在于,需要付出降低
性能的代价;可以通过挂载项 mount -o barrier=0来禁用此特性;
@H_
403_2@可通过查看/proc/mounts里的barrier值 为1代表启用
@H_
403_2@4、
文件的写和请求会导致其中一个int型的值不断增大,最后超出了自身范围---变成负值,就会触发该bug;
@H_
403_2@具体原理参考下
链接:
@H_
403_2@
http://blog.donghao.org/2013/03/20/%E4%BF%AE%E5%A4%8Dext4%E6%97%A5%E5%BF%97%EF%BC%88jbd2%EF%BC%89bug/
@H_
403_2@5、所以我们可以通过降低
文件系统的提交
次数来缓解IO压力(相关参数commit);或者禁用barrier特性(相关参数barrier=0 );
附上commit修改方法,不过我的修改后效果不明显。修改commit不是彻底解决方法,继续研究!
mount -o remount,commit=60 /data
@H_
403_2@而考虑到此bug网上已经有人提出了,貌似当时还有人提供了临时修复补丁,这么长时间过去之后,官方kernel里也应该做了相应的更新;所以当大家碰到这个问题时,首先的建议是
@H_
403_2@
升级下kernel(
升级之前建议做好数据备份),重启之后查看是否生效!