Linux基础——脏页dirty计算方法及排查
要判断系统中脏页(Dirty Pages)的具体读写量,并明确 vm.dirty_ratio = 60 中 60% 对应的实际内存值,需通过以下步骤分析和计算:
1. 确认系统可用内存(MemAvailable)
vm.dirty_ratio 的百分比是基于 可用内存(MemAvailable) 计算的,而非总内存(MemTotal)。
通过以下命令获取关键内存指标:
cat /proc/meminfo | grep -E "MemTotal|MemAvailable|Dirty"
输出示例:
MemTotal: 32780504 kB # 系统总内存 MemAvailable: 24602012 kB # 当前可用内存(含可回收缓存) Dirty: 5120 kB # 当前脏页大小
2. 计算 vm.dirty_ratio = 60 对应的实际阈值
-
公式:
脏页阈值(KB)=MemAvailable×vm.dirty_ratio100脏页阈值(KB)=100MemAvailable×vm.dirty_ratio -
示例计算:
24602012×0.6=14761207 kB≈14.1 GB24602012×0.6=14761207 kB≈14.1 GB
若MemAvailable = 24602012 kB,则:-
当脏页达到 14.1 GB 时,触发同步回写。
-
3. 监控脏页的实时读写量
(1)查看当前脏页大小
cat /proc/meminfo | grep Dirty
输出:
Dirty: 5120 kB # 当前脏页量为 5 MB Writeback: 32 kB # 正在回写中的脏页量
(2)动态监控脏页变化
使用 watch 命令实时观察:
watch -n 1 "cat /proc/meminfo | grep -E 'Dirty|Writeback'"
-
Dirty:待写入磁盘的脏页量。 -
Writeback:正在回写中的脏页量。
(3)通过 vmstat 查看全局 I/O 状态
vmstat 1 5
关注 memory 列的 dirty 和 writeback 字段,以及 io 列的磁盘写入量(bo)。
4. 判断脏页读写行为是否触达阈值
-
场景分析:
-
脏页接近 60% 阈值:
若Dirty值持续接近14.1 GB(示例值),说明应用程序写入速度远超磁盘回写能力,可能引发同步阻塞。 -
突发写入高峰:
短时间内Dirty快速上升,可能直接触发vm.dirty_ratio限制。
-
-
调优依据:
-
若频繁触发同步回写(卡顿),需:
-
提高
vm.dirty_ratio(牺牲安全性换取性能)。 -
降低
vm.dirty_background_ratio(让后台回写更早启动)。
-
-
若担心数据丢失,需降低阈值并缩短
vm.dirty_expire_centisecs(脏页最大驻留时间)。
-
5. 结合存储性能综合评估
-
磁盘速度测试:
通过fio或dd测试磁盘实际写入速度,判断系统是否能及时处理脏页。dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct -
回写延迟观测:
使用iostat监控磁盘利用率(%util)和响应时间(await):iostat -x 1
总结
-
计算阈值:
vm.dirty_ratio=60的实际值 =MemAvailable × 60%(如示例中的 14.1 GB)。 -
监控状态:
通过/proc/meminfo和vmstat实时跟踪Dirty和Writeback。 -
调优决策:
-
脏页频繁触达阈值 → 调整
vm.dirty_*参数或升级磁盘 I/O 能力。 -
关注数据安全 → 降低阈值并启用更频繁的后台回写。
-
通过以上方法,可明确脏页读写量与 vm.dirty_ratio 的关联性,并针对性优化系统性能。
浙公网安备 33010602011771号