天天看点

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

在进行创建文件或者文件resize过程中,需要有一个快捷入口,可以迅速的知道当前磁盘有哪些可用的(free状态的)au,asm free space table 简称fst表就是提供一个这样的功能,通过它可以快速的知道哪些allocation table(at表)元数据块中有空闲的au,它存储的是一个个的at表元数据块的号码,fst表用来加速au的分配,避免读取已经完全被占用殆尽的at块,造成分配空间效率的低下。

fst表技术上说其实是属于at表的一部分,位于at表的块1,fst表和at表都被称为物理元数据,它们经常位于asm磁盘的固定的位置。

fst块存储在asm磁盘头,通过kfed工具可以查看磁盘头的信息,其中kfdhdb.fstlocn的值代表了fst块位于磁盘头的第几个块。例如下面的输出代表了,fst块位于磁盘头的块1,也就是au 0的第二个块。(块从0开始编号)。

$ kfed read /dev/sdc1 | grep kfdhdb.fstlocn

kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001

我们通过kfed工具查看一下fst表的内容:

$ kfed read /dev/sdc1 blkn=1 | more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            2 ; 0x002: kfbtyp_freespc

...

kfdfsb.aunum:                         0 ; 0x000: 0x00000000

kfdfsb.max:                         254 ; 0x004: 0x00fe

kfdfsb.cnt:                         254 ; 0x006: 0x00fe

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:                      119 ; 0x018: free=0x7 frag=0x7

kfdfse[1].fse:                       16 ; 0x019: free=0x0 frag=0x1

kfdfse[2].fse:                       16 ; 0x01a: free=0x0 frag=0x1

kfdfse[3].fse:                       16 ; 0x01b: free=0x0 frag=0x1

kfdfse[4037].fse:                     0 ; 0xfdd: free=0x0 frag=0x0

kfdfse[4038].fse:                     0 ; 0xfde: free=0x0 frag=0x0

kfdfse[4039].fse:                     0 ; 0xfdf: free=0x0 frag=0x0

对于这个fst块,第一个at表元数据块位于au0:

这个fst块最大数量的fst条目可以达到254个,虽然上面kfed的输出中kfdfse[i]的编号到了4039,也就是有4039+1=4040个条目,但是有效条目只有254个。

大的asm磁盘可能会有超过一个stride,asm磁盘头的kfdhdb.mfact显示了stride的大小(单位为au),每一个stride有它自己的物理元数据,这意味着会有它自己的fst表。

第二个stride的物理元数据位于这个stride的第一个au,我们通过kfed工具看一下:

$ kfed read /dev/sdc1 | grep mfact

kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80

以上显示了stride的大小为113792个au,由于au是从0开始编号,因此第一个stride最后的au号是au 113791,我们可以推算出第二个stride的fst位置是,au 113792的第一个块:

$ kfed read /dev/sdc1 aun=113792 blkn=1 | grep type

如预期,我们在au 113792上有另一个fts表,如果我们还有其他的stride,同样会在stride的开始au处有fst表。如下面所示,一个大的asm磁盘,会有数个stride,这里展示了在第三个stride的开始处的fst表:

$ kfed read /dev/sdc1 aun=227584 blkn=1 | grep type

一般fst表位于每一个asm磁盘的au0的块1,如果磁盘比较大,就会有不止一个stride,每一个stride都会有它自己的fst表。

<b>本文来自云栖社区合作伙伴“dbgeek”</b>