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/s和w/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/s、wkB/s和rrqm/s(读合并数)、wrqm/s(写合并数) - 如果
rrqm/s或wrqm/s很低,而r/s或w/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 列得平均读响应时间(类似iostat的await) - 第 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浏览器扫码功能使用地址


