sar 显示 %iowait 非常高但 iostat 看不出哪个盘特别忙的排查技巧
发布时间 - 2026-01-20 00:00:00 点击率:次iowait高但iostat无异常说明I/O等待源于非磁盘环节,需排查容器文件系统、block层延迟、tmpfs/overlayfs等伪设备及内核路径阻塞。
当 sar 显示 %iowait 持续很高(比如 >30%),但 iostat -x 1 却看不出某块磁盘的 %util、await 或 avgqu-sz 明显异常——这说明 I/O 等待不是来自“典型慢盘”,而是被系统其他环节“吃掉”了,或者 I/O 行为本身很隐蔽。这种情况常见于容器环境、文件系统层开销大、短时突发 IO、或内核路径阻塞等场景。
先确认 iowait 是否真由磁盘 I/O 引起
iowait 高 ≠ 磁盘忙。它只是 CPU 在空闲时等待 I/O 完成的时间占比。所以要排除干扰:
- 检查 CPU 是否真的有 idle 时间:如果 %idle 极低(如
- 用 vmstat 1 看 b(blocked 进程数)和 r(runnable 进程数):若 b 长期 >0,说明确有进程卡在不可中断睡眠(D 状态),这才是真 I/O 阻塞信号;
- 运行 pidstat -u 1 和 pidstat -d 1 对照看:如果 %iowait 高,但各进程的 IO KB/s 和 %io 都很低,大概率是 block 层或驱动层延迟,而非应用写得多。
盯住 block 层和 bio 路径,而不是只看设备层
iostat 只统计到 request queue 层面,对更上游的 bio 分发、合并、调度不敏感。以下命令能挖得更深:
- cat /proc/diskstats:对比各设备的 “# of IOs merged”、“# of requests”、“# of sectors read/written”,看是否大量 IO 被 merge 掉,导致 iostat 的 r/s/w/s 失真;
-
blktrace -d /dev/sda -o - | blkparse -i -(需 root):捕获真实下发的 bio 和 request 事件。重点关注 “Q”(queue)、“G”(getrequest)、“C”(complete)之间的时间差。若 Q→G 延迟长,说明 block
层调度/队列深度不足;若 G→C 很长,才指向设备或驱动问题;
- echo 1 > /sys/block/sda/stat(谨慎)+ 再读一次 /sys/block/sda/stat:可临时触发一次 stat 刷新,辅助判断是否因统计缓存导致 iostat 滞后。
排查 overlayfs、tmpfs、loop 设备等“非物理盘”路径
尤其在 K8s 或 Docker 环境中,高 iowait 常来自文件系统层,而非底层磁盘:
- 运行 findmnt -t overlay,overlayfs,xfs,ext4,tmpfs,确认是否有 overlayfs 下层(lowerdir/uppperdir)挂载在高 IO 目录;
- 查容器数据目录是否用了 emptyDir 或 hostPath 绑定到 tmpfs(内存盘):tmpfs 写满会触发 swap 或 OOM Killer,但 iostat 不显示任何磁盘活动;
- 用 lsof + grep -E "(REG|DEL)" 查高 IO 进程打开的文件路径,重点识别:
/var/lib/kubelet/pods/.../volume-subpaths/...、/dev/loop*、/tmp/xxx——这些都不是真实磁盘,但会消耗 CPU 在 copy-up、page cache 回写等操作上。
检查内核日志与 multipath/NVMe 特定行为
某些硬件/驱动问题不会让磁盘“忙”,却会让 IO 在途中卡住:
- dmesg -T | grep -i "block\|nvme\|multipath\|fail\|timeout":查找 “blk_update_request: I/O error”、“nvme 0000:01:00.0: timeout”, 或 multipath “switching to [path]” 类日志;
- NVMe 设备注意 cat /sys/class/nvme/nvme0/nvme0n1/queue_depth 和当前 cat /sys/class/nvme/nvme0/nvme0n1/io_poll_delay:队列过浅或轮询延迟设置不当,会导致大量 short-lived IO 在 kernel 中排队,但 iostat 看不出压力;
- 用 perf record -e block:block_rq_issue,block:block_rq_complete -a sleep 10 + perf script:看 issue → complete 的延迟分布,若大量请求耗时 >10ms 且未落到设备,就说明 block 层或 driver 是瓶颈。
# docker
# ai
# ios
# switch
# echo
# Error
# class
# var
# copy
# 事件
# kubelet
# issue
# 文件系统
# 会让
# 而非
# 不出
# 闲时
# 很高
# 用了
# 得多
# 这种情况
# 看不出
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在景安云服务器上绑定域名并配置虚拟主机?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
详解Android中Activity的四大启动模式实验简述
如何在橙子建站上传落地页?操作指南详解
网页设计与网站制作内容,怎样注册网站?
JavaScript如何实现音频处理_Web Audio API如何工作?
如何实现建站之星域名转发设置?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何在香港免费服务器上快速搭建网站?
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
C#如何调用原生C++ COM对象详解
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网站优化排名时,需要考虑哪些问题呢?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel storage目录权限问题_Laravel文件写入权限设置
免费视频制作网站,更新又快又好的免费电影网站?
如何快速生成ASP一键建站模板并优化安全性?
如何注册花生壳免费域名并搭建个人网站?
香港网站服务器数量如何影响SEO优化效果?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
如何在阿里云ECS服务器部署织梦CMS网站?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
昵图网官方站入口 昵图网素材图库官网入口
如何在宝塔面板创建新站点?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何在阿里云完成域名注册与建站?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
如何在搬瓦工VPS快速搭建网站?
如何在 Pandas 中基于一列条件计算另一列的分组均值
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
在Oracle关闭情况下如何修改spfile的参数
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
装修招标网站设计制作流程,装修招标流程?
如何在IIS中新建站点并配置端口与物理路径?
如何在阿里云服务器自主搭建网站?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?


