登入后台面板发现磁盘一直在读写,这个问题已经很久了,只是懒得弄。这次就一次性把他解决掉吧。
直接使用systat工具箱内工具pidstat查看有关于进程的磁盘读写状态。
可以发现每隔几秒就会有一个进程进行读写,是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 的读写。
发表回复