IO

确认 I/O 是否是瓶颈,需要从多个角度综合判断, 瓶颈可能体现在磁盘、文件系统甚至内核调度上。

1. 使用系统工具监控 I/O

Linux 常用:

  1. iostat

    1
    iostat -x 1
    • %util 高接近 100% → 磁盘基本饱和。
    • await 高 → 每次 I/O 延迟大。
    • r/sw/s → 每秒读写次数,衡量吞吐能力。
  2. iotop

    • 实时显示哪个进程在进行 I/O 以及占用的 I/O 带宽。
    • 可以确认是单个进程占用过多 I/O 还是多个进程平均分摊。
  3. vmstat

    1
    vmstat 1
    • bi/bo 字段表示每秒块设备读写量。
    • wa 字段表示 CPU 等待 I/O 的百分比,高的话说明 I/O 成为 CPU 等待瓶颈。
  4. 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 时间

    • topperf top 中如果 CPU 很空闲,程序主要在等待 I/O → I/O 瓶颈。
  • 延迟累积

    • 如果程序写入文件很慢,但 CPU 使用低且磁盘高负载 → 瓶颈在 I/O。
  • 锁与等待

    • 并发写入时,文件系统锁、页缓存锁也会引入“假 I/O 瓶颈”,需要 perf traceblktrace 排查。