表空间I/O并发上不去主因是ASM磁盘组未启用细粒度条带:需创建fine模板并用"+dg_name(template_name)"语法建表空间,AU_SIZE仅影响吞吐与分散性,不可后期修改,私有参数无效且危险。
为什么表空间I/O并发上不去?先看ASM磁盘组条带类型和AU是否匹配业务
表空间i/o并发受限,往往不是数据库参数或sql问题,而是底层asm存储没“铺开”——文件被粗粒度地堆在少数磁盘上,大量io挤在同一块物理盘,形成热点。关键判断点就两个:条带类型(fine vs coarse)和au_size(分配单元大小)。oltp类高并发小io场景,必须用细粒度条带+合理au;olap大扫描则更适合粗粒度+大au。默认coarse条带(即au=条带大小)在11gr2+后仅对控制文件启用fine,其余数据文件全走粗粒度——这正是多数人踩坑的起点。
- 细粒度条带(
fine):固定条带大小128KB,条带宽度默认为8(可调),文件被切成大量小块轮转写入多个磁盘,显著提升随机I/O并发能力 - 粗粒度条带(
coarse):条带大小 =AU_SIZE(如1MB/4MB),条带宽度恒为1,一个AU只落一块盘——即使DG里有8块盘,单个大文件也可能90% AU集中在前2块盘上 -
AU_SIZE不能后期修改,创建DG时定死;常见取值1M(默认)、2M、4M;AU越大,单次I/O吞吐越高,但小IO分散性越差,也更易造成磁盘负载不均
怎么让新表空间真正跑满所有ASM磁盘?模板+路径语法缺一不可
光建个DG、设好AU_SIZE没用——Oracle不会自动把数据文件“打散”。必须显式指定细粒度模板,并在CREATE TABLESPACE时通过+dg_name(template_name)语法触发条带行为。漏掉任一环,文件照样走默认粗粒度。
- 先加细粒度模板:
ALTER DISKGROUP dg1 ADD TEMPLATE stp_fine ATTRIBUTES (unprotected fine); - 创建表空间时必须带模板名:
CREATE TABLESPACE tbs_io DATAFILE '+dg1(stp_fine)/tbs_io01.dbf' SIZE 500M;——注意括号位置,+后直接跟dg_name(template_name),不能写成+dg1/stp_fine/... - 验证是否生效:查
v$asm_alias确认文件路径含模板名;再查X$KFFXP看同一文件的DISK_KFFXP是否分布在多个磁盘编号上(比如0,1,2,3…而非全是0) - 别信“DG里有8块盘就自动条带”——没模板+没路径语法,Oracle就当它是个普通文件系统,按需分配AU,完全不考虑轮转
调_asm_stripewidth和_asm_stripesize真有用吗?慎动私有参数
这两个隐藏参数(_asm_stripewidth、_asm_stripesize)常被误传为“能强制改细粒度条带宽度/大小”,实际在11.2+版本中已失效。细粒度条带的stripesize固定为128KB,stripewidth由模板定义后不可运行时动态覆盖。强行设参数不仅无效,还可能干扰ASM内部extent映射逻辑,导致文件无法打开或I/O hang。
- 官方明确:细粒度条带的
stripesize硬编码为128KB,stripewidth取决于模板创建时的diskgroup磁盘数与冗余策略,运行时不可改 -
_asm_stripewidth等参数仅影响某些内部调试路径,在生产环境设它等于给ASM埋雷 - 真要调条带宽度?唯一合法方式是重建DG并调整磁盘数量,或用
ADD TEMPLATE时配合stripe属性(但12c+已不支持该属性)
AU_SIZE设多大才不拖慢OLTP?避开1MB默认值的三个现实约束
默认AU_SIZE=1M对大多数中小OLTP是够用的,但一旦出现高并发索引争用、大量db file sequential read等待超10ms,就得怀疑AU太大——小IO(如8KB块读)被迫读整个1MB AU,浪费带宽且加剧磁盘寻道。此时换256KB或512KB AU更合适,但受制于ASM限制,最小只能设1MB。
- ASM允许的
AU_SIZE只有1M/2M/4M/8M/16M/32M/64M,没有256K选项——所以“调小AU”本质是选最接近业务IO粒度的最小合法值,通常是1M或2M - 设
2MAU后,细粒度条带仍为128KB,但每个AU里能塞16个条带块;粗粒度下,一个AU=一个条带=2MB,更易造成单盘堆积 - 真正影响OLTP并发的,从来不是AU本身,而是条带类型是否为
fine——AU只是配合条带的“容器”,容器再小,没条带轮转也是白搭
最容易被忽略的点:细粒度模板必须在DG创建后立即添加,且表空间创建语句里的路径语法一个括号都不能错;AU_SIZE选型要结合磁盘数量和I/O特征反推,而不是盲目调大;所有私有参数操作,都该先在测试环境用dd if=/dev/zero of=+dg1/testfile压测验证条带分布,再上线。

















