首页/系统/Linux 内核与性能调优速查/vm.dirty_writeback_centisecs 回写周期
sysctl 内核参数72 条

vm.dirty_writeback_centisecs 回写周期

内核回写线程的唤醒周期(默认 500,即 5 秒),决定脏页被检查与写出的节奏。

回写周期是什么

内核把写操作先落在页缓存形成脏页,再由后台回写线程刷到磁盘。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_centisecs500(5s)回写线程唤醒周期,决定检查节奏
dirty_expire_centisecs3000(30s)脏页存活多久判定老化并优先写出
dirty_background_ratio10脏页占比超此值即后台回写,不阻塞写入
dirty_ratio20占比超此值时写操作被同步阻塞直至落盘
周期调小让回写更细水长流,SSD 上开销可控;机械盘上更频繁的小写入会增加寻道成本,收益可能是负的。
这两个参数只改变回写的时间分布,不改变总写入量;要真正减轻盘上压力应从应用写模式与批量大小入手。

易错点

  • 把周期与老化混为一谈:只调周期不改老化,够老的脏页仍要等下一轮检查才写出
  • 单位按秒填写:本参数单位是百分之一秒,填 5 只等于 0.05 秒,等于把周期调到极限
  • 在云盘或网络存储上照搬本地盘经验:远程存储对回写模式敏感,调整前应先用 iostat 建立基线
  • 只看 meminfo 的瞬时 Dirty 值就判异常:脏页是设计中的缓存,要看趋势与回写是否跟得上
  • 一次改多个脏页参数:出问题无法区分是哪个参数导致,应逐个变更并观察

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • Linux 内核 Documentation/admin-guide/mm/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌