回写周期是什么
内核把写操作先落在页缓存形成脏页,再由后台回写线程刷到磁盘。vm.dirty_writeback_centisecs 决定回写线程多久醒一次检查脏页(默认 500,即 5 秒),vm.dirty_expire_centisecs 决定脏页存活多久算老化、必须写出(默认 3000,即 30 秒)。两者管的是节奏而不是总量;总量由 dirty_ratio 与 dirty_background_ratio 控制。参数单位都是百分之一秒。
基本信息
| 参数名 | vm.dirty_writeback_centisecs |
|---|---|
| 默认值 | 500(即 5 秒) |
| 单位 | 百分之一秒(centisecs) |
| 配套参数 | vm.dirty_expire_centisecs 决定哪些脏页够老、可写 |
| 总量参数 | vm.dirty_ratio 与 vm.dirty_background_ratio 管脏页上限 |
典型使用场景
- 写延迟毛刺排查:回写集中触发时盘上排队,写请求被拖慢
- 区分设备类型:SSD 随机写代价低可缩小周期,机械盘更怕频繁小写入
- 云盘与网络存储:回写模式与本地盘差异大,需要单独建基线
- 批量写任务调优:先看 /proc/vmstat 的脏页与回写趋势再动参数
- 数据库与日志盘评估:确认是否与应用自身刷盘机制冲突
查看与调整
查看与调整
sysctl vm.dirty_writeback_centisecs vm.dirty_expire_centisecs # 查看两个周期
sysctl -w vm.dirty_writeback_centisecs=200 # 临时改为 2 秒
sysctl -w vm.dirty_expire_centisecs=1500 # 老化时间改为 15 秒
grep -E 'nr_dirty|nr_writeback' /proc/vmstat # 脏页与回写中的页数
iostat -x 1 5 # 盘上写延迟与队列深度
watch -n1 "grep -E 'Dirty|Writeback' /proc/meminfo" # 脏页字节数趋势
sync && echo 3 > /proc/sys/vm/drop_caches 2>/dev/null || true # 谨慎:会清缓存,勿在线上随意执行相关参数对照
| 参数 | 默认 | 作用 |
|---|---|---|
| dirty_writeback_centisecs | 500(5s) | 回写线程唤醒周期,决定检查节奏 |
| dirty_expire_centisecs | 3000(30s) | 脏页存活多久判定老化并优先写出 |
| dirty_background_ratio | 10 | 脏页占比超此值即后台回写,不阻塞写入 |
| dirty_ratio | 20 | 占比超此值时写操作被同步阻塞直至落盘 |
周期调小让回写更细水长流,SSD 上开销可控;机械盘上更频繁的小写入会增加寻道成本,收益可能是负的。
这两个参数只改变回写的时间分布,不改变总写入量;要真正减轻盘上压力应从应用写模式与批量大小入手。