核心是调整vm.dirty_background_ratio和vm.dirty_ratio:前者触发后台异步刷盘,后者导致进程同步阻塞;推荐高吞吐设为15/30、高安全设为5/10、通用设为10/20,需配合dirty_expire_centisecs等参数协同优化。

核心是调整两个关键参数:vm.dirty_background_ratio 和 vm.dirty_ratio,它们共同控制内核何时、以何种方式把内存中被修改过的页(脏页)写回磁盘。
理解两个阈值的作用
脏页写回不是“一改就刷盘”,而是靠这两个百分比阈值触发不同行为:
- vm.dirty_background_ratio:当脏页总量占系统总可用内存的比例达到该值时,内核自动启动后台线程(如 writeback)异步刷盘。这个过程对应用基本无感。
- vm.dirty_ratio:当脏页比例进一步升高、触及该上限时,所有触发 write() 的进程会被强制阻塞,同步等待部分脏页落盘,直到比例回落。这会直接拖慢写入性能。
推荐配置策略
没有绝对最优值,需结合业务特征和硬件可靠性权衡:
- 对于高吞吐写入型服务(如日志采集、消息队列、OLTP数据库),可适当提高两者以减少频繁 I/O 中断: vm.dirty_background_ratio = 15,vm.dirty_ratio = 30
- 对于强调数据安全或运行在不稳定电源环境的服务器,建议保守设置,避免断电丢数据: vm.dirty_background_ratio = 5,vm.dirty_ratio = 10
- 通用平衡建议(多数 Web/中间件场景): vm.dirty_background_ratio = 10,vm.dirty_ratio = 20 —— 后者通常是前者的 2 倍左右,保持合理缓冲空间。
如何生效与验证
临时生效(重启失效):
sudo sysctl -w vm.dirty_background_ratio=10
sudo sysctl -w vm.dirty_ratio=20
永久生效:写入 /etc/sysctl.conf 或新建 /etc/sysctl.d/99-dirty.conf,添加两行后执行 sudo sysctl --system。
验证当前值:sysctl vm.dirty_background_ratio vm.dirty_ratio
观察实际脏页状态:cat /proc/meminfo | grep -i dirty
配套注意事项
单独调参效果有限,还需关注关联项:
- 确保 vm.dirty_ratio 不超过 40,过高易引发内存压力下系统响应迟滞甚至 OOM killer 干预;
- 若使用 SSD 或 NVMe,可配合 vm.dirty_expire_centisecs(默认3000,即30秒)适当延长脏页驻留时间,进一步摊平 I/O 峰值;
- 禁用 swap 或调低 vm.swappiness(如设为 1)有助于减少因换页干扰脏页管理逻辑;
- 避免与应用层缓存(如 Redis、Kafka 自身日志刷盘)策略冲突,应整体评估写入路径延迟来源。











