首页/系统/Linux 内核与性能调优速查/vm.dirty_expire_centisecs 脏页老化时间
sysctl 内核参数72 条

vm.dirty_expire_centisecs 脏页老化时间

脏页超过该时间(默认 3000,即 30 秒)会被后台回写线程处理;控制数据在内存中滞留的上限时长。

脏页老化时间是什么

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 来写,改完回读确认数值符合预期。
它只是回写的触发条件之一:写入量大的场景中,脏页比例会先达到阈值并提前强制回写,此时缩短老化时间几乎观察不到效果。调优前先确认当前是哪一类条件在起主导作用。

易错点

  • 按秒误读单位:该值以百分之一秒计,算错量级会得出相反结论
  • 只调老化时间期望加快落盘:高写入场景由容量阈值主导,调整看不到效果
  • 缩短老化时间却不评估写盘频率:回写变频繁会增加磁盘持续压力
  • 忽略检查周期参数:回写线程的检查间隔决定实际响应粒度
  • 把该参数当成崩溃丢数据问题的唯一手段:应用层同步写入才是强一致性方案

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • man 5 proc
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌