上一篇
linux如何查看磁盘i o
- Linux
- 2025-08-11
- 2
使用
iostat
命令可查看 Linux 系统的磁盘 I
在Linux系统中,监控磁盘I/O(输入/输出)是性能调优、故障排查和资源规划的关键任务,以下从核心命令解析、进阶工具应用、关键指标解读三个维度展开详细说明,并提供完整操作示例与实战建议。
基础命令:iostat
深度解析
iostat
是sysstat工具集中的核心组件,可实时显示磁盘读写统计信息,其强大之处在于支持多维度过滤和格式化输出。
基础用法与参数说明
参数 | 作用 |
---|---|
-k |
以KB为单位显示数据(默认单位为扇区,通常512B) |
-m |
以MB为单位显示数据 |
-x |
扩展统计信息,包含CPU利用率、上下文切换次数等 |
-p [设备名] |
仅显示指定设备的统计信息(如/dev/sda ) |
-t |
显示任务时间戳 |
-c [间隔秒数] |
按指定间隔持续采集数据(需配合Ctrl+C 退出) |
-N |
显示NAS存储设备的附加信息 |
典型命令示例:
# 查看所有设备的总览统计(每秒刷新一次) iostat -k 1 # 单独监控sda设备的扩展信息(持续5次,间隔3秒) iostat -x -p /dev/sda 3 5
关键输出字段详解
字段名称 | 描述 | 异常判断标准 |
---|---|---|
tps | 每秒事务数(包括读写) | >100时可能存在压力 |
Blk_read/s | 每秒读取的块数(默认扇区数) | 突增可能表示缓存失效 |
Blk_wrtn/s | 每秒写入的块数 | 持续高位需检查日志轰炸 |
Blk_read | 总读取量(自启动以来) | 快速增长反映数据密集型负载 |
Blk_wrtn | 总写入量 | 同上 |
await | 平均等待时间(毫秒),含队列等待 | >20ms提示响应延迟 |
svctm | 平均服务时间(不含队列等待) | 应接近await值 |
%util | 设备利用率百分比 | >80%需警惕饱和风险 |
示例输出分析:
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 12.34 123.45 456.78 0.00 12345678 45678901 0
sdb 98.76 9876.54 12345.67 12.34 987654321 1234567890 123456
- sda:低负载状态,适合数据库日志盘
- sdb:高吞吐量(尤其写入),需关注
%util
是否接近100%
实时监控利器:iotop
iotop
提供类似top
的交互式界面,直观展示各进程的I/O占用情况,特别适合快速定位问题进程。
安装与启动
# Debian/Ubuntu sudo apt install iotop # RHEL/CentOS sudo yum install iotop # 启动命令 sudo iotop
界面功能详解
列名 | 说明 |
---|---|
TID | 进程ID |
PRESSURE | 进程对I/O子系统的即时压力指数(红色越深压力越大) |
PRIO | 进程优先级 |
USER | 所属用户 |
DISK READ | 当前读取速率(KiB/s) |
DISK WRT | 当前写入速率(KiB/s) |
SWAPSIN/OUT | 换入/换出速率 |
COMMAND | 进程命令路径 |
交互操作技巧
- 排序:按
R
键按读速率排序,W
键按写速率排序 - 过滤:输入
o
进入正则表达式过滤模式,可筛选特定进程 - 累积模式:按
q
切换累计模式,显示进程总消耗量 - 保存报告:按
r
生成CSV格式报告
典型场景:发现某Java进程(PID=1234)的DISK WRT持续超过10MB/s,可进一步用pidstat -d 1 1234
验证具体文件操作。
轻量级监控:dstat
dstat
以简洁的彩色终端界面提供系统整体性能概览,特别适合快速健康检查。
常用插件组合
# 基础磁盘监控(默认显示总读写速度) dstat -d # 包含网络、CPU、内存的综合监控 dstat -cdngy --disk-util --fs
特色功能
- 颜色告警:当
%util
超过阈值时自动变红 - 历史趋势:按
-->
方向键可查看最近30秒的趋势曲线 - 日志记录:通过
-f
参数将数据写入文件供后续分析
底层数据源:/proc
文件系统
对于自动化监控脚本,直接读取/proc
文件可获得原始数据。
关键文件路径
文件路径 | 内容描述 |
---|---|
/proc/diskstats |
全局磁盘统计信息 |
/proc/partitions |
分区表信息 |
/proc/[pid]/io |
单个进程的I/O计数器 |
/proc/mdstat |
软件RAID阵列状态 |
Python脚本示例
import os with open('/proc/diskstats') as f: lines = f.readlines()[2:] # 跳过前两行标题 for line in lines: parts = line.split() if parts[2] == 'sda': # 过滤目标设备 print(f"{parts[2]}: Read={int(parts[3])//2}, Write={int(parts[7])//2} sectors")
高级分析:blktrace
与perf
当需要微秒级精度的事件追踪时,可使用以下工具:
blktrace(已弃用,推荐替代方案)
现代系统推荐使用tracefs
挂载点下的调试接口:
mount -t tracefs none /sys/kernel/tracing cat /sys/kernel/tracing/available_tracers | grep block # 查看可用探针 echo 'block' > /sys/kernel/tracing/current_tracer # 启用块设备跟踪
perf工具链
# 统计所有进程的同步块设备操作延迟 sudo perf record -e block:block_rq_issue -a sleep 60 sudo perf report --stdio > blk_latency.report
常见误区与解决方案
问题现象 | 可能原因 | 解决方法 |
---|---|---|
iostat显示高await但低tps | 随机读过多导致寻道时间增加 | 考虑启用SSD或调整文件系统预读策略 |
iotop显示大量DIRTY缓冲区 | 脏页刷新不及时 | 调整vm.dirty_ratio内核参数 |
机械硬盘出现CCS错误 | 硬件故障 | 立即备份数据并更换硬盘 |
NVMe SSD写入速度骤降 | IOPS达到队列深度限制 | 调整ncq队列深度或使用多队列驱动 |
FAQs
Q1: 为什么有时iostat
显示的%util超过100%?
A: %util表示设备处于忙碌状态的时间占比,对于支持NCQ(原生命令队列)的SATA设备,单个请求可包含多个扇区,因此理论上该值可以超过100%,若持续高于120%,说明设备已严重过载。
Q2: 如何区分顺序读写和随机读写的性能差异?
A: 使用fio
工具进行基准测试:
fio --name=test --filename=testfile --direct=1 --ioengine=libaio --bs=4k --iodepth=32 --rw=randwrite --runtime=60 --group_reporting
对比randwrite
和seqwrite
模式下的IOPS和延迟即可量化差异,通常顺序读写速度是随机读写的5-1