IO
确认 I/O 是否是瓶颈,需要从多个角度综合判断, 瓶颈可能体现在磁盘、文件系统甚至内核调度上。
1. 使用系统工具监控 I/O
Linux 常用:
iostat1
iostat -x 1
%util高接近 100% → 磁盘基本饱和。await高 → 每次 I/O 延迟大。r/s和w/s→ 每秒读写次数,衡量吞吐能力。
iotop- 实时显示哪个进程在进行 I/O 以及占用的 I/O 带宽。
- 可以确认是单个进程占用过多 I/O 还是多个进程平均分摊。
vmstat1
vmstat 1
bi/bo字段表示每秒块设备读写量。wa字段表示 CPU 等待 I/O 的百分比,高的话说明 I/O 成为 CPU 等待瓶颈。
dstat/perf stat- 更细粒度监控吞吐量、延迟和上下文切换。
2. 检查磁盘吞吐能力
测试磁盘最大写入带宽:
1
dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct
oflag=direct避免缓存干扰。- 如果测试带宽接近你程序的写入量,磁盘可能就是瓶颈。
同理,可以测试并发读写:
1
fio --name=randrw --rw=randrw --bs=4k --size=1G --numjobs=10 --runtime=60 --group_reporting
fio可以模拟多线程读写负载,测出 IOPS 和吞吐量。
3. 观察系统行为
CPU vs I/O 时间:
top或perf top中如果 CPU 很空闲,程序主要在等待 I/O → I/O 瓶颈。
延迟累积:
- 如果程序写入文件很慢,但 CPU 使用低且磁盘高负载 → 瓶颈在 I/O。
锁与等待:
- 并发写入时,文件系统锁、页缓存锁也会引入“假 I/O 瓶颈”,需要
perf trace或blktrace排查。
- 并发写入时,文件系统锁、页缓存锁也会引入“假 I/O 瓶颈”,需要