当前位置:首页 > Linux > 正文

linux如何查看磁盘i o

使用 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%需警惕饱和风险

示例输出分析

linux如何查看磁盘i o  第1张

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")

高级分析:blktraceperf

当需要微秒级精度的事件追踪时,可使用以下工具:

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

对比randwriteseqwrite模式下的IOPS和延迟即可量化差异,通常顺序读写速度是随机读写的5-1

0