讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux 磁盘 I/O 问题定位技巧

老辰小哥_4526

老辰小哥_4526

发布时间:2026-02-24 13:04:03

|

609人浏览过

|

来源于php中文网

原创

判断I/O瓶颈应优先看await(>10–20ms需警惕)和avgqu-sz(持续>1且await升高说明排队),而非%util;svctm已不可靠,需结合iotop -oPa、pidstat -d及/proc/pid/io等多工具分层定位。

linux 磁盘 i/o 问题定位技巧

怎么看 iostat 输出里哪个设备真在拖慢系统

直接看 %util 容易误判——它只反映设备忙闲比例,不等于瓶颈。真正关键的是 await(平均每次 I/O 等待毫秒数)和 svctm(实际服务时间),但注意:现代内核里 svctm 已不可靠,await 显著高于 10–20ms 就值得怀疑。

实操建议:

  • 用 iostat -x 1 每秒刷新,重点关注 r_await、w_await 和 avgqu-sz(平均队列长度)。若 avgqu-sz 长期 > 1 且 await 持续升高,说明请求在排队
  • 对比同类型设备:比如都是 NVMe 盘,sdb 的 await 是 sda 的 5 倍,优先查 sdb 对应的文件系统或应用逻辑
  • 别只盯 sda——有些系统把日志盘、数据库数据盘分在 nvme0n1p2 这类名字上,iostat 默认不显示完整设备名,加 -d 参数或看 /proc/partitions

用 pidstat -d 找出吃 I/O 的进程,但为什么经常漏掉

pidstat -d 只统计进程级的读写字节数,对短时高频小 IO(比如每秒几千次 4KB 写)、内存映射文件(mmap)、或通过管道/套接字间接触发磁盘写入的场景,基本不体现。

实操建议:

  • 先跑 pidstat -d 1 看大头,再立刻补一句 iotop -oPa(只显示实际在做 I/O 的线程,-P 显示进程名,-a 显示累计 I/O)
  • 注意 iotop 默认按实时吞吐排序,但“高吞吐”不等于“高延迟贡献者”。一个每秒写 1MB 的日志进程,可能比每秒写 100KB 但卡住数据库事务的进程更无害
  • 如果 iotop 里看到 java 或 postgres 占着高 I/O,别急着优化代码——先查它是否在刷脏页:cat /proc/<pid>/io | grep write_bytes</pid>,再对比 pg_stat_bgwriter(PostgreSQL)或 JVM 的 GC 日志中是否频繁触发 CMS/Full GC 导致大量对象落盘

lsof +D 扫目录很慢,还可能卡死,有没有轻量替代

lsof +D /var/log 会递归遍历所有子目录并检查每个打开文件的 inode,遇到 NFS 挂载点、坏块或权限受限路径极易卡住。而且它只告诉你“谁打开了文件”,不告诉你“此刻正在读写哪部分”。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载

实操建议:

  • 用 find /var/log -xdev -type f -printf '%p %T@\n' | sort -k2nr | head -20 快速定位最近被修改的文件,再用 lsof /var/log/app.log 精准查单个文件
  • 想看实时写入位置?sudo dd if=/dev/zero of=/tmp/test bs=4k count=100 oflag=sync 后立刻 cat /proc/diskstats,对比前后变化,能快速验证是不是某块盘响应异常
  • 更准的办法是用 perf record -e block:block_rq_issue,block:block_rq_complete -a sleep 5 抓底层块层事件,但需要 root 权限且输出需解析,日常排查够用,别一上来就上这个

为什么 vmstat 里 bi/bo 很低,但磁盘还是卡

bi(blocks in)和 bo(blocks out)是每秒传输的块数(默认 1KB/块),数值低只说明吞吐量小,不代表延迟低。比如一个应用每秒只发 10 次写请求,但每次都要等 200ms 才返回,bi 可能才 10,iostat 却显示 await=200。

实操建议:

  • 不要单独看 vmstat 判断 I/O 健康,它缺延迟维度。必须配合 iostat -x 看 await 和 svctm(尽管后者不准,但趋势可参考)
  • 如果 bi/bo 低 + iostat 的 %util 也低 + await 却高,大概率是存储侧问题:后端 RAID 卡电池故障导致写缓存禁用、SAN 存储 QoS 限速、或云盘 IOPS 配额耗尽(如 AWS gp3 未配置足够 iops)
  • 查云环境时,cat /sys/block/nvme0n1/device/model 看是不是 Amazon Elastic Block Store,然后立刻去控制台看 CloudWatch 中 VolumeIdleTime 和 VolumeQueueLength,这两个比本地工具更准

复杂点在于:I/O 延迟可能横跨内核块层、驱动、HBA、阵列控制器、网络(iSCSI/NVMe-oF)、甚至远端存储节点。定位时得一层层剥,别指望一个命令扫清全场。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3348

2023.11.20

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

828

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

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

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

4378

2023.08.10

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4629

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

647

2023.11.16

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn