avgiotim持续>20ms可判定存储响应严重滞后,需结合phyrds+phywrts筛选高活跃高延迟文件,并关联v$datafile定位物理设备;同时验证iostat中%util>70%且await远高于svctm,确认是否io队列积压。
查v$filestat里avgiotim是否持续>20ms
avgiotim是单次物理io的平均耗时,超过20ms基本可判定存储响应已严重滞后。这不是“有点慢”,而是磁盘或路径层已出现实质性瓶颈。
执行v$filestat和v$datafile关联查询时,重点筛出AVGIOTIM > 20且PHYRDS + PHYWRTS靠前的文件——这两项必须同时满足才值得迁移。只高延迟不活跃,可能是冷数据临时抖动;只高IO不延迟,大概率是SQL或缓存问题。
- 别用
SELECT * FROM v$filestat裸查,一定要JOIN v$datafile拿到实际文件路径,否则无法定位到LUN或SSD设备 -
MAXIOWTM(最大单次写耗时)若远高于其他文件(比如150ms vs 其他<5ms),优先怀疑该盘硬件故障或SAN路径拥塞 - Oracle 12c+中
AVGIOTIM单位是毫秒,但11g部分版本返回的是微秒,务必先DESC v$filestat确认字段精度
iostat -x输出里%util>70%且await远高于svctm
Linux下跑iostat -x 1 5不是为了看“哪个盘忙”,而是验证瓶颈是否真实落在存储层:如果%util持续>70%且await显著高于svctm(比如await=45ms,svctm=2ms),说明IO请求在队列里积压,不是磁盘本身慢,而是并发太高或调度策略不合理。
- 同一台机器上多个表空间共用一个LUN时,
%util可能被SYSTEM、UNDOTBS1、业务表空间共同拉高,但真正拖慢查询的只是其中1–2个文件 -
rrqm/s(每秒合并读请求数)长期>0,说明应用层存在大量小IO,需检查SQL是否未走索引导致频繁单块读 - 使用ASM时,
iostat看到的是底层磁盘,不是ASM diskgroup名,必须通过v$asm_disk把diskgroup名映射回物理设备
AWR报告中File IO Stats里Av I/O Wait超10ms
AWR的File IO Stats比Top 5 Events更准,因为它是按数据文件维度聚合的IO等待,能直接对应到dba_data_files里的file_name。
排序时按Av I/O Wait (ms)升序反查,找出延迟最高的几个文件,再用SELECT tablespace_name FROM dba_data_files WHERE file_name = '...'定位表空间,最后查dba_segments确认高频访问对象。
- 某文件
Physical Reads不高但Av I/O Wait极高(比如5次读平均等80ms),大概率是存储链路问题(如多路径切换失败、光纤拥塞),不是SQL问题 - 若
Av I/O Wait高且Write Clusters/sec也高,要同步查log file sync等待是否同步飙升——这说明日志写入卡住,数据文件IO是被连带拖慢 - SSD环境
Av I/O Wait > 5ms就要警惕,传统盘才以10–20ms为阈值
ALTER TABLESPACE MOVE DATAFILE迁移前必须确认挂载参数
迁移不是复制完就完事。目标文件系统若没禁用atime更新,每次读取都会触发元数据写,额外增加IO负担,尤其对OLTP高频小读场景影响明显。
- 迁移前用
mount | grep <code>目标路径确认是否含noatime,nodiratime;没有就重新挂载,否则迁移后IO压力可能不降反升 -
ALTER TABLESPACE ... MOVE DATAFILE期间会阻塞DML,建议在低峰期操作,并提前用DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL确保是本地管理表空间(LMT) - 迁移到NVMe SSD时,别用默认ASM stripe size(1MB),应显式设为
128KB或256KB,否则小IO条带化效率极低
真实瓶颈往往藏在AVGIOTIM和iostat的交叉点里,而不是某一个指标单独报警。迁移前漏掉noatime检查,或者把UNDOTBS1和业务表空间一起挪到新LUN,都可能让优化效果打折扣。











