规划Oracle RAC共享存储时,ASM磁盘组的条带大小经常被拿来跟RAID控制器的条带深度做对比,但两者控制路径完全不同。ASM侧没有独立的stripe size参数,真正影响条带粒度的是磁盘组AU_SIZE和文件模板的STRIPE属性。一个外部冗余磁盘组默认AU_SIZE为1MB,数据文件按1MB粗粒度条带轮转,控制文件和联机日志则以固定128KB细粒度条带分布。后续如果需要改变数据文件的条带行为,往往不是改一个参数,而是要重新规划磁盘组AU_SIZE。

一、AU、extent与stripe size不是一回事
ASM把每块磁盘划分为多个分配单元,也就是AU。一个数据文件在磁盘组中占用的空间由若干个extent组成,每个extent通常映射到一个AU。粗粒度条带下,extent的大小就是AU_SIZE,因此文件在多块盘上按AU为单位轮转写入。以默认1MB AU为例,如果一个数据文件连续分配了100个extent,就会分布在多块盘上,每块盘承担若干个1MB片段。这个1MB不是由存储端RAID决定的,而是ASM在创建磁盘组时固化下来的分配策略。
细粒度条带与粗粒度存在明显差异。ASM会把一个AU继续拆成8个128KB的写入单元,适用于控制文件、联机日志这类对延迟敏感的文件。即使磁盘组AU_SIZE调整到4MB,细粒度条带依然保持128KB,不会随之变成512KB。之所以这样设计,是因为控制文件和日志文件通常很小,却需要更均匀地分散到多个磁盘,避免单个磁盘成为性能瓶颈。
通过如下SQL可以查询当前磁盘组AU大小和模板条带属性:
SELECT name, allocation_unit_size, sector_size, type FROM v$asm_diskgroup ORDER BY name; SELECT group_number, name, stripe, redundancy FROM v$asm_template WHERE group_number > 0 ORDER BY group_number, name;
第一条SQL中的ALLOCATION_UNIT_SIZE单位是字节,默认值为1048576,即1MB。第二条SQL中的STRIPE列为FINE时表示细粒度条带,为COARSE时表示粗粒度条带。大多数环境中查询结果会显示DATAFILE和ARCHIVELOG模板为COARSE,而CONTROLFILE、ONLINELOG模板为FINE。这个结果直接说明:只有文件模板使用FINE,才会应用128KB条带;普通数据文件走的是AU级粗粒度条带。
二、OLTP与DSS负载下如何选择AU_SIZE
RAC环境最大的特点是多个实例通过缓存融合同时读写同一份数据。OLTP负载以小事务、随机读和频繁提交为主,往往并发很高,但每次I/O的数据量不大。如果数据文件使用过大的AU_SIZE,比如8MB或16MB,一个extent覆盖的物理区间会很大,容易在少量磁盘上形成较长时间的顺序占用。对于高并发小I/O来说,更理想的是让请求尽量均匀分散到多块盘上,所以OLTP核心库通常保留默认1MB AU,并把控制文件、联机日志放在独立的低延迟磁盘组中。
数据仓库或报表库正好相反。大表扫描、批量加载、并行查询通常产生连续的1MB到几十MB读取请求。较大的AU_SIZE可以减少extent数量,进而降低ASM元数据块大小和文件映射查询成本。对于这种场景,可以考虑创建AU_SIZE为4MB的独立磁盘组,把历史分区、事实表索引和归档日志放进去。但需要注意,AU_SIZE创建后不能在线修改,必须新建磁盘组并通过RMAN或者Transportable Tablespace迁移数据。
下表给出一个常见参考:
| 场景 | AU_SIZE | 数据文件模板 | 效果 |
|---|---|---|---|
| 高并发OLTP | 1MB | COARSE | 减少单盘热点,元数据适中 |
| 混合负载 | 2MB | COARSE | 兼顾扫描与事务 |
| 数据仓库 | 4MB | COARSE | 顺序扫描更连续,extent更少 |
| 控制文件/日志 | 任意 | FINE | 固定128KB细粒度条带 |
这里有一个常见误区:把AU_SIZE调大后,以为联机日志也会变成大条带。实际上ONLINELOG模板的STRIPE属性是FINE,仍然使用128KB条带。所以如果日志组存在高延迟问题,需要检查的是日志组数量、成员分布和磁盘响应能力,而不是试图通过扩大AU_SIZE解决。
三、Windows RAC中创建和验证磁盘组条带配置
Windows平台上的Oracle RAC仍然可以使用ASM,不过磁盘发现路径与Linux不同。Windows通常使用设备路径\\.\ORCLDISK1这种形式来表示ASM候选盘。创建磁盘组时同样通过ATTRIBUTE设置AU_SIZE,示例如下:
CREATE DISKGROUP DATA_NEW EXTERNAL REDUNDANCY DISK '\\.\ORCLDISK3' NAME DISK3 ATTRIBUTE 'au_size' = '4M', 'sector_size' = '4096', 'compatible.asm' = '12.2.0.0', 'compatible.rdbms' = '12.2.0.0';
注意DISK路径中的反斜杠必须按Windows设备名原样书写,如果写成正斜杠或省略为ORCLDISK3会导致ASM无法发现磁盘。AU_SIZE一旦随磁盘组创建,就不能通过ALTER DISKGROUP在线调整。如果原磁盘组已经使用1MB AU,要改成4MB,只能新建DATA_NEW磁盘组,再使用RMAN copy或restore as方式迁移文件。
创建完成后,可以通过以下SQL确认条带相关属性:
SELECT name, allocation_unit_size, sector_size
FROM v$asm_diskgroup
WHERE name = 'DATA_NEW';
SELECT file_number, name, type, blocks, bytes
FROM v$asm_file
WHERE group_number =
(SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA_NEW')
ORDER BY type;
如果磁盘组中既有数据文件又有联机日志,建议分别检查对应模板的STRIPE列。只要控制文件和日志文件的模板保持FINE,它们的细粒度条带就固定为128KB,AU_SIZE修改只影响COARSE模板文件。
四、条带策略与容错、rebalance的关系
ASM条带大小不是孤立参数,它还和冗余度、磁盘数量、rebalance操作有关。外部冗余磁盘组没有镜像副本,粗粒度条带只分配一份extent。正常冗余磁盘组会有主副本和镜像副本,同一个文件不同副本落在不同故障组。此时一个1MB的主extent可能对应另一个故障组上的1MB镜像extent,但细粒度文件仍然在每个副本组内以128KB交错分布。
在添加或删除磁盘时,ASM通过rebalance重新分配extent。AU_SIZE越大,每次rebalance移动的粒度越大,单次调整可能更高效,但也会带来更大的写放大。对于正在使用传统机械盘的RAC环境,4MB AU的rebalance可能会造成明显的I/O争用,建议在业务低峰期控制rebalance power,而不是简单地用默认并行度执行。
此外,ASM的条带行为与Oracle数据库块的读写路径并不是同一层。即使数据文件被分散到多块盘,Oracle一次物理读通常仍以一个或多个数据块为单位,而不是一定一次读完整个AU。将AU设定为4MB只是决定extent的分配粒度,不能替代SQL优化、索引设计和I/O调度。因此,规划条带大小时要结合数据库块大小、表空间分配方式以及ASM磁盘组的物理盘数量一起评估。
Oracle RACASM磁盘组stripe size修改时间:2026-10-01 03:11:21