后台回写阈值是什么
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 确认设备的写入吞吐与排队情况,再考虑参数层面的调整。