jbd2进程占用大量的磁盘io,用iotop查看到的情况


    TIME  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND

21:16:06  1126 be/3 root        0.00 B/s    0.00 B/s  0.00 % 26.93 % [jbd2/dm-2-8]

 

先记录60次观察一下(一般是1秒一次)

#iotop -botqk -n 60 -p 1126 >> /tmp/iotop-1126.txt &

或者


加入计划任务,指定pid 
<div style="font: 14px/21px 微软雅黑; text-align: left; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">
    <div style="background-color: inherit;">
        * * *&nbsp;*&nbsp;*&nbsp;iotop&nbsp;-botqk -n&nbsp;59 -p&nbsp;1126&nbsp;&gt;&gt;&nbsp;/tmp/iotop-1126.txt&nbsp;<span style="line-height: 1.5; background-color: inherit;">&amp;</span>
    </div>

    <div style="background-color: inherit;">
        &nbsp;
    </div>

    <div style="background-color: inherit;">

            临时缓解方法:<span style="font: 14px/21px 宋体, &quot;Arial Narrow&quot;, arial, serif; color: rgb(44, 44, 44); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-stroke-width: 0px;">ext4文件系统,</span>修改commit值,降低文件系统提交次数或者禁用barrier特性;

            <font color="#ff0000" style="background-color: inherit;">建议文件系统参数为:defaults,noatime,nodiratime,barrier=0,data=writeback,commit=60</font>

            (可以通过修改fstab表或者remount重新挂载)

    </div>
</div>




 


终极解决方案

1、升级系统内核

2、使用XFS文件系统

 

ps:

1、jbd的全拼是journaling block driver 文件系统的日志功能,jbd2是ext4文件系统版本;可以肯定的是对文件系统的操作太频繁,导致IO压力过大。

常用的文件系统使用日志功能来保证文件系统的完整性,在写入新的数据到磁盘之前,会先将元数据写入日志;这样做可以保证在写入真实数据前后,一旦发生错误,

日志功能将很容易回滚到之前的状态,确保不会发生文件系统崩溃的情况;

2、而现在的磁盘上一般都配有内部缓存,以便重新调整批量数据的写入顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写commit(commit=xx 每xx秒同步所有的数据和元数据。默认是每5秒)记录;若commit记录写入在先,而日志有可能损坏,就会影响数据完整性;EXT4文件系统默认启用barrier功能,只有当barrier之前的数据全部写入磁盘,才能写barrier之后的数据;barrier的存在保证了数据完整性;

3、使用barrier特性的不利之处在于,需要付出降低性能的代价;可以通过挂载项 mount -o barrier=0来禁用此特性;

  可通过查看/proc/mounts里的barrier值 为1代表启用

4、文件的写和请求会导致其中一个int型的值不断增大,最后超出了自身范围—变成负值,就会触发该bug;

 具体原理参考下链接:

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/

5、所以我们可以通过降低文件系统的提交次数来缓解IO压力(相关参数commit);或者禁用barrier特性(相关参数barrier=0 );

升级下kernel(升级之前建议做好数据备份),重启之后查看是否生效!