0

0

vmstat bi/bo 极高但无明显 IO 进程的 page cache 回写压力分析

舞夢輝影

舞夢輝影

发布时间:2026-01-26 19:33:48

|

238人浏览过

|

来源于php中文网

原创

高bi/bo但top/iotop无活跃IO进程,通常是内核后台刷脏页(flush-*线程)所致,因vmstat统计内核级IO而上层工具仅显示用户态进程;可通过/proc/meminfo查Dirty/Writeback、perf抓块层请求、调低dirty_background_ratio验证。

vmstat bi/bo 极高但无明显 io 进程的 page cache 回写压力分析

bi/bo 高但 topiotop 看不到活跃 IO 进程?先确认是不是 page cache 回写

这是典型「磁盘在忙,但人找不到谁在用」的场景。根本原因往往是内核在后台批量回写脏页(dirty pages)到磁盘,而这些操作不绑定具体用户进程,iotop 默认只显示用户态进程的 IO,top 更是完全不展示 IO 源头。vmstatbi(块读)和 bo(块写)是内核级统计,真实反映底层块设备活动,所以它“看得见”,而上层工具“看不见”。

  • bo 持续 > 1000(单位:blocks/s)且 wa > 15%,同时 free 内存充足、swpd = 0 → 基本可排除 swap 压力,聚焦 page cache 回写
  • 运行 cat /proc/vmstat | grep -E "pgpgin|pgpgout|pgmajfault|pgpgin",若 pgpgout(页出)速率远高于 pgpgin(页入),说明大量脏页正被刷出
  • 检查 /proc/sys/vm/dirty_ratio/proc/sys/vm/dirty_background_ratio:若前者接近 80 且后者设为 10,而当前 dirty 内存已占物理内存 7–8%,就会触发激进回写

如何验证 page cache 是否正在高压回写

别只盯 vmstat 输出,要联动看内存脏页状态和内核回写行为:

  • 执行 grep -i dirty /proc/meminfo,重点关注:Dirty:(当前脏页 KB)、Writeback:(正在回写的 KB)、DirtyRatio:(触发直接回写的阈值 %)
  • watch -n 1 'cat /proc/meminfo | grep -i -E "dirty|writeback"' 动态观察:若 Dirty 在缓慢下降、Writeback 波动剧烈(如从 0 突增至 200MB+),就是后台回写线程(flush-*)在工作
  • 查进程:ps aux | grep flush,你会看到类似 [flush-253:0] 的内核线程 —— 它们不显示在 top 的 CPU 排行榜里,但确实在驱动磁盘写入

常见诱因与误判陷阱

不是所有高 bi/bo 都是“问题”,但容易被当成 IO 瓶颈误调:

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载
  • 日志服务突发刷盘:比如 rsyslogjournald 收集大量日志后,批量 fsync → 触发脏页集中回写,iotop 可能只看到瞬间的 journald 写入,但 vmstat 持续录到 bo 高峰
  • ext4 的 journal 提交:即使应用没显式写文件,ext4 日志机制也会周期性提交元数据,产生稳定 bo,尤其在小文件密集写场景下
  • 误把 buffer/cache 释放当压力:执行 echo 3 > /proc/sys/vm/drop_caches 后,bo 会飙升 —— 这是主动刷 cache,不是系统故障,但新手常因此 panic
  • RAID 卡缓存策略干扰:如果启用了 write-back 缓存但电池失效,控制器可能降级为 write-through,导致 bo 值虚高且延迟突增,此时 iostat -x%utilawait 才是关键指标

定位真实源头的三步实操法

绕过“看不到进程”的困境,直接抓内核 IO 路径:

  • 第一步:用 perf record -e block:block_rq_issue -a sleep 10 录制块层请求,再 perf script | head -20 看哪些进程/内核路径发出最多 WRITE 请求(注意:flush-* 线程会高频出现)
  • 第二步:检查 /sys/block/*/stat,对比各磁盘的第 5 列(写入完成次数)和第 9 列(写入扇区数),若某盘 bo 主要来自它,再查该盘挂载的文件系统是否有大日志、数据库 WAL 或临时文件目录
  • 第三步:临时降低回写激进度:echo 5 > /proc/sys/vm/dirty_background_ratio(让后台回写更早启动,避免堆积爆发),并观察 vmstat 1bo 是否从脉冲式变为平缓持续 —— 若是,就坐实了 page cache 管理策略问题

真正难处理的,从来不是 bo 多高,而是脏页生成速度长期超过磁盘持续写入能力。这时候调参数只是缓解,得回头查应用是否在频繁 open(O_SYNC)、是否日志轮转策略不合理、或容器里没限制 memory.swap.max 导致 cgroup 层面脏页失控 —— 这些细节,vmstat 不说,但数据在那儿。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

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

395

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

502

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

356

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2078

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

348

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.09

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

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

精品课程

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

共32课时 | 4.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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