jbd2导致系统IO使用率高问题

收到IO占用高告警

系统信息:Linux version 2.6.32-696.18.7.1.el6.ucloud.x86_64 (root@59c188f3c79d) (gcc version 4.4.6 20120305  
(Red Hat 4.4.6-5) (GCC) ) #1 SMP Fri Jan 5 16:48:58 CST 2018 

1、到机器上看到io使用率忽高,同时iowait也高

$ iostat -d -x 1
Linux 2.6.32-696.18.7.1.el6.ucloud.x86_64 (bd-prod-acc-web0)     07/08/2019     _x86_64_    (2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     1.17    0.00    0.88     0.06    16.40    18.58     0.01   16.88    0.90   16.92   4.06   0.36
vdb               0.00     0.86    0.00    1.03     0.00    15.14    14.68     0.01   11.48    1.79   11.48   4.56   0.47

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    1.00     0.00    72.00    72.00     1.00 2387.00    0.00 2387.00 1000.00 100.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     2.06    0.00    0.00    0.00   0.00 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     1.00    0.00    0.00    0.00   0.00 100.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     3.00    0.00    0.00    0.00   0.00 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    1.00     0.00     8.00     8.00     0.51 2258.00    0.00 2258.00 513.00  51.30
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     3.00    0.00    0.00    0.00   0.00 100.00

2、找到占用高的进程

$ sudo iotop 
Total DISK READ: 0.00 B/s | Total DISK WRITE: 51.21 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
  810 be/3 root        0.00 B/s    0.00 B/s  0.00 % 99.99 % [jbd2/vdb-8] #这里看到是系统进程
 2614 be/4 root        0.00 B/s    0.00 B/s  0.00 % 99.99 % sadc -F -L -S DISK -S DISK 1 1 -
  412 be/3 root        0.00 B/s    3.94 K/s  0.00 % 99.99 % [jbd2/vda1-8]

3、jdb2进程占用IO资源较高,jdb2进程是文件系统ext4的写日志进程,占用高是内核一个bug

4、(1)升级内核
$ sudo yum update kernel 

(2)通过修改文件系统的提交次数来降低
 commit=60

或(3)重启 

Wait IO problem can be caused by several reasons, the basic road-map to find out is which process is "eating" your CPU first and then determine why. The main cause are those background processes with "D" status code which means "Uninterruptiable sleep". But the those processes with "D+" which means "Uninterruptible sleep foreground process" will generally not cause the serious problem as those background processes. In this example, the cause of Wait IO is the File System Journal, so the configuration of file system is the cause of the problem. 

By Quentin Sherman Xue - CEO  (
http://www.chileoffshore.com/en/interesting-articles/126-linux-wait-io-problem)

系统io问题的一般思路:

查看系统总体IO性能------->找到占用高的进程-------->查看进程对应的IO操作-------->结合场景分析,根据场景优化

### jbd2 的定义及其作用 jbd2 是 Ext4 文件系统的日志子系统,负责管理文件系统的事务日志[^1]。它是 Journaling Block Device (JBD) 的第二代实现,用于提文件系统的稳定性和性能。通过记录元数据更改的日志,jbd2 能够在系统崩溃或其他异常情况下快速恢复文件系统的一致性。 对于 Ext3 文件系统而言,其日志功能由 JBD 层提供,并且日志通常存储在一个名为 `.journal` 的隐藏文件中,位于文件系统的根目录下[^2]。而在 Ext4 中,则升级到了 jbd2 子系统来支持更效的日志操作。 --- ### 如何检查 jbd2 进程及相关状态 可以通过以下方法检查 jbd2 的运行情况: #### 1. 查看进程列表 使用 `ps aux | grep jbd2` 命令可以查看当前正在运行的 jbd2 相关线程。这些线程通常是内核的一部分,名称类似于 `jbd2/sda1-8` 或者 `jbd2/dm-0-8`,其中 `sda1` 表示挂载分区,数字 `-8` 则表示优先级。 #### 2. 使用 iostat 工具监控 I/O 性能 安装并运行 `iostat` 可以帮助分析磁盘 I/O 情况: ```bash sudo apt-get install sysstat iostat -dx 1 ``` 此命令会显示每秒读写次数 (`r/s`, `w/s`) 和等待时间 (`await`) 等指标。如果发现某个设备的 I/O 很,可能是由于 jbd2 日志活动引起的。 #### 3. dmesg 输出中的错误信息 当发生与 jbd2 相关的问题时,比如提交事务失败或内存不足等情况,可能会触发内核 panic 并留下调试线索。例如,在某些案例中,问题可能发生在函数 `jbd2_journal_commit_transaction()` 内部[^3]。因此,建议定期检查 `dmesg` 输出以捕获潜在警告或错误消息。 --- ### 处理 jbd2 IO 问题的方法 针对 jbd2 导致的 IO 问题,有几种常见的解决方案可供尝试: #### 方法一:调整日志模式 修改 `/etc/fstab` 文件中对应分区的选项字段,设置不同的日志策略。以下是三种主要方式之一——无日志模式(`data=writeback`): ```plaintext UUID=<partition_uuid> /mount/point ext4 defaults,data=writeback 0 1 ``` 注意,虽然这种方式能够显著降低开销,但它牺牲了一定程度的数据安全性;即未完成的操作不会被记录到 journal 中,从而增加了丢失部分更新的风险。 #### 方法二:增大 commit 时间间隔 延长两次连续提交之间的延迟有助于减少频繁的小型同步请求带来的负担。同样编辑 fstab 添加参数如下所示即可生效: ```plaintext commit=N ``` 这里的 N 单位为秒,默认值一般设为5秒钟一次刷盘动作。适当增加这个数值可以让更多改动累积后再统一持久化至硬盘上。 #### 方法三:优化硬件配置 确保使用的存储介质具备足够的带宽和低延迟能力也很重要。SSD 盘相比传统机械硬盘往往表现更好一些。另外还要考虑 RAID 控制器缓存大小等因素的影响。 #### 方法四:禁用不必要的日志功能 如果确实不需要完整的 ACID 特性保障的话,可以直接关闭日志特性。不过这种做法仅适用于那些对可靠性要求较低的应用场景当中去执行。 ```bash tune2fs -O ^has_journal /dev/<device> e2fsck -f /dev/<device> ``` 上述两条指令先移除现有标记再强制修复结构完整性之后才能彻底消除 journal 组件的存在痕迹。 --- ### 结论 综上所述,理解 jbd2 的工作机制以及掌握有效的排查手段可以帮助管理员更好地应对因它引发的各种挑战。无论是通过改变 mount 参数还是改善底层架构设计都可以有效缓解甚至完全杜绝此类现象的发生几率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值