用 cp 拷几十 G 备份时同机接口每隔十几秒卡一次,iostat 显示写队列突然拉长,应用日志里没有任何异常,拷完文件就恢复正常。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,脏页攒到 dirty_ratio 上限后内核会强制同步回写,写进程被挂起等 IO,dirty_background_ratio 设得高会把这个窗口拖得更长,表现出来就是周期性卡顿,和网络无关。

碰到「脏页回写阻塞」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。改完顺手把文档补一句,省得下次自己重新推一遍。

grep -E 'Dirty|Writeback' /proc/meminfo
sysctl vm.dirty_ratio vm.dirty_background_ratio
sudo sysctl -w vm.dirty_background_ratio=5
sudo sysctl -w vm.dirty_ratio=10

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,用 sar 看每秒写入和阻塞时间是否周期出现尖刺 先确认现象;读取 meminfo 里的 Dirty 和 Writeback 观察堆积速度 涨得快说明回写跟不上;把 background 比例下调让回写提前分散到平时 不要一次改太多。

最后用这个标准收尾,再拷同样大小的文件接口没有十几秒尖刺 Dirty 稳定在几百 MB 以内。

作者 9823189