I/O 性能监控与诊断
I/O 性能问题往往比较隐蔽:CPU 不高、内存正常、GC 正常,但系统就是慢。这时候需要专门的 I/O 诊断工具来找出瓶颈。
Linux I/O 监控命令
iostat:磁盘 I/O 统计
关键指标:
- r/s, w/s:每秒读写次数
- rkB/s, wkB/s:每秒读写 KB 数
- await:I/O 等待时间(毫秒)
- %util:设备利用率,> 80% 表示饱和
vmstat:虚拟内存统计
关键指标:
- bi, bo:每秒读写块数
- wa:I/O 等待时间占比,> 20% 表示 I/O 是瓶颈
netstat:网络统计
ss:Socket 统计
Java I/O 监控
JMX 监控
启用
JMX
Micrometer 指标
添加
记录
网络 I/O 延迟分析
TCP 连接延迟
延迟分布分析
延迟分布采样
文件 I/O 延迟分析
strace:系统调用跟踪
Java Flight Recorder
JFR 可以记录:
- 文件 I/O 读取/写入大小和耗时
- Socket 发送/接收大小和耗时
- I/O 等待时间
诊断流程
快速定位 I/O 问题
常见 I/O 问题模式
监控 Dashboard
Grafana + Prometheus
prometheus.yml
Grafana
本章小结
I/O 监控的核心工具:
- iostat:磁盘 I/O 统计,关注 %util 和 await
- vmstat:虚拟内存统计,关注 wa 列
- netstat/ss:网络连接统计
- strace:系统调用跟踪
- JFR:Java 飞行记录,I/O 事件分析
- JMX/Micrometer:应用层 I/O 指标
监控不是目的,定位问题并优化才是目标。
延伸思考
什么时候应该放弃监控,直接上 profiler?
监控擅长发现"谁在慢",profiler 擅长发现"慢在哪里"。如果已经确定是 I/O 瓶颈但不知道是哪个操作,profiler(如 async-profiler)可以给出调用栈级别的分析。但如果完全不知道问题在哪,先用监控快速定位方向。