The ASM attributes directory - the ASM metadata file number 9 - contains the information about disk group attributes. The attributes directory exists only in disk groups with the COMPATIBLE.ASM (attribute!) set to 11.1 or higher.
Disk group attributes were introduced in ASM version 11.1[1] and can be used to fine tune the disk group properties. It is worth noting that some attributes can be set only at the time of the disk group creation (e.g. AU_SIZE), while others can be set at any time (e.g. DISK_REPAIR_TIME). Some attribute values might be stored in the disk header (e.g. AU_SIZE), while some others (e.g. COMPATIBLE.ASM), can be stored either in the partnership and status table or in the disk header (depending on the ASM version).
Public attributes
Most attributes are stored in the attributes directory and are externalized via V$ASM_ATTRIBUTE view. Let's have a look at disk group attributes for all my disk groups.
SQL> SELECT g.name "Group", a.name "Attribute", a.value "Value"
FROM v$asm_diskgroup g, v$asm_attribute a
WHERE g.group_number=a.group_number and a.name not like 'template%';
Group Attribute Value
----- ----------------------- ----------------
ACFS disk_repair_time 3.6h
au_size 1048576
access_control.umask 026
access_control.enabled TRUE
cell.smart_scan_capable FALSE
compatible.advm 11.2.0.0.0
compatible.rdbms 11.2
compatible.asm 11.2.0.0.0
sector_size 512
DATA access_control.enabled TRUE
cell.smart_scan_capable FALSE
compatible.rdbms 11.2
compatible.asm 11.2.0.0.0
sector_size 512
au_size 1048576
disk_repair_time 3.6h
access_control.umask 026
SQL>
One attribute value we can modify at any time is the disk repair timer. Let's use asmcmd to do that for disk group DATA.
$ asmcmd setattr -G DATA disk_repair_time '8.0h'
$ asmcmd lsattr -lm disk_repair_time
Group_Name Name Value RO Sys
ACFS disk_repair_time 3.6h N Y
DATA disk_repair_time 8.0h N Y
$
Hidden attributes
As mentioned in the introduction, the attributes directory is the ASM metadata file number 9. Let's locate the attributes directory, in disk group number 2:
SQL> SELECT x.disk_kffxp "Disk#",
x.xnum_kffxp "Extent",
x.au_kffxp "AU",
d.name "Disk name"
FROM x$kffxp x, v$asm_disk_stat d
WHERE x.group_kffxp=d.group_number
and x.disk_kffxp=d.disk_number
and d.group_number=2
and x.number_kffxp=9
ORDER BY 1, 2;
Disk# Extent AU Disk name
----- ------ ---- ---------
0 0 1146 ASMDISK1
1 0 1143 ASMDISK2
2 0 1150 ASMDISK3
SQL>
Now check out the attributes with the kfed tool.
$ kfed read /dev/oracleasm/disks/ASMDISK3 aun=1150 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 23 ; 0x002: KFBTYP_ATTRDIR
...
kfede[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0
kfede[0].entry.hash: 0 ; 0x028: 0x00000000
kfede[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfede[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0
kfede[0].name: disk_repair_time ; 0x034: length=16
kfede[0].value: 8.0h ; 0x074: length=4
...
Fields kfede[i] will have the disk group attribute names and values. Let's look at all of them:
$ kfed read /dev/oracleasm/disks/ASMDISK3 aun=1150 | egrep "name|value"
kfede[0].name: disk_repair_time ; 0x034: length=16
kfede[0].value: 8.0h ; 0x074: length=4
kfede[1].name: _rebalance_compact ; 0x1a8: length=18
kfede[1].value: TRUE ; 0x1e8: length=4
kfede[2].name: _extent_sizes ; 0x31c: length=13
kfede[2].value: 1 4 16 ; 0x35c: length=6
kfede[3].name: _extent_counts ; 0x490: length=14
kfede[3].value: 20000 20000 214748367 ; 0x4d0: length=21
kfede[4].name: _ ; 0x604: length=1
kfede[4].value: 0 ; 0x644: length=1
kfede[5].name: au_size ; 0x778: length=7
kfede[5].value: ; 0x7b8: length=9
kfede[6].name: sector_size ; 0x8ec: length=11
kfede[6].value: ; 0x92c: length=9
kfede[7].name: compatible ; 0xa60: length=10
kfede[7].value: ; 0xaa0: length=9
kfede[8].name: cell ; 0xbd4: length=4
kfede[8].value: FALSE ; 0xc14: length=5
kfede[9].name: access_control ; 0xd48: length=14
kfede[9].value: FALSE ; 0xd88: length=5
This gives us a glimpse into the hidden (underscore) disk group attributes. We can see that the value of the _REBALANCE_COMPACT is TRUE. That is the attribute to do with the compacting phase of the disk group rebalance. We also see how the extent size will grow (_EXTENT_SIZES) - initial size will be 1 AU, then 4 AU and finally 16 AU. And the _EXTENT_COUNTS shows the breaking points for the extent size growth - first 20000 extents will be 1 AU in size, next 20000 will be 4 AU and the rest will be 16 AU.
Conclusion
Disk group attributes can be used to fine tune the disk group properties. Most attributes are stored in the attributes directory and are externalized via V$ASM_ATTRIBUTE view. For details about the attributes please see the ASM Disk Group Attributes post.
[1] In ASM version prior to 11.1 it was possible to create a disk group with user specified allocation unit size. That was done via hidden ASM initialization parameter _ASM_AUSIZE. While technically that was not a disk group attribute, it served the same purpose as the AU_SIZE attribute in ASM version 11.1 and later.
Awesome. Thanks for this.
ReplyDelete