doupoa
一个不甘落后的热血青年!
Ping通途说

[jdb2]Linux下磁盘一直读写问题追踪

登入后台面板发现磁盘一直在读写,这个问题已经很久了,只是懒得弄。这次就一次性把他解决掉吧。

https://doupoa.site/wp-content/uploads/2024/01/1705563706-image.png

直接使用systat工具箱内工具pidstat查看有关于进程的磁盘读写状态。

https://doupoa.site/wp-content/uploads/2024/01/1705563849-image.png

可以发现每隔几秒就会有一个进程进行读写,是jbd2。

网上一查,jdb是Linux文件系统的日志功能,jbd2 是 ext4 文件系统版本。

该问题为Linux内核的一个bug,可以追寻该bug的bug号:

Bug 39072 - jbd2 writes on disk every few seconds

解决办法

方案一

关闭日志功能

tune2fs -o journal_data_writeback /dev/vda1
tune2fs -O "^has_journal" /dev/vda1
e2fsck -f /dev/vda1

如果使用 tune2fs 时候,提示 disk 正在 mount,如果是非系统盘下,你可以使用:

fuser -km /home #杀死所有使用/home下的进程
umount /dev/vda1 #umount

之后在使用上面的命令进行移除 has_journal。

方案二

如果是 bug 的话,可以用这种方式解决。如果是不是 bug,这种方式也解决不了,所以要先判断下引起问题的原因再选择解决方案。

升级系统内核:

sudo apt-get update && sudo apt-get dist-upgrade

sudo apt -t bullseye-backports install linux-image-amd64
sudo apt -t bullseye-backports install linux-headers-amd64

方案三

禁用 Barrier 的同时修改 commit 的值。这个方式可以解决 barrier 引起的性能下降,但是解决不了系统 bug 的问题。

修改 commit 值,降低文件系统提交次数或者禁用 barrier 特性;

建议文件系统参数为:

defaults,noatime,nodiratime,barrier=0,data=writeback,commit=60

然后重新挂载

mount -o remount,commit=60 /data

其中 barrier=0 是禁用 barrier 特性,commit=60 是减少提交次数。减少提交次数只能缓解。

方案四

如果不是 bug,并且不想禁用 barrier 时,用此方式缓解。

想尽办法降低 IO,缓解 IO 压力。这种方式也会导致其他系统资源用不上去。 比如说在 mysql 中把 syncbinlog 加大,同时将innodbflushlogattrxcommit 增加。 比如说在应用中减少 IO 的读写。

赞赏

doupoa

文章作者

诶嘿

发表回复

textsms
account_circle
email

Ping通途说

[jdb2]Linux下磁盘一直读写问题追踪
登入后台面板发现磁盘一直在读写,这个问题已经很久了,只是懒得弄。这次就一次性把他解决掉吧。 直接使用systat工具箱内工具pidstat查看有关于进程的磁盘读写状态。 可以…
扫描二维码继续阅读
2024-01-18

Optimized by WPJAM Basic