linux磁盘i/o性能瓶颈排查需依次执行五步:一、用iostat -x 1 5定位高负载设备,关注%util、await与svctm;二、用pidstat -d 1 5追踪高i/o进程;三、检查/sys/block/*/queue/参数调优队列深度与调度器;四、用blktrace捕获并分析原始i/o事件;五、核查文件系统挂载选项、日志位置及inode使用率。

当系统响应变慢、应用程序读写延迟升高时,磁盘 I/O 往往是关键瓶颈所在。以下是针对 Linux 系统开展磁盘 I/O 性能瓶颈排查的具体实践步骤:
一、使用 iostat 定位高负载设备
iostat 可提供每块磁盘的实时 I/O 统计信息,包括读写吞吐量、IOPS、平均等待时间与服务时间,帮助识别是否存在单点设备过载。
1、执行命令 iostat -x 1 5,以 1 秒间隔采样 5 次,获取扩展指标。
2、关注 %util 列:若持续接近 100%,表明该设备处于饱和状态。
3、检查 await 与 svctm:若 await 显著大于 svctm,说明 I/O 请求在队列中等待时间过长。
4、观察 r/s 和 w/s 数值,结合 rkB/s 和 wkB/s,判断是随机小 IO 还是顺序大 IO 主导负载。
二、通过 pidstat 追踪进程级 I/O 行为
pidstat 能按进程维度输出 I/O 读写字节数、每秒请求数及等待时间,用于定位产生大量磁盘操作的具体进程。
1、运行命令 pidstat -d 1 5,采集 5 次每秒的进程 I/O 数据。
2、依据 %io 字段排序,找出 I/O 占用率最高的进程。
3、结合 PID 查看对应进程名:ps -p [PID] -o pid,ppid,comm,%mem,%cpu,time。
4、对数据库或日志类进程,进一步检查其配置是否启用了同步写或未启用写缓存。
三、分析内核 I/O 调度队列深度与等待状态
/proc/diskstats 提供底层设备统计,而 /sys/block/*/queue/ 下参数可反映当前调度器行为与队列限制,有助于判断是否因队列过深或调度策略不当导致延迟上升。
1、查看设备队列深度:cat /sys/block/sda/queue/nr_requests,默认值通常为 128;过低会限制并发能力。
2、确认当前 I/O 调度器:cat /sys/block/sda/queue/scheduler,cfq 在较新内核中已被移除,noop、deadline、kyber 或 mq-deadline 更常见。
3、临时切换调度器(如适用):echo kyber > /sys/block/sda/queue/scheduler。
4、检查队列合并开关:cat /sys/block/sda/queue/iosched/quantum(仅部分调度器支持),评估请求合并效果。
四、利用 blktrace 捕获原始 I/O 事件流
blktrace 是内核级块设备跟踪工具,可记录从上层下发到设备完成的全路径事件,适用于深入分析 I/O 延迟分布与异常重试行为。
1、挂载 debugfs:mount -t debugfs none /sys/kernel/debug。
2、启动跟踪:blktrace -d /dev/sda -o sda.trace,持续数秒后按 Ctrl+C 停止。
3、生成可读报告:blkparse -i sda.trace > sda.parsed。
4、筛选高延迟写操作:awk '$4 ~ /W/ && $10 > 1000000 {print}' sda.parsed,单位为纳秒。
五、检查文件系统层影响因素
ext4/xfs 等文件系统的行为参数(如挂载选项、日志模式、预分配策略)会显著影响 I/O 性能表现,特别是元数据密集型操作场景。
1、查看当前挂载选项:findmnt -t ext4,xfs,确认是否启用 noatime、data=writeback 等优化项。
2、检查 journal 状态(ext4):dumpe2fs -h /dev/sda1 | grep -i journal,判断日志是否位于慢速设备上。
3、验证 inode 使用率:df -i /mount/point,inode 耗尽会导致新建文件失败并引发阻塞。
4、运行 xfs_info /mount/point(XFS)或 tune2fs -l /dev/sda1(ext4)获取条带宽度、RAID 对齐等关键对齐参数。











