0

0

vm.dirty_ratio / dirty_background_ratio 写脏页过多导致卡顿的调优

冰川箭仙

冰川箭仙

发布时间:2026-01-25 19:55:10

|

404人浏览过

|

来源于php中文网

原创

vm.dirty_ratio和vm.dirty_background_ratio引发卡顿的直接原因是:脏页超vm.dirty_background_ratio时后台刷盘启动,超vm.dirty_ratio(默认20%)则写操作被阻塞;现代大内存与磁盘吞吐不匹配导致100GB脏页刷盘耗时数分钟,引发wa%飙升、D状态进程堆积。

vm.dirty_ratio / dirty_background_ratio 写脏页过多导致卡顿的调优

为什么 vm.dirty_ratiovm.dirty_background_ratio 会引发卡顿

Linux 内核用这两个参数控制脏页(被修改但尚未写入磁盘的内存页)的积压上限。当脏页总量超过 vm.dirty_background_ratio(默认 10),内核在后台启动 pdflushwriteback 线程开始异步刷盘;一旦突破 vm.dirty_ratio(默认 20),所有新写操作会被阻塞,直到脏页降到该阈值以下——这就是“突然卡住”的直接原因,尤其在突发大量小文件写、日志刷盘或数据库 checkpoint 场景下极易触发。

  • 典型现象:topwa% 暴涨,iostat -x 1 显示 %util 接近 100% 且 await 超高,ps aux | grep "D" 可见大量 D 状态进程(不可中断睡眠)
  • 根本矛盾:默认值按总内存比例计算,但现代服务器内存大(如 512GB)、而磁盘吞吐有限(如单块 SATA SSD 约 500MB/s),20% 就是 100GB 脏页,全刷完可能耗时数分钟
  • vm.dirty_ratio 是硬上限,触达即阻塞;vm.dirty_background_ratio 是软启动点,差值越小,后台刷盘越激进,但也越容易抢占 I/O 资源

怎么设才不卡:看负载类型选策略

不能只盯着百分比,得结合实际写负载节奏和存储能力。关键不是“调低”,而是让脏页生成速度 ≤ 后台持续刷盘能力。

  • 高吞吐顺序写(如 Kafka 日志、视频转码输出):
    → 适当提高 vm.dirty_background_ratio(如 15)+ vm.dirty_ratio(如 25),配合增大 vm.dirty_expire_centisecs(如 6000,即 60 秒),避免频繁触发刷盘打断写流
  • 随机小写 + 高延迟敏感(如 OLTP 数据库、容器化微服务):
    → 压低两参数(如 vm.dirty_background_ratio=5vm.dirty_ratio=10),并缩短 vm.dirty_writeback_centisecs(如 500,即 5 秒),让脏页更早、更碎地刷出,减少单次阻塞风险
  • 混合负载(如 K8s 节点跑多种工作负载):
    → 折中设为 vm.dirty_background_ratio=10vm.dirty_ratio=15,并务必启用 vm.swappiness=1(抑制 swap,防止脏页和 swap 争内存)

调参后必须验证的三件事

改完 sysctl 不等于生效,也不代表问题消失。要确认内核真正按预期行为运行。

易可图
易可图

电商人都在用的设计平台

下载
  • 检查是否加载:sysctl vm.dirty_background_ratio vm.dirty_ratio,确保输出值与配置一致;若未生效,执行 sysctl -p
  • 观察实时脏页压力:grep -i dirty /proc/meminfo,重点关注 Dirty:Writeback:PagesDirty:,对比 MemTotal 看是否长期贴近 vm.dirty_ratio 限值
  • 验证刷盘节奏:echo 1 > /proc/sys/vm/drop_caches 后做一次可控写测试(如 dd if=/dev/zero of=/tmp/test bs=1M count=2000 oflag=direct),用 iostat -x 1 看 write 出现是否平滑、有无突刺式长 await

容易被忽略的关联项

单独调这两个参数常治标不治本,以下三点不处理,调了也白调。

  • vm.dirty_ratio 的单位是“占 MemTotal 的百分比”,但若启用了 cgroup v2 memory controller,容器内看到的 MemTotal 是其 memory.max 限制值,此时脏页上限按容器限额算——K8s 默认不限制 memory,但很多生产环境会设 limit,导致容器内脏页更快触顶
  • SSD/NVMe 场景下,vm.dirty_background_ratio 设太低(如 3)反而增加 I/O 次数,降低吞吐;应优先调 vm.dirty_writeback_centisecs 控制刷盘频率,而非一味压低比例
  • 某些发行版(如 RHEL 8+/CentOS 8+)默认启用 systemdMemoryMax,会覆盖全局 vm.dirty_* 设置,需在 /etc/systemd/system.conf 中显式设置 DefaultLimitMEMLOCK=infinity 并重启 systemd
实际卡顿往往不是参数错,而是没意识到脏页行为已随硬件(NVMe 队列深度)、调度器(BFQ vs mq-deadline)、甚至文件系统(XFS 的 logbsize)联动变化。调参只是入口,背后得连着 I/O 栈一起看。

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

167

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

202

2024.02.23

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

769

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号