暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

可变大小区(Variable-Size Extents)

原创 eygle 2019-09-19
1788

在Oracle Database 11g之前,ASM的区(Extent)和AU是一一对应的,从11g开始,ASM的另外一个重要变化是区的大小不再是固定等于AU的大小,而是会随着分配的extent数量的变化而发生变化。


要理解上述概念,有一些背景知识需要我们了解:


1、 ASM实例不会去修改Database的内容,ASM实例只会去修改其Metadata block(即ASM Disk Header和ASM extent map);


2、 Database Instance会在Shared Pool里维护ASM实例传过来的区映射块(Extent map blocks),每个Extent map block都对应一个ASM里的一个extent;


在ASM的世界里,AU(Allocation Units)和Extent都是空间分配的单位,只不过它们代表了两个不同的角度,AU是站在ASM disk的角度,而Extent则是站在文件的角度。

 

ASM除了支持镜像功能外,还支持条带化(Asm Striping),Stripe设置有两种类型,一种是粗粒度条带(Coarse Striping),Stripe Size等于AU大小,默认为1M,AU大小由隐含参数_asm_ausize定义;另外一种是细粒度条带(Fine Striping),Stripe Size为128K,由隐含参数_asm_stripesize定义。


通过以下查询可以获得数据库的隐含参数初始值:


SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  2    FROM SYS.x$ksppi x, SYS.x$ksppcv y
  3   WHERE x.indx = y.indx AND x.ksppinm LIKE '%&par%';
Enter value for par: _asm
NAME                           VALUE      DESCRIB
------------------------------ ---------- ---------------------------------------------------
_asm_disk_repair_time          14400      seconds to wait before dropping a failing disk
_asm_ausize                    1048576    allocation unit size
_asm_blksize                   4096       metadata block size
_asm_acd_chunks                1          initial ACD chunks created
_asm_maxio                     1048576    Maximum size of individual I/O request
_asmsid                        asm        ASM instance id
_asm_wait_time                 18         Max/imum time to wait before asmb exits
_asm_stripewidth               8          ASM file stripe width
_asm_stripesize                131072     ASM file stripe size
_asm_droptimeout               60         timeout before offlined disks get dropped (in 3s ticks)
_asm_emulmax                   10000      max number of concurrent disks to emulate I/O errors


ASM Stripe 类型是在Diskgroup Template层面定义的,如下是Oracle Database 10g默认的一些常见Template和Stripe类型的对应关系:


SQL> select * from v$asm_template where group_number=1 order by 4;
GROUP_NUMBER ENTRY_NUMBER REDUNDANCY   STRIPE       SY NAME
------------ ------------ ------------ ------------ -- --------------------
           1            0 UNPROT       COARSE       Y  PARAMETERFILE
           1            1 UNPROT       COARSE       Y  DUMPSET
           1            6 UNPROT       COARSE       Y  TEMPFILE
           1           10 UNPROT       COARSE       Y  CHANGETRACKING
           1            9 UNPROT       COARSE       Y  XTRANSPORT
           1            3 UNPROT       COARSE       Y  ARCHIVELOG
           1            5 UNPROT       COARSE       Y  DATAFILE
           1           12 UNPROT       COARSE       Y  DATAGUARDCONFIG
           1            7 UNPROT       COARSE       Y  BACKUPSET
           1            8 UNPROT       COARSE       Y  AUTOBACKUP
           1            4 UNPROT       FINE         Y  ONLINELOG
           1           11 UNPROT       FINE         Y  FLASHBACK
           1            2 UNPROT       FINE         Y  CONTROLFILE


可见,在默认设置下,保存在ASM中的控制文件、联机重做日志、闪回数据库日志是使用FINE类型的条带化设置,也就是每个条带为128K。而数据文件、归档日志、临时文件等则使用COARSE类型条带化设置,每个条带的大小跟AU大小相等,默认情况下是1M。


这也正是存在两种不同条带化的原因,对于较小的文件,如控制文件、日志文件,其单次IO操作的数据单元较小,所以可以使用细粒度的条带化;对于大文件,如常规的数据文件,其单次IO操作的单元较大(如1M),缺省就使用了粗粒度的条带化。


在默认设置下,当ASM为数据文件分配一个Extent的时候,实际上就是使用了一个AU,我们可以认为在性能考量上这是没有条带化的。


在ASMCA中,在磁盘组位置,右键中有管理模板选项,可以通过该选型查看模板类型,修改自定义模板:


企业微信截图_15688728496742.png


以下是Oracle Database 11g数据库缺省模板的属性,与Oracle 10g不同的是,除了CONTROLFILE的条带化为Fine之外,其余皆为COARSE:


企业微信截图_15688728859152.png


在Oracle 11gR2中,可以通过asmcmd来管理维护模板,使用该特性要求磁盘组的compatible.rdbms属性至少为11.2 :


ASMCMD> mktmpl -G ORADG --striping coarse --redundancy unprotected --primary hot oradg
ORA-15032: not all alterations performed
ORA-15283: ASM operation requires compatible.rdbms of 11.2.0.0.0 or higher (DBD ERROR: OCIStmtExecute)
ASMCMD> lsattr -l -G ORADG
Name                     Value
access_control.enabled   FALSE
access_control.umask     066
au_size                  1048576
cell.smart_scan_capable  FALSE
compatible.asm           11.2.0.0.0
compatible.rdbms         10.1.0.0.0
disk_repair_time         3.6h
sector_size              512


在ASM中修改磁盘组兼容性属性:


[grid@enmou1 ~]$ sqlplus / as sysasm
SQL*Plus: Release 11.2.0.2.0 Production on Tue Mar 22 17:49:11 2011
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
 
SQL> alter diskgroup ORADG set attribute 'compatible.rdbms'='11.2';
Diskgroup altered.


此后可以在asmcmd中进行相应的模板维护工作:


ASMCMD> lsattr -l -G oradg
Name                     Value
access_control.enabled   FALSE
access_control.umask     066
au_size                  1048576
cell.smart_scan_capable  FALSE
compatible.asm           11.2.0.0.0
compatible.rdbms         11.2
disk_repair_time         3.6h
sector_size              512
ASMCMD> mktmpl -G ORADG --striping coarse --redundancy unprotected --primary hot oradg
ASMCMD> lstmpl -l oradg
Group_Name  Group_Num  Name   Stripe  Sys  Redund  PriReg  MirrReg
ORADG       3          ORADG  COARSE  N    UNPROT  HOT     COLD
ASMCMD> chtmpl -G ORADG --striping fine oradg
ASMCMD> lstmpl -l oradg
Group_Name  Group_Num  Name   Stripe  Sys  Redund  PriReg  MirrReg
ORADG       3          ORADG  FINE    N    UNPROT  HOT     COLD


注意这里的Primary/Secondary选项是Oracle 11gR2中增加的新特性,称为智能数据摆放(Intelligent Data Placement),该特性允许定义文件的Hot/Cold属性,对于Hot文件,ASM可以将其摆放在磁盘读写性能高的位置,如磁盘边缘。


     --primary { hot | cold }  - Intelligent Data Placement specification for primary extents, either hot or cold region.


--secondary { hot | cold } - Intelligent Data Placement specification for secondary extents, either hot or cold region.


asmcmd中新增的iostat命令可以帮助我们非常有效的去监控ASM磁盘组的IO响应与性能,包括冷热读写:


ASMCMD> iostat --region -t -G ORADG
Group_Name  Dsk_Name  Reads    Writes   Cold_Reads  Cold_Writes  Hot_Reads  Hot_Writes  Read_Time  Write_Time
ORADG       VOL3      1552384  8183808  0           0            0          0           .716       22.245


可以通过以下SQL来修改模板属性,如条带化类型:


SQL> ALTER DISKGROUP diskgroup_name ALTER TEMPLATE <tmpl> ATTRIBUTES (FINE);


注意,在Oracle11g中,ALTER TEMPLATE关键字被MODIFY TEMPLATE取代,但是两者皆可用


SQL> alter diskgroup ORADG modify template oradg attributes(fine);
Diskgroup altered.
 
SQL> alter diskgroup ORADG alter template oradg attributes(coarse);
Diskgroup altered.


删除一个模板可以在asmcmd中执行:


ASMCMD> rmtmpl -G ORADG oradg


也可以在ASMCA中删除:


企业微信截图_15688730413394.png


所谓的ASM条带化实际上决定了在ASM Disk上分配的AU和extent的对应关系,比如,如果用上述sql把ASM file templates改为了fine,则Oracle在分配一个1M的Extent的时候,实际上是会分配8个1M的AU,然后上述extent会被打散存储在这8个AU里,每个AU里都分配128K。


条带的分布算法参看下图。(该图摘录自Automatic Storage Management Administrator's Guide 11g Release 2)


企业微信截图_15688732709883.png


也就是该磁盘组有8块磁盘,A,B,C表示不同的Stripe Chunk,每个chunk为128K大小。某ASM file的第一个chunk分配在disk1的第一个ASM file extent中,第二个chunk分配在disk2的第一个extent中,按此规律,一直分配到第八个chunk在disk8的第一个extent中,接下来第九个chunk(也就是上图中的I)又分配在disk1的第一个extent中,依次分配,直到该ASM file被完全条带化。


至于条带分配的宽度(如上例中是8),则由隐含参数_asm_stripewidth来决定,该参数默认值为8,通常我们不会修改该参数值。

 

由前面所讲述的背景知识我们知道,oracle在database instance的shared pool里存储extent map block,且extent map block和extent是一一对应的关系(在默认AU大小的情况下,一个extent的大小就是1M),如果我现在库的大小是1T,则我们可以计算出现在share pool里需要维护100万个extent map block。

 

Oracle意识到如果用ASM管理一个1T的库就需要维护100万个extent map block话,那随着所管理的库的容量越来越大,效率问题不容忽视。

MOS文档365468.1中这样写到:


ASM metadata storage requirements for databases greater than 10TB can be very high introducing inefficiencies in opening ASM files and increasing memory used for ASM metadata

 

于是在11g里,oracle改变了extent的大小,extent的大小将不再永远是1M,而是会随着分配extent数量的递增而改变。


在Oracle Database 11gR1中具体的规则如下:


企业微信截图_15688732973823.png


其示意图如下(引自Oracle Database Storage Administrator's Guide 11g),可以看到自第20000个Extent开始,分配了8个AU单位:


企业微信截图_15688733241339.png


我们可以稍微计算一下在11gR1里相应的extent分配的情况。


1、 AU=1M,库的大小为1T


则按照上述算法,oracle现在仅需分配53572个extent:


SQL> select 20000+20000+(1024*1024-20000-20000*8)/64 Extents from dual;
   EXTENTS
----------
   53571.5


2、 AU=64M


在11g里在创建disk group的时候可以手工指定AU的大小,库的大小为1T时,则按照上述算法,oracle现在仅需分配16384个extent:


SQL> select (1024*1024/64) extents from dual;
EXTENTS
--------------
         16384

 

3、AU=64M(11g里在创建disk group的时候可以手工指定AU的大小),库的大小为100T,则按照上述算法,oracle现在仅需分配62788个extent:


SQL> select 20000 + 20000 + (100*1024*1024-20000*64-20000*64*8)/(64*64) EXTENTS from dual;
EXTENTS
------------------------------
                       62787.5

 

在11gR2中规则又有所变化,具体如下:


企业微信截图_15688733561340.png

 

使用1MB的AU和固定大小区,对于10TB的数据库,大约需要90M来存储Extent Map;而对于16MB的AU,Extent Map仅占用大约5.5MB内存。Oracle在11g里引入了“可变的区大小”技术,可以显著缩短数据库的启动时间、降低Shared Pool的内存消耗,并且一举解决了以前在10g里用ASM来管理海量数据时候的效率问题(因为extent map block的数量再也不会像以前那样动辄上百万了)。

最后修改时间:2019-09-19 14:09:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论