0

0

vmstat r 队列长期高但 cpu idle 高的 IO wait 隐藏瓶颈排查

舞姬之光

舞姬之光

发布时间:2026-02-05 18:42:09

|

454人浏览过

|

来源于php中文网

原创

r高但id高说明存在“假性CPU空闲”:大量进程卡在不可中断睡眠(D状态),堆满运行队列却不消耗CPU,也不计入iowait。

vmstat r 队列长期高但 cpu idle 高的 io wait 隐藏瓶颈排查

vmstat 中 r 高但 id 也高,说明什么?

这恰恰是典型“假性 CPU 空闲”陷阱:r(运行队列中进程数)持续 > CPU 核数,而 id(空闲 CPU)却很高(比如 >70%),wa(iowait)却不显眼——表面看 CPU 没事,实际系统已卡在 IO 路径上。根本原因不是 CPU 忙,而是大量进程卡在不可中断睡眠(D 状态),它们不消耗 CPU,也不进入 iowait(因为 iowait 只统计“CPU 空闲且等 IO”),但会堆满运行队列并拖慢响应。

为什么 pidstat -dps aux | grep " D " 必须一起用?

pidstat -d 1 能看到谁在狂写(如 WRITE_KB >50MB/s)、谁的 %io 超 30%,但它无法告诉你线程是否已卡死;而 ps aux | grep " D " 找出的是真正卡在内核 IO 路径里的进程(状态为 D)。两者结合才能确认:是应用主动刷盘(可优化),还是底层被 block 住了(如 multipath 切路径、NVMe 队列溢出、ext4 journal 锁争用)。

  • 只看 pidstat 可能误判:某个进程 IO 量不大,但它的多个线程全卡在 D,导致服务无响应
  • 只看 ps 又难定位源头:D 进程可能是数据库子进程,但真正触发它的是一条慢 SQL 或 fsync 调用
  • 实操建议:先 ps aux | grep " D " 抓 PID,再 lsof -p PID 查它正操作哪个文件或设备(如 /dev/nvme0n1p2 或容器 overlay2 卷)

iostat -x 1 里哪些字段暴露“伪低 util + 高延迟”陷阱?

%util 很低(比如 15%),但 w_await >50ms、avgqu-sz >2,就说明磁盘本身没饱和,但 IO 请求在内核层被拦住了——常见于驱动 bug、队列深度配置过小、或文件系统锁(如 XFS log stall)。这时 svctm 已弃用,但 w_await - r_await 的差值大,且 avgqu-sz 持续 >1,就是排队发生在 queue 之前(bio 层或 request 层)的信号。

  • await 高 + %util 低 → 不是磁盘慢,是下发路径堵了
  • rrqm/swrqm/s 高 → 合并请求频繁,可能 I/O 模式极碎(如大量 4KB 随机写)
  • 配合 cat /proc/diskstats 对比 ios_pgr(in flight IO 数)和 io_ticks,能验证是否真有 IO 卡在 driver 层

安卓或容器环境里,vmstatb 字段比 r 更值得盯

在受限环境(如 Android、Kubernetes Pod),r 可能被 cgroup 限频扭曲,而 b(等待 IO 的进程数)更真实反映阻塞压力。尤其当 b 持续 >0 且 bi/bo 波动剧烈时,基本可断定是底层存储(如 eMMC、UFS 或网络盘)响应不稳,而非应用问题。

  • 安卓调试必加: adb shell vmstat 1b,再 adb shell iostat -d -x 1 看具体设备(如 sdammcblk0)的 %utilawait
  • 容器中 b 高但宿主机 wa 低?说明 IO 被 cgroup blkio 限速或 throttled,查 /sys/fs/cgroup/blkio/.../blkio.io_service_bytes
  • 别迷信 wa虚拟化st(steal time)高时,wa 可能被压缩失真

真正卡住系统的,往往不是慢盘,而是那一两个卡在 D 状态、没人敢杀、又拒绝超时的线程——它们不占 CPU,不刷日志,只悄悄把整个服务拖进深渊。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

834

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

351

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1407

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

365

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

983

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

429

2024.04.29

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

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

精品课程

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

共162课时 | 15.6万人学习

Java 教程
Java 教程

共578课时 | 58万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.8万人学习

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

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