Linux 磁盘 IO 性能瓶颈分析方法

发布时间 - 2026-01-29 00:00:00    点击率:
%util接近100%却无卡顿,因它仅统计队列非空时间,不反映延迟;SSD/NVMe并发强,高%util可能仅表示高吞吐、深队列;应重点关注await、avgqu-sz及iostat -x扩展指标。

怎么看 iostat 输出里 %util 接近 100% 却没卡顿?

%util 表示设备忙于处理 I/O 请求的时间百分比,但它的计算方式是“任意时刻只要队列里有请求就记为忙”,并不反映实际响应延迟。SSD 或 NVMe 设备并发能力强,%util 高可能只是队列深、吞吐大,而非瓶颈。

真正关键的是 await(平均 I/O 等待时间)和 svctm(服务时间),但注意:在现代内核(2.6.34+)中 svctm 已被弃用,恒为 0,不可信。

  • 优先看 await > 10ms(HDD)或 > 1ms(SSD)是否持续

    出现
  • 结合 r/sw/s 判断是读多还是写多导致等待升高
  • iostat -x 1 开启扩展统计,重点关注 avgqu-sz(平均队列长度)——若远大于 1,说明应用发请求太快,底层来不及消化

iotop 显示某进程 IO 很高,但 top 里 CPU 占用很低,正常吗?

完全正常。I/O 密集型进程大部分时间在等待磁盘响应,处于 D(uninterruptible sleep)状态,不计入 top 的 CPU 使用率,但会被 iotop 捕获。

要确认是不是真由它引起瓶颈,得看它触发的是随机 I/O 还是顺序 I/O:

  • pidstat -d -p 1 查看该进程的 rkB/swkB/srrqm/s(读合并数)、wrqm/s(写合并数)
  • 如果 rrqm/swrqm/s 很低,而 r/sw/s 很高,大概率是小块随机读写(如数据库索引扫描、日志刷盘)
  • lsof -p 看它打开的文件,再结合 filefrag -v 检查是否文件碎片严重

为什么 fio 测试结果和生产环境 IO 表现差很远?

fio 默认配置模拟的是理想化负载,和真实业务差异极大。常见脱节点包括:

  • 没设 --filename 指向实际业务数据盘,而是测了系统盘或 tmpfs
  • -ioengine=sync 测延迟,但生产 MySQL/PostgreSQL 默认走 libaio + direct I/O,必须加 --ioengine=libaio --direct=1
  • 块大小设成 -bs=4k 却没配 --rw=randread,实际业务混合了读写、不同 offset、带 metadata 操作
  • 漏掉文件系统缓存影响:测试前忘执行 echo 3 > /proc/sys/vm/drop_caches,导致反复读同一块数据全走 page cache

更贴近生产的方法是用 blktrace 录制真实 IO 模式,再用 blkparse + fio --read_iolog 回放。

哪些 /proc/diskstats 字段最值得监控?

直接读 /proc/diskstats 可避开工具开销,适合嵌入监控脚本。每行 14 列,关键字段按位置是:

  • 第 4 列:reads completed(成功读请求数),对比第 8 列 writes completed 看读写比例
  • 第 5 列:reads merged,值大说明内核做了大量读请求合并,通常是顺序读;值小且第 4 列高,倾向随机读
  • 第 9 列:time spent reading (ms),除以第 4 列得平均读响应时间(类似 iostatawait
  • 第 13 列:IO in progress(当前活跃 I/O 数),瞬时值 > 1 说明有排队,持续 > 2 基本可判定队列积压

注意:这些是累加值,需两次采样做差分。别直接用第 13 列做告警阈值——它只反映某一纳秒快照,抖动极大。


# mysql  # linux  # 工具  # ai  # ios  # 性能瓶颈  # 为什么  # echo  # 并发  # postgresql  # 数据库  # 的是  # 很高  # 很低  # 却没  # 重点关注  # 看它  # 已被  # 两次  # 再用  # 而非 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  EditPlus中的正则表达式 实战(4)  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何在 React 中条件性地遍历数组并渲染元素  如何利用DOS批处理实现定时关机操作详解  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  重庆市网站制作公司,重庆招聘网站哪个好?  高防服务器:AI智能防御DDoS攻击与数据安全保障  phpredis提高消息队列的实时性方法(推荐)  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在IIS7中新建站点?详细步骤解析  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel如何创建自定义Artisan命令?(代码示例)  如何用AWS免费套餐快速搭建高效网站?  ,交易猫的商品怎么发布到网站上去?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何快速配置高效服务器建站软件?  利用JavaScript实现拖拽改变元素大小  如何破解联通资金短缺导致的基站建设难题?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何在Windows环境下新建FTP站点并设置权限?  JavaScript如何实现继承_有哪些常用方法  JavaScript如何实现音频处理_Web Audio API如何工作?  Laravel如何使用Collections进行数据处理?(实用方法示例)  成都网站制作公司哪家好,四川省职工服务网是做什么用?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Linux系统运维自动化项目教程_Ansible批量管理实战  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  手机网站制作与建设方案,手机网站如何建设?  如何在建站之星绑定自定义域名?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  独立制作一个网站多少钱,建立网站需要花多少钱?  如何获取上海专业网站定制建站电话?  php结合redis实现高并发下的抢购、秒杀功能的实例  JavaScript实现Fly Bird小游戏  Laravel如何为API生成Swagger或OpenAPI文档  高防服务器租用如何选择配置与防御等级?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址