Allocation Table(AT)和Free space table(FST)都属于Physically addressed metadata,我们在介绍它们之前,先介绍一下asm磁盘的Stride的概念,每个asm磁盘根据不同的磁盘大小,可以分成多个Stride,Stride的大小定义在磁盘头kfdhdb.mfact(单位AU)
1 2 3 4 |
[grid@rac1 ~]$ kfed read /dev/asmdisk-data1 |grep -E "mfact|ausi- ze" kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000 kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80 |
并且不同的AU_SIZE,Stride的大小也不相同,在11.2.0.4版本上的验证结果:
Allocation Unit Size |
Stride size |
1M |
113792 |
2M |
228480 |
>=4M |
454272 |
每个Stride都有自己的Allocation Table和Free space table,用于管理该Stride内AU的分配情况和空闲情况。以AU_SIZE=1M为例,假设asm磁盘大小为500G,那么第一个Stride上的AU由AU号为0上的Allocation Table和Free space table管理,第二个Stride上的AU由AU号为113792上的Allocation Table和Free space table管理,以此类推。
磁盘头定义了第一个Stride的Allocation Table和Free space table的位置,第一个Stride的Free space table位于AU号为0的第2个block(块号从0开始),第一个Stride的第一个Allocation Table block位于AU号为0的第3个block。
1 2 3 4 |
[grid@rac1 ~]$ kfed read /dev/asmdisk-data1 |grep -E "tlocn" kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 |
下面解析FST block的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 2 ; 0x002: KFBTYP_FREESPC kfbh.datfmt: 2 ; 0x003: 0x02 kfbh.block.blk: 1 ; 0x004: blk=1 kfbh.block.obj: 2147483649 ; 0x008: disk=1 kfbh.check: 2977477924 ; 0x00c: 0xb178b524 kfbh.fcn.base: 16603 ; 0x010: 0x000040db kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdfsb.aunum: 0 ; 0x000: 0x00000000 kfdfsb.max: 254 ; 0x004: 0x00fe kfdfsb.cnt: 12 ; 0x006: 0x000c kfdfsb.bound: 0 ; 0x008: 0x0000 kfdfsb.flag: 1 ; 0x00a: B=1 kfdfsb.ub1spare: 0 ; 0x00b: 0x00 kfdfsb.spare[0]: 0 ; 0x00c: 0x00000000 kfdfsb.spare[1]: 0 ; 0x010: 0x00000000 kfdfsb.spare[2]: 0 ; 0x014: 0x00000000 kfdfse[0].fse: 0 ; 0x018: FREE=0x0 FRAG=0x0 kfdfse[1].fse: 0 ; 0x019: FREE=0x0 FRAG=0x0 kfdfse[2].fse: 0 ; 0x01a: FREE=0x0 FRAG=0x0 kfdfse[3].fse: 0 ; 0x01b: FREE=0x0 FRAG=0x0 kfdfse[4].fse: 0 ; 0x01c: FREE=0x0 FRAG=0x0 kfdfse[5].fse: 0 ; 0x01d: FREE=0x0 FRAG=0x0 kfdfse[6].fse: 0 ; 0x01e: FREE=0x0 FRAG=0x0 kfdfse[7].fse: 0 ; 0x01f: FREE=0x0 FRAG=0x0 kfdfse[8].fse: 0 ; 0x020: FREE=0x0 FRAG=0x0 kfdfse[9].fse: 119 ; 0x021: FREE=0x7 FRAG=0x7 kfdfse[10].fse: 119 ; 0x022: FREE=0x7 FRAG=0x7 kfdfse[11].fse: 51 ; 0x023: FREE=0x3 FRAG=0x3 kfdfse[12].fse: 0 ; 0x024: FREE=0x0 FRAG=0x0 kfdfse[13].fse: 0 ; 0x025: FREE=0x0 FRAG=0x0 kfdfse[14].fse: 0 ; 0x026: FREE=0x0 FRAG=0x0 kfdfse[15].fse: 0 ; 0x027: FREE=0x0 FRAG=0x0 kfdfse[16].fse: 0 ; 0x028: FREE=0x0 FRAG=0x0 。。。 |
Free space table记录了该Stride总共有多少个Allocation Table block,以及每个Allocation Table block所管理的AU是否存在空闲,类似数据文件的文件位图块。
kfdfsb可以看作free space block的块头部分,占据24个字节。
- max:该Stride总共有多少个Allocation Table block来管理AU,该例中1M的AU大小总共有256个元数据块,除去磁盘头和FST,总共254个Allocation Table block,不同的AU大小,kfdfsb.max也不相同
- cnt:该磁盘目前已经使用到了第几个Allocation Table block所管理的AU
- kfdfse:为fst条目,一个fst条目对应一个Allocation Table block,描述了每一个Allocation Table block所管理的AU是否存在空闲。
Allocation Unit Size |
kfdfsb.max |
1M |
254 |
2M |
510 |
>=4M |
1014 |
第一个Allocation Table block的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 3 ; 0x002: KFBTYP_ALLOCTBL kfbh.datfmt: 2 ; 0x003: 0x02 kfbh.block.blk: 2 ; 0x004: blk=2 kfbh.block.obj: 2147483649 ; 0x008: disk=1 kfbh.check: 2187822785 ; 0x00c: 0x826786c1 kfbh.fcn.base: 1108 ; 0x010: 0x00000454 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdatb.aunum: 0 ; 0x000: 0x00000000 kfdatb.shrink: 448 ; 0x004: 0x01c0 kfdatb.ub2pad: 0 ; 0x006: 0x0000 kfdatb.auinfo[0].link.next: 8 ; 0x008: 0x0008 kfdatb.auinfo[0].link.prev: 8 ; 0x00a: 0x0008 kfdatb.auinfo[1].link.next: 12 ; 0x00c: 0x000c kfdatb.auinfo[1].link.prev: 12 ; 0x00e: 0x000c kfdatb.auinfo[2].link.next: 16 ; 0x010: 0x0010 kfdatb.auinfo[2].link.prev: 16 ; 0x012: 0x0010 kfdatb.auinfo[3].link.next: 20 ; 0x014: 0x0014 kfdatb.auinfo[3].link.prev: 20 ; 0x016: 0x0014 kfdatb.auinfo[4].link.next: 24 ; 0x018: 0x0018 kfdatb.auinfo[4].link.prev: 24 ; 0x01a: 0x0018 kfdatb.auinfo[5].link.next: 28 ; 0x01c: 0x001c kfdatb.auinfo[5].link.prev: 28 ; 0x01e: 0x001c kfdatb.auinfo[6].link.next: 32 ; 0x020: 0x0020 kfdatb.auinfo[6].link.prev: 32 ; 0x022: 0x0020 kfdatb.spare: 0 ; 0x024: 0x00000000 kfdate[0].discriminator: 1 ; 0x028: 0x00000001 kfdate[0].allo.lo: 0 ; 0x028: XNUM=0x0 kfdate[0].allo.hi: 8388608 ; 0x02c: V=1 I=0 H=0 FNUM=0x0 kfdate[1].discriminator: 1 ; 0x030: 0x00000001 kfdate[1].allo.lo: 0 ; 0x030: XNUM=0x0 kfdate[1].allo.hi: 8388608 ; 0x034: V=1 I=0 H=0 FNUM=0x0 kfdate[2].discriminator: 1 ; 0x038: 0x00000001 kfdate[2].allo.lo: 2 ; 0x038: XNUM=0x2 kfdate[2].allo.hi: 8388609 ; 0x03c: V=1 I=0 H=0 FNUM=0x1 kfdate[3].discriminator: 1 ; 0x040: 0x00000001 kfdate[3].allo.lo: 0 ; 0x040: XNUM=0x0 kfdate[3].allo.hi: 8388610 ; 0x044: V=1 I=0 H=0 FNUM=0x2 kfdate[4].discriminator: 1 ; 0x048: 0x00000001 kfdate[4].allo.lo: 2 ; 0x048: XNUM=0x2 kfdate[4].allo.hi: 8388611 ; 0x04c: V=1 I=0 H=0 FNUM=0x3 ... |
Allocation Table在AT条目(kfdate)中记录了磁盘Stride的每一个AU的分配情况(V=1为分配,V=0为未分配)
- aunum:该AT block的第一条at条目对应的au编号
- shrink:一个AT block记录448个at条目
- kfdate[n]记录的本磁盘第(n+1+kfdatb.aunum)个au分配给了FNUM(16进制)号asm文件的第(XNUM+1)个物理extent,以上面的kfdate[4]为例,该AT条目记录了本磁盘第5个AU分配给了3号asm文件的第3个物理extent
通过x$kfdat也可以查询某块asm磁盘AU分配情况
Column Name |
Description |
GROUP_KFDAT |
Diskgroup number, join with v$asm_diskgroup |
NUMBER_KFDAT |
Disk number, join with v$asm_disk |
COMPOUND_KFDAT |
Disk compund_index, join with v$asm_disk |
AUNUM_KFDAT |
Disk allocation unit (relative position from the beginning of the disk), join with x$kffxp.au_kffxp |
V_KFDAT |
Flag: V=this Allocation Unit is used; F=AU is free |
FNUM_KFDAT |
File number, join with v$asm_file |
XNUM_KFDAT |
Progressive file extent number join with x$kffxp.pxn_kffxp |
总结一下,asm磁盘根据磁盘大小可以分为多个Stride,每个Stride都有的FST和AT位于各自Stride的第一个AU上用于管理AU分配和回收,Stride的大小记录在磁盘头kfdhdb.mfact,实际上也等于(Stride的AT block数量)(一个AT block可管理多少AT条目)=kfdfsb.maxkfdatb.shrink。当AU分配时,都会在对应的AT条目上记录该AU分配给了哪个asm文件(kfdate[n].allo.hi的FNUM)的哪个物理extent(kfdate[4].allo.lo的XNUM);当AU回收时,会清理对应的AT条目。