首页/系统/Linux 内核与性能调优速查/vm.dirty_background_ratio 后台回写阈值
sysctl 内核参数72 条

vm.dirty_background_ratio 后台回写阈值

脏页占内存比例达到该值(默认 10)时启动后台回写线程异步刷盘;与 dirty_ratio 一前一后控制回写节奏。

后台回写阈值是什么

vm.dirty_background_ratio 是启动后台回写线程的脏页比例阈值,默认 10,按可回收内存计算。脏页比例越过它,内核在后台异步把数据刷向磁盘,写入进程本身不被阻塞。它与 vm.dirty_ratio(默认 20)构成一前一后的两道阈值:前者决定异步回写何时开始,后者决定写进程何时被强制拉入同步回写。两者之间的距离决定了系统吸收写入突发的缓冲空间。

基本信息

参数vm.dirty_background_ratio(百分比,默认 10)
触发动作后台回写线程开始异步刷盘
后继阈值vm.dirty_ratio 达到后被强制同步回写
定量替代vm.dirty_background_bytes 直接指定字节数,与 ratio 互斥
观测指标/proc/vmstat 的 nr_dirty 与 nr_writeback
配套思路结合存储设备的写入能力一起评估,而不是单独调参

典型使用场景

  • 数据库写入敏感性:希望拼写更平滑,把后台阈值调低让回写更早开始
  • 大内存主机:按比例算出的绝对量过大,突发回写更剧烈
  • 排查写延迟尖刺:确认尖刺出现时脏页比例是否已越过同步阈值
  • 日志密集写入:持续写入场景下用更早的异步回写削平峰值
  • 调优对比:观察调整前后 nr_dirty 的波动幅度是否收敛

观察与调整

观察与调整
sysctl vm.dirty_background_ratio vm.dirty_ratio   # 读两档阈值
watch -n1 'grep -E "nr_dirty|nr_writeback" /proc/vmstat'   # 实时观察脏页与回写
sysctl -w vm.dirty_background_ratio=5              # 让异步回写更早开始
iostat -x 1 5                                      # 设备侧的利用率与排队情况
sar -r 1 5                                         # 历史视角的脏页占比

落盘与回读

落盘与回读
# /etc/sysctl.d/99-vm-writeback.conf
vm.dirty_background_ratio = 5    # 提前启动异步回写,削峰
vm.dirty_ratio = 15               # 同步回写阈值同步下调,保持两档之间的缓冲
# 回读命令:sysctl vm.dirty_background_ratio vm.dirty_ratio

两档阈值关系

情况行为观察到的现象
低于后台阈值仅靠应用写触发刷盘写入延迟低,磁盘空闲
越过后台阈值后台异步回写启动写入不阻塞,磁盘利用率上升
越过同步阈值写入进程被拉入同步等待出现延迟尖刺,应用写入卡顿
两档距离过小很快进入同步回写抖动频率高,写入体验不稳定
只调这一项通常效果有限:异步回写的起点提前了,但同步回写的阈值没变,脏页仍会增长到同一水平。两档阈值需要一起规划,保留足够的缓冲空间吸收突发写入。
回写速度最终受设备能力限制:参数调得再细致,如果磁盘无法及时消化脏页,脏页总量仍会累积。排障时先用 iostat 确认设备的写入吞吐与排队情况,再考虑参数层面的调整。

易错点

  • 只调后台阈值不同步下调同步阈值:两档距离被拉大,同步回写时的压力更集中
  • 把参数调优当成解决设备瓶颈的手段:磁盘写不动时调参无效,先用 iostat 核实
  • 大内存主机沿用百分比直觉:绝对量远大于小内存机器,突发回写压力更明显
  • 忽略两个定量参数互斥:同时设置 ratio 与 bytes 时后者会覆盖前者,效果与预期不符
  • 不做前后对比:脏页波动幅度与业务延迟都要一起观察才能判断收益

数据来源与参考

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