(1)vm.dirty_ratio=0
做任何操作,要在程序运行期间要对磁盘文件的数据,需要把这些数据读到内存里面去,改完之后,写进内存里面去。这个块和磁盘文件不同-->>dirty
大量的用户在磁盘上读取文件以后读到那个缓冲区里面,它到磁盘写的时候它是统一写的(写的时候你要你是要请求总线控制权的你写个十兆的东西和你写一兆的东西,对计算机来说,它调度的过程完全是一样的)
当vm.dirty_ratio=30;周期拉长了,对i/o的请求就降低了
写入吞吐更高、IO 更平滑
脏页比例变大 → 内存能攒更多写入数据
刷盘次数变少 → 单次刷盘更大、更连续→高并发写入、数据库、日志写入场景性能更好
减少频繁小 IO,降低磁盘压力
避免频繁刷小批量数据到磁盘
对机械硬盘、云盘、低性能磁盘尤其友好
CPU 占用略降
刷盘 IO 调度、中断更少
1.vm.dirty_ratio=20 → 30到底改变了 Linux 内核的什么行为。
一、先搞懂两个概念
Page Cache(页缓存)内存里用来缓存磁盘文件的区域,读写都先走这里。
Dirty Page(脏页)内存里已经被修改、但还没写回磁盘的数据。这些数据只在内存里,磁盘上还是旧的。
二、内核刷盘的两条规则
Linux 不会实时把每一次写入都刷盘,而是攒一批再批量刷,效率更高。它靠两个阈值控制:
1.vm.dirty_background_ratio(后台阈值)
当脏页占总内存达到这个比例
内核后台悄悄刷盘
不阻塞应用,业务无感
2.vm.dirty_ratio(强制阈值)
当脏页占总内存达到这个比例
内核强制阻塞所有新写入
直到脏页被刷下去,才能继续写
三、从 20 改成 30,原理上发生了什么?
允许脏页占更多内存原来脏页到 20% 就必须强制刷盘现在可以到 30% 才强制刷盘
刷盘触发得更晚内存能攒更多写入数据,再一次性刷盘
单次刷盘更大、更连续磁盘磁头 / SSD 更少随机 IO,吞吐量更高
应用阻塞发生得更少、但更猛
平时不阻塞 → 写入更快
一旦到 30% 开始阻塞 → 阻塞时间更长、延迟突刺更明显
四、用一句话总结原理
vm.dirty_ratio 越大,内核越 “懒”,越喜欢在内存里攒脏数据,等到攒很多了再一次性批量刷盘。
优点:批量 IO → 吞吐量更高、磁盘压力更小
缺点:阻塞更晚但更狠 → 延迟抖动变大;掉电丢失数据更多
五、和内存的关系(非常关键)
总内存固定:
dirty_ratio 越大 → 脏页能占用越多内存
留给文件缓存(page cache)的空间就越少→读多的业务会变慢
六、极简原理版(方便记)
20:脏数据攒到内存 20% → 立刻强制刷盘
30:脏数据攒到内存 30% → 才强制刷盘
本质就是:让内核更敢用内存当写入缓冲区,牺牲一点稳定性和安全性,换更高写入吞吐量。