1.详细描述
在4.19.90 - 17内核的机器上偶现(部分机器大概2周一次)IO夯死的现象(dmesg 中显示某进程 blocked for more than 120 seconds, 后面接着Call trace),并伴随有ssh登录不上的问题出现.
复现步骤:
很难复现,我们在研发过程中通过修改过内核代码(加剧问题暴露)的内核才能复现。
1. 大部分测试机用上我们 添加代码加剧现象的的内核 从外部scp一个4G左右的 iso 文件到虚拟机内部就在拷贝过程就会慢慢发现拷贝速度降到 几百K,这时候肯定是IO被阻塞了, 大概120秒后就可以在dmesg中看到 (blocked for more than 120 seconds )报错信息.
2. 我们也遇到过这样没有出现阻塞的机器,这时候我们继续加大IO,在scp的过程中,也给相同块设备的挂载点dd if=/dev/urandom of=/xxx/dest/path/xxxfile bs=1M count=4000, 这样我们基本都能看到以上问题的现象。
3. 这些的前提是得换上我们加剧现象的调试内核才能复现。
原因:内核的WBT模块, 有个判断自己是不是第一个IO waiter的地方在多线程情况下会有判断非原子性的逻辑问题。会导致某些被阻塞的IO一直无法被唤醒,导致块设备无法写入。
影响:会影响之前发布的4.19内核的版本
规避方案:通过 echo 0 > /sys/block/设备/queue/wbt_lat_usec 关闭这个模块,就不会有卡在wbt的D状态进程了。
修复方案:升级内核(Version 4.19.90-23.18.v2101)
【注意事项】
需要重启生效;