
以下是对 Oracle 19C ASM 中 V$ASM_DISK_IOSTAT 动态性能视图的权威解析。该视图是 ASM 存储性能诊断的核心组件,提供磁盘级别的详细 I/O 统计信息。
1. 核心作用
V$ASM_DISK_IOSTAT 提供 ASM 磁盘的细粒度 I/O 性能统计,主要功能包括:
- 监控单个磁盘的读写操作和延迟
- 跟踪磁盘 I/O 吞吐量和错误计数
- 检测磁盘性能瓶颈和热点
- 分析负载分布均衡性
- 提供历史 I/O 模式分析
- 支持存储阵列性能验证
📌 定位:
ASM 存储系统的"磁盘听诊器",提供物理磁盘级别的实时性能洞察。
2. 使用场景
- 性能调优:识别高延迟磁盘
- 负载均衡:验证磁盘组内 I/O 分布
- 硬件诊断:检测故障磁盘或控制器
- 容量规划:分析磁盘利用率趋势
- 存储验证:评估新存储设备性能
- RAC 优化:分析跨实例磁盘访问模式
- 缓存评估:监控闪存磁盘效果
3. 字段含义(Oracle 19c 官方文档)
| 列名 | 数据类型 | 说明 |
|---|---|---|
GROUP_NUMBER | NUMBER | 磁盘组编号 |
DISK_NUMBER | NUMBER | 磁盘编号 |
INST_ID | NUMBER | RAC 实例 ID |
READS | NUMBER | 读操作次数 |
WRITES | NUMBER | 写操作次数 |
READ_TIME | NUMBER | 读操作总时间(厘秒)(1厘秒=0.01秒) |
WRITE_TIME | NUMBER | 写操作总时间(厘秒) |
BYTES_READ | NUMBER | 读取字节数 |
BYTES_WRITTEN | NUMBER | 写入字节数 |
READ_ERRS | NUMBER | 读错误次数 |
WRITE_ERRS | NUMBER | 写错误次数 |
AVG_READ_TIME | NUMBER | 平均读延迟(厘秒) |
AVG_WRITE_TIME | NUMBER | 平均写延迟(厘秒) |
MIN_READ_TIME | NUMBER | 最小读延迟(厘秒) |
MIN_WRITE_TIME | NUMBER | 最小写延迟(厘秒) |
MAX_READ_TIME | NUMBER | 最大读延迟(厘秒) |
MAX_WRITE_TIME | NUMBER | 最大写延迟(厘秒) |
PERCENT_SOFT_READS | NUMBER | 缓存命中率百分比(软读比例) |
QUEUE_DEPTH | NUMBER | 平均 I/O 队列深度 |
IO_INTERCONNECT_BYTES | NUMBER | 集群互连传输字节数(RAC) |
LAST_UPDATE_TIME | TIMESTAMP | 最后统计更新时间 |
4. 相关视图与基表
相关视图
| 视图 | 说明 |
|---|---|
GV$ASM_DISK_IOSTAT | RAC 全局视图 |
V$ASM_DISK | 磁盘基本信息 |
V$ASM_DISKGROUP_STAT | 磁盘组级统计 |
V$ASM_OPERATION | 磁盘操作状态 |
V$IOSTAT_FUNCTION | I/O 功能级统计 |
基表(X$表)
X$KFD_IO_STATS:V$ASM_DISK_IOSTAT的底层结构-- 查看基表结构(仅供诊断) SELECT * FROM X$KFD_IO_STATS WHERE disk_num = 1; -- 磁盘编号1
5. 核心原理
统计采集机制
关键技术细节
-
实时采集:
- 每个 I/O 完成时更新计数器
- 延迟计算:
AVG_READ_TIME = READ_TIME / READS
-
队列深度计算:
- 基于操作系统级
iostat数据 - 反映磁盘并发处理能力
- 基于操作系统级
-
RAC 处理:
- 每个实例维护本地磁盘统计
GV$视图聚合集群数据IO_INTERCONNECT_BYTES显示跨节点I/O
-
缓存统计:
PERCENT_SOFT_READS计算:\text{Soft Read \%} = \frac{\text{Cache Hits}}{\text{Total Reads}} \times 100
6. 常用 SQL 查询与操作
(1) 查看磁盘基本 I/O 统计
SELECT d.name, d.path,
s.reads, s.writes,
ROUND(s.bytes_read/1048576) AS read_mb,
ROUND(s.bytes_written/1048576) AS write_mb
FROM v$asm_disk_iostat s
JOIN v$asm_disk d
ON s.disk_number = d.disk_number;
(2) 计算平均延迟(毫秒)
SELECT d.path,
ROUND(s.avg_read_time/100, 3) AS avg_read_ms,
ROUND(s.avg_write_time/100, 3) AS avg_write_ms
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number
WHERE s.reads > 1000; -- 排除低样本
(3) 识别高延迟磁盘
SELECT d.path, s.max_read_time/100 AS max_read_ms
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number
WHERE s.max_read_time > 5000 -- >50ms
ORDER BY s.max_read_time DESC;
(4) 分析负载均衡性
SELECT d.failgroup,
AVG(s.reads) AS avg_reads,
STDDEV(s.reads) AS stddev_reads,
ROUND(STDDEV(s.reads)/AVG(s.reads)*100, 2) AS imbalance_pct
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number
WHERE d.group_number = 1 -- 磁盘组1
GROUP BY d.failgroup;
(5) 检测 I/O 错误
SELECT d.path, s.read_errs, s.write_errs
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number
WHERE s.read_errs > 0 OR s.write_errs > 0;
(6) 监控队列深度
SELECT d.path, s.queue_depth,
CASE
WHEN s.queue_depth > 32 THEN 'CRITICAL'
WHEN s.queue_depth > 16 THEN 'WARNING'
ELSE 'NORMAL'
END AS status
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number;
(7) RAC 跨节点分析
SELECT inst_id, d.path,
ROUND(SUM(bytes_read)/1048576) AS total_read_mb
FROM gv$asm_disk_iostat s
JOIN gv$asm_disk d
ON s.disk_number = d.disk_number AND s.inst_id = d.inst_id
GROUP BY inst_id, d.path;
(8) 计算吞吐量(MB/s)
SELECT d.path,
ROUND(s.bytes_read / (1024*1024) /
((SYSDATE - d.mount_date) * 86400), 2) AS read_mb_sec,
ROUND(s.bytes_written / (1024*1024) /
((SYSDATE - d.mount_date) * 86400), 2) AS write_mb_sec
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number;
(9) 闪存缓存效果分析
SELECT d.name,
s.percent_soft_reads AS cache_hit_rate,
CASE
WHEN s.percent_soft_reads < 70 THEN 'ADD FLASH'
WHEN s.percent_soft_reads < 85 THEN 'MONITOR'
ELSE 'OPTIMAL'
END AS recommendation
FROM v$asm_disk_iostat s
JOIN v$asm_disk d ON s.disk_number = d.disk_number
WHERE d.hot_region = 'Y'; -- 热区磁盘
(10) 历史性能分析
-- 创建历史表
CREATE TABLE disk_io_history AS
SELECT SYSTIMESTAMP AS sample_time, s.*
FROM v$asm_disk_iostat s;
-- 每小时快照
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'DISK_IO_SNAPSHOT',
job_type => 'PLSQL_BLOCK',
job_action => 'INSERT INTO disk_io_history
SELECT SYSTIMESTAMP, s.*
FROM v$asm_disk_iostat s',
repeat_interval => 'FREQ=HOURLY'
);
总结
- 核心作用:提供磁盘级细粒度 I/O 性能统计
- 关键字段:
AVG_READ_TIME/AVG_WRITE_TIME:延迟指标QUEUE_DEPTH:并发负载指标MAX_READ_TIME:峰值延迟检测PERCENT_SOFT_READS:缓存效率
- 运维价值:
- 最佳实践:
- 关注平均读延迟 > 20ms 的磁盘
- 保持队列深度 < 磁盘阵列推荐值(通常 < 32)
- 定期检查 I/O 错误计数器
- 热区磁盘缓存命中率应 > 85%
- 注意事项:
- 统计基于 ASM 实例启动时间
- 高频率查询可能影响性能
- RAC 环境下需结合
GV$视图 - 与存储阵列监控工具交叉验证
⚠️ 性能诊断黄金法则:
- 队列深度持续 > 32 → 存储过载
- 读延迟 > 写延迟 → 检查存储读缓存
- 错误计数 > 0 → 立即更换磁盘
- 缓存命中率 < 70% → 增加闪存磁盘
- 同组磁盘延迟差异 > 30% → 检查硬件均衡性
欢迎关注我的公众号《IT小Chen》
806

被折叠的 条评论
为什么被折叠?



