Every ASM disk is divided into allocation units (AU). An AU is the fundamental unit of allocation within a disk group. A file extent consists of one or more AU. An ASM file consists of one or more file extents.
In case of 10g,ASM divides files into 1 MB extents/AU's and spreads each file's extents evenly across all disks in the disk group.
Starting from 11g, we can create Diskgroups of varying AU sizes ranging from 1 MB to 64 MB in powers of two, such as, 1, 2, 4, 8, 16, 32, or 64. Each Allocation Unit consumes some amount of memory in ASM SGA for storing the metadata information. Very Large Databases (VLDB) which can have sizes in TeraBytes will have too many AU's allocated and also memory requirement for ASM instance will also increase. This will also impact the performance of the application. As a result Variable Size extents concept has been introduced in 11g.
Extents and Allocation Units
|Number of Extents||Size|
|0 - 19999||1*AU|
|20000 - 39999||8*AU|
|40000 - 59999||64*AU|
As shown in table, for first 20000 extents Extent size is always equal to AU. This keeps on increasing gradually.
The ASM coarse striping is always equal to the disk group AU size, but fine striping size always remains 128KB in any configuration . The AU size is determined at creation time with the allocation unit size (AU_SIZE>) disk group attribute. The values can be 1, 2, 4, 8, 16, 32, and 64 MB.
CREATE DISKGROUP DATA1 EXTERNAL REDUNDANCY DISK '/dev/sda1' ATTRIBUTE 'au_size'='10M';
You can query ALLOCATION_UNIT_SIZE column in V$ASM_DISKGROUP.
Now all this is documented and if I do not mention anything else you will be angry at me 🙂
Now we know this is implemented from 11g. But does that mean it is not available in 10g??
No. It is available in 10g, but we need to play around with some Hidden Parameters.
Warning - You should try this out in Development Environment before trying in Production database. Also contact Oracle Support to validate if this can be implemented in your system and ensure that there are no reported issues/bugs.
<span style="color: #000099;"><span style="color: #3333ff;">SQL> select nam.ksppinm NAME, val.KSPPSTVL VALUE from x$ksppi nam, x$ksppsv val where nam.indx = val.indx and nam.ksppinm like '%asm%';</span></span> <span style="color: #000099;"><span style="color: #3333ff;">NAME VALUE ------------------------------ -------------------- asm_diskstring /dev/sda7* _asm_disk_repair_time 14400 asm_diskgroups DATA asm_power_limit 1 <strong>_asm_ausize 1048576</strong> _asm_blksize 4096 _asm_acd_chunks 1 _asm_libraries ufs _asm_maxio 1048576 _asm_allow_only_raw_disks TRUE _asmlib_test 0 _asm_allow_resilver_corruption FALSE _asmsid asm _asm_wait_time 18 _asm_skip_resize_check FALSE _asm_stripewidth 8 <strong>_asm_stripesize 131072</strong> _asm_droptimeout 60 _asm_emulmax 10000 _asm_emultimeout 0 _asm_kfdpevent 0</span> </span>
We need to look at parameters _asm_ausize and _asm_stripesize which are set to 1 M and 128 K respectively.
In case you wish to create Diskgroup of say 10M Allocation Unit and want to increase the Stripe size to 1M,then set following parameter in pfile
<span style="color: #ff0000;"><strong>_asm_ausize=</strong></span><span style="color: #ff0000;"><strong>10485760 </strong></span><span style="color: #ff0000;"><strong>_asm_stripesize=</strong></span><span style="color: #ff0000;"><strong>1048576</strong></span>
Restart the ASM instance. Please note that these settings will be applicable only for new Diskgroups and will not modify the existing Diskgroups.
You will be required to change the template for the Diskgroup else all the datafiles will use COARSE attribute and will have stripe of 10M. You can find details in 10g SQL reference Guide