dirty_ratio 是什么
vm.dirty_ratio 是脏页占比的硬阈值,默认 20,按可回收内存计算。写入数据先落在页缓存里成为脏页,内核在后台异步刷盘;如果写入速度持续高于回写速度,脏页比例涨到这个阈值,内核就会让正在写文件的进程自己去做同步回写并阻塞等待。这个从异步转同步的切换点,是应用观测到写延迟尖刺(常说写抖动、写卡顿)的最常见来源。
基本信息
| 参数 | vm.dirty_ratio(百分比,默认 20) |
|---|---|
| 触发行为 | 达到阈值后写进程被迫参与同步回写并阻塞 |
| 前一道阀值 | vm.dirty_background_ratio(默认 10)启动后台异步回写 |
| 定量替代 | vm.dirty_bytes 可直接指定字节数,与 ratio 二者只保留其一 |
| 观测指标 | /proc/vmstat 的 nr_dirty 与 nr_writeback |
| 配套工具 | iostat 看设备消化能力,sar 看历史趋势 |
典型使用场景
- 数据库服务器:写日志与刷数据时出现周期性延迟尖刺,需要确认是否脏页触顶
- 大内存主机:按比例计算出的阈值绝对值很大,突发回写压力比小内存机器更可观
- 排查写卡顿:区分是脏页阈值触发同步回写,还是存储设备本身已达瓶颈
- 调优实验:降低阈值让回写更平滑,观察延迟分布的改善
- 容器与共享主机:评估邻居的大批写入是否通过内存回收间接影响自身
观察与调整
观察与调整
sysctl vm.dirty_ratio vm.dirty_background_ratio # 读两个阈值
cat /proc/vmstat | grep -E 'nr_dirty|nr_writeback' # 当前脏页与回写中的页数
sar -r 1 5 # 观察脏页占比的历史变化
iostat -x 1 5 # 设备利用率与排队深度
sysctl -w vm.dirty_ratio=10 # 临时降低硬阈值落盘与回读
落盘与回读
# /etc/sysctl.d/99-vm-writeback.conf
vm.dirty_ratio = 10 # 写敏感服务常用 10~15
vm.dirty_background_ratio = 5 # 更早启动异步回写,削峰
# 回读命令:sysctl vm.dirty_ratio vm.dirty_background_ratio脏页指标读法
| 指标 | 含义 | 正常与异常 |
|---|---|---|
| nr_dirty | 当前脏页数量(单位页) | 周期性地冲到阈值附近说明回写能力不足 |
| nr_writeback | 正在回写中的页数 | 与 nr_dirty 同步走高说明设备忙不过来 |
| 设备利用率 | 磁盘繁忙程度百分比 | 长时间接近满值说明瓶颈在设备而非阈值 |
| 写延迟分布 | 应用侧观测的写入耗时 | 出现周期性尖刺通常与同步回写相关 |
按比例设定在大内存机器上会被放大:256GB 内存按 20% 计算意味着约 51GB 脏页才触发同步回写,一旦触发,回写压力与延迟尖刺都比小内存机器明显。这类场景更适合改用 vm.dirty_bytes 直接给出绝对上限。
降低阈值能减小单次回写峰值,但会提高回写频率、增加对存储的持续压力。如果设备的写入能力本身就吃紧,压阈值只会让抖动更频繁,需要先解决存储侧问题。