脏页老化时间是什么
vm.dirty_expire_centisecs 规定脏页在内存中停留多久之后会被后台回写线程处理,默认 3000,单位是百分之一秒,也就是 30 秒。它回答的是「数据最多在内存里躺多久才开始刷盘」这个问题,属于时间维度的约束;而 vm.dirty_ratio 一类参数是容量维度的约束。两者共同决定回写行为:谁先达到条件谁触发。对落盘时效有要求的服务,这个参数比阈值类参数更值得关注。
基本信息
| 参数 | vm.dirty_expire_centisecs |
|---|---|
| 默认值 | 3000,即 30 秒(单位为百分之一秒) |
| 作用 | 限制脏页在内存中停留的最长时间 |
| 配套参数 | vm.dirty_writeback_centisecs 决定回写线程的检查周期 |
| 触发竞争 | 达到比例阈值时会提前强制回写,不必等老化时间 |
| 观测指标 | /proc/vmstat 的 nr_dirty 与内核回写相关行 |
典型使用场景
- 落盘时效敏感:希望数据更快写到磁盘上,缩小内存中滞留的时间窗
- 日志采集与审计:对崩溃时数据丢失窗口有明确要求的场景
- 排查周期性回写:观察回写是否按固定节奏发生,判断老化时间的作用
- 与阈值配合:容量阈值先触发时老化时间不起决定作用,需要一起看
- 调优验证:改小后观察 nr_dirty 的波动与写盘节奏是否变化
查看与调整
查看与调整
sysctl vm.dirty_expire_centisecs vm.dirty_writeback_centisecs # 老化时间与检查周期
sysctl -w vm.dirty_expire_centisecs=1500 # 缩短到 15 秒
grep -E 'nr_dirty|nr_writeback' /proc/vmstat # 脏页与回写中的页数
cat /proc/sys/vm/dirty_ratio # 与容量阈值一起核对
sync -f /data 2>/dev/null; echo done # 需要立即落盘时手动同步落盘与回读
落盘与回读
# /etc/sysctl.d/99-vm-writeback.conf
vm.dirty_expire_centisecs = 1500 # 脏页最多停留约 15 秒
# 回读命令:sysctl vm.dirty_expire_centisecs两类约束对照
| 约束类型 | 参数 | 关系 |
|---|---|---|
| 时间维度 | dirty_expire_centisecs | 决定脏页最长滞留时间 |
| 容量维度 | dirty_ratio 与 dirty_background_ratio | 决定按比例触发的回写时机 |
| 检查周期 | dirty_writeback_centisecs | 回写线程多久检查一次条件 |
| 谁先触发 | 两类条件取先满足者 | 高写入场景下容量阈值往往先命中 |
单位是百分之一秒:3000 表示 30 秒,把它当作秒数会把结论算反一个数量级。修改时按目标秒数乘以 100 来写,改完回读确认数值符合预期。
它只是回写的触发条件之一:写入量大的场景中,脏页比例会先达到阈值并提前强制回写,此时缩短老化时间几乎观察不到效果。调优前先确认当前是哪一类条件在起主导作用。