ASM 翻译系列第三十一弹:了解ASM文件的空间分配

How many allocation units per file

本文主要是对ASM文件的空间分配进行一些探讨和研究。

ASM空间分配的最小单位是AU,默认的AU size是1MB,但在Exadata下AU 的默认大小是4MB。

ASM文件的空间分配是以extent为单位,每一个extent是由一个或多个AU组成,在11.2版本,前20000个extent,每一个extent由1个AU组成,接下来的20000个extent,每一个由4个AU组成,再超出的extent,每一个由16个AU组成。这个特性被叫做可变extent。而在11.1版本,extent的增长则遵循的是1-8-64倍AU的方式。在版本10,可变extent这个特性还没出现,因此所有的extent的大小都是1个AU。

Bytes vs space

视图V$ASM_FILE中,有两列是关于空间分配的:BYTES 和 SPACE,它们的定义如下:

  • BYTES - 文件的大小
  • SPACE - 文件实际占用的ASM空间的大小

这两列的定义有一些细微的差异,但是这两列的数值差异可能是非常大的,下面我们就来实际的看一下,首先交代一下我的测试环境,ASM和DB的版本为11.2.0.3,使用ASMLIB方式管理的磁盘:

可以通过如下的查询来简单的了解我的环境中磁盘组data的基本情况,例如AU的大小,冗余的级别,我的数据文件大多都位于这个磁盘组中。

SQL> select NAME, GROUP_NUMBER, ALLOCATION_UNIT_SIZE/1024/1024 "AU size (MB)", TYPE

from V$ASM_DISKGROUP

where NAME='DATA';

NAME             GROUP_NUMBER AU size (MB) TYPE

---------------- ------------ ------------ ------

DATA                        1            1 NORMAL

现在创建一个小于60个extent的“小”文件和一个大于60个extent的“大”文件。

SQL> create tablespace T1 datafile '+DATA' size 10 M;

Tablespace created.

SQL> create tablespace T2 datafile '+DATA' size 100 M;

Tablespace created.

Get the ASM file numbers for those two files:

SQL> select NAME, round(BYTES/1024/1024) "MB" from V$DATAFILE;

NAME                                               MB

------------------------------------------ ----------

...

+DATA/br/datafile/t1.272.818281717                 10

+DATA/br/datafile/t2.271.818281741                100

“小"文件的ASM文件号是272,“大”文件的ASM文件号是271。

接着我们通过前面提到的V$ASM_FILE视图来获取这两个文件的空间占用信息:

SQL> select FILE_NUMBER, round(BYTES/1024/1024) "Bytes (AU)", round(SPACE/1024/1024) "Space (AUs)", REDUNDANCY

from V$ASM_FILE

where FILE_NUMBER in (271, 272) and GROUP_NUMBER=1;

FILE_NUMBER Bytes (AU) Space (AUs) REDUND

----------- ---------- ----------- ------

        272         10          22 MIRROR

        271        100         205 MIRROR

bytes字段显示了文件的实际大小,我们小文件的大小为10MB,因此占用了10个AU(AU的size为1MB),小文件实际占用的ASM空间有22个AU,其中10个AU是实际的数据文件,1个AU为文件头,由于文件是镜像的,因此文件真正占用的ASM空间为:(10+1)*2=22个AU。

对于“大”文件,bytes字段显示了文件的实际大小为100MB也就是100个AU,到现在为止一切推论都跟原理相符,但是接着我们发现大文件的ASM空间占用为205个AU,按照上面的计算应该有202个AU才正确,多出来的3个AU是如何来的?接下来我们就来一窥究竟。

ASM space

下面的查询(在ASM实例上运行)展示了ASM 271号文件extent的分布情况:

SQL> select XNUM_KFFXP "Virtual extent", PXN_KFFXP "Physical extent", DISK_KFFXP "Disk number", AU_KFFXP "AU number"

from X$KFFXP

where GROUP_KFFXP=1 and NUMBER_KFFXP=271

order by 1,2;

Virtual extent Physical extent Disk number  AU number

-------------- --------------- ----------- ----------

             0               0           3       1155

             0               1           0       1124

             1               2           0       1125

             1               3           2       1131

             2               4           2       1132

             2               5           0       1126

...

           100             200           3       1418

           100             201           1       1412

    2147483648               0           3       1122

    2147483648               1           0       1137

    2147483648               2           2       1137

205 rows selected.

由于ASM文件是做了镜像的,我们可以看到每一个虚拟extent有两个物理extent,而且位于不同的磁盘(其实还位于不同的failgroup),但是最有趣的是查询结果的最后三行,虚拟extent的号是2147483648,做了3副本。我们可以通过kfed工具看下这个extent的内容,使用kfed我们首先需要知道ASM磁盘的名称。

通过如下查询获得ASM磁盘的名称:

SQL> select DISK_NUMBER, PATH

from V$ASM_DISK

where GROUP_NUMBER=1;

DISK_NUMBER PATH

----------- ---------------

          0 ORCL:ASMDISK1

          1 ORCL:ASMDISK2

          2 ORCL:ASMDISK3

          3 ORCL:ASMDISK4

我们来检查下这些AU中具体存放的内容:

$ kfed read /dev/oracleasm/disks/ASMDISK4 aun=1122 | grep type

kfbh.type:                           12 ; 0x002: KFBTYP_INDIRECT

$ kfed read /dev/oracleasm/disks/ASMDISK1 aun=1137 | grep type

kfbh.type:                           12 ; 0x002: KFBTYP_INDIRECT

$ kfed read /dev/oracleasm/disks/ASMDISK3 aun=1137 | grep type

kfbh.type:                           12 ; 0x002: KFBTYP_INDIRECT

这些额外的AU存放着ASM的元数据,更具体的讲,他们保存了extent map信息,而这些extent map信息不能够存放在ASM的文件目录块中了,因为ASM文件目录块中,只能存放60个extent的条目,一旦超出这个值,那么就要有额外的地方来记录这个信息。由于这属于ASM的元数据,因此被做了3副本(虽然是一个normal冗余的磁盘组),因此每一个大文件都会有这么3个额外的AU,但在一个external冗余的磁盘组中,仅仅只会有这么一个额外的AU,不会被做复制。

Conclusion

ASM空间的占用取决于2个因素:文件的实际大小和磁盘组的冗余度。

在external冗余的磁盘组中,空间的占用:文件实际大小+1个AU(文件头)+1个额外的AU(如果文件大于60个AU)。

在一个normal冗余的磁盘组中,空间的占用:两倍的文件实际大小+2个AU(文件头)+3个额外的AU(如果文件大于60个AU)

在一个high冗余的磁盘组中,空间的占用:三倍的文件实际大小+3个AU(文件头)+3个额外的AU(如果文件大于60个AU)

本文来自合作伙伴“DBGEEK”

时间: 2024-09-13 05:13:05

ASM 翻译系列第三十一弹:了解ASM文件的空间分配的相关文章

ASM 翻译系列第三十三弹:REQUIRED_MIRROR_FREE_MB的含义

REQUIRED_MIRROR_FREE_MB REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB是V$ASM_DISKGROUP[_STAT]视图中非常有趣的两列.Oracle Support部门收到的很多问题是关于这两列的意义以及它们的值是怎么计算的.我本打算写些文章介绍一下,但是我意识到我不可能比Harald van Breederode做的更出色.因此我征得了他的同意来直接参考他的文章,所以还是请欣赏他的大作吧. https://prutser.wordpres

Oracle ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete

When will my rebalance complete "磁盘组的rebalance什么时候能完成?",这个问题我经常被问到,但是如果你期望我给出一个具体的数值,那么你会失望,毕竟ASM本身已经给你提供了一个估算值(GV$ASM_OPERATION.EST_MINUTES),其实你想知道的是rebalance完成的精确的时间.虽然我不能给你一个精确的时间,但是我可以给你一些rebalance的操作细节,让你知道当前rebalance是否正在进行中,进行到哪个阶段,以及这个阶段是

Oracle ASM 翻译系列第二十九弹:ASM INTERNAL Free Space Table

Free Space Table 在进行创建文件或者文件resize过程中,需要有一个快捷入口,可以迅速的知道当前磁盘有哪些可用的(free状态的)AU,ASM Free Space Table 简称FST表就是提供一个这样的功能,通过它可以快速的知道哪些allocation table(AT表)元数据块中有空闲的AU,它存储的是一个个的AT表元数据块的号码,FST表用来加速AU的分配,避免读取已经完全被占用殆尽的AT块,造成分配空间效率的低下. FST表技术上说其实是属于AT表的一部分,位于A

Oracle ASM 翻译系列第三十弹:高级知识 Physical metadata replication

Physical metadata replication 从版本12.1开始,ASM会对某些物理元数据做一份复制,具体的说是每个磁盘的第一个AU(0号AU)上元数据.这意味着,ASM同时维护着两份磁盘头.FST(Free Space Table)表.AT(Allocation table)表的数据.需要注意的是ASM对这些数据采用的是复制(replicate),而不是镜像(mirror).ASM镜像(mirror)意味着把一份数据,拷贝到不同磁盘上:而物理元数据的副本位于相同的磁盘,因此使用的

Oracle ASM 翻译系列第十四弹:ASM Internal Rebalancing act

在ASM中,每一个文件的extent都均匀的分布在它所在磁盘组的所有磁盘上,无论是在文件第一次创建或是文件创建之后的重新resize都是如此,这也意味着我们始终能保持磁盘组中的每一个磁盘上都有一个平衡的空间分配. Rebalance operation 虽然文件在新建或是resize过程中都能保证空间的均匀分配,但是磁盘组在某些情况下会自动触发重平衡的操作,例如添加.删除和resize磁盘的操作(这些操作显然会让磁盘组变得不再平衡),再如,移动一个文件从磁盘的hot区到cold区.我们还可以通过

Oracle ASM 翻译系列第十六弹:ASM Internal ASM Active Change Directory

ASM Active Change Directory 当ASM实例要对多个元信息block进行原子修改时,ASM的active change directory 简称ACD会记录相应的日志,ACD是ASM元信息的3号文件.对应的日志记录会以单次IO的方式写入,来确保操作原子性. ACD被分成多个chunk或者thread,每个运行中的ASM实例都有它自己的42MB大小的chunk.当一个磁盘组被创建时,会分配一个独立的chunk给ACD.随着更多的实例挂载了该磁盘组,ACD的chunk数也会同

Oracle ASM 翻译系列第十五弹:ASM Internal ASM File Directory

本篇主要介绍ASM的1号文件,ASM的1号文件是ASM的文件目录,它记录了磁盘组中的所有文件信息,由于在ASM中,每一个磁盘组都是独立的存储单元,所以每一个磁盘组都会有属于它自己的文件目录. 虽然这是一个内部的文件,但ASM实例会把它当做其它ASM文件一样管理,在ASM的文件目录中也会有它自己的条目(指向了它自己),在一个normal和high冗余的磁盘组中,它也会做镜像,随着新文件的产生,文件目录的大小也会相应地增长. 每一个ASM文件目录的条目都会包含如下的信息: · 文件大小 · 文件块大

Oracle ASM 翻译系列第二十八弹:ASM INTERNAL Partnership and Status Table

Partnership and Status Table Partnership and Status Table简称PST表包含了一个磁盘组中所有磁盘的相关信息-磁盘号,磁盘状态,partner的磁盘号,心跳信息和failgroup的信息(11G及以上版本). 每个磁盘的AU 1是为PST表预留的,但是并不是每一个磁盘都有PST表的信息. PST count 在external冗余的磁盘组中只有一份PST表. 在normal冗余的磁盘组中,至少有两份PST表.如果磁盘组中有三个或更多的fail

Oracle ASM 翻译系列第十八弹:ASM Internal ASM file number 5

ASM file number 5 本章讲述ASM的5号文件,5号文件是ASM的模板目录,包含了磁盘组中所有的文件模板的信息. 有两种类型的模板:一种是系统自带的,一种是用户创建的,默认的模板(系统自带的)已经包含ASM的所有文件类型,创建文件时会根据文件类型自动匹配,用户创建的模板只会在用户特别指定时会使用. 每一个模板包含了如下的一些信息: · 每个模板的名称(对于默认模板它的名称其实就是文件类型) · 文件冗余度(默认是磁盘组的冗余度) · 文件条带(默认是根据文件类型来决定文件的条带)