Back in Nov 2011 I posted a question on the Oracle-L mailing group about my perception that ASM disk rebalances seemed to be required on DATA diskgroups in ASM (never FRA, presumably because the FRA had lots of similar sized objects (flashlogs archivelogs etc)) and even after rebalancing there seemed to be a permanent imbalance between disks of the same size. I was querying the effectiveness of the rebalancing operation.
There was some good responses including a script that Dave Herring had created, based on key MOS articles: 818171.1 (Identifying Files with Imbalances), 351117.1 (Troubleshooting ASM Space Issues), 367445.1 (Advanced Balance and Space Report on ASM). Manual rebalancing would normally not be required, because ASM automatically rebalances disk groups when their configuration changes. You might want to do a manual rebalance operation if you want to control the speed of what would otherwise be an automatic rebalance operation.
I have been chasing this down and have now come across Bug 7699985: UNBALANCED DISTRIBUTION OF FILES ACROSS DISKS.
It appears to be a problem in 11.1.0.7 and I know a number of sites have reported it. Despite repeated manual rebalance operations there can be a variance of up to 10% between different disks of the same diskgroup, even if they are the same size. It is fixed in 11.2.0.1. The workaround is to set the _asm_imbalance_tolerance parameter to be 0 rather than the default of 3.This controls the hundredths of a percentage of inter-disk imbalance to tolerate. Then rebalance the disks manually and reset the parameter back again to 3 as you don’t need to leave it balancing all the time.
SQL> @asm_imbalance (from Report the Percentage of Imbalance in all Mounted Diskgroups (Doc ID 367445.1)
@asm_imbalance.sql
Columns Described in Script Percent Minimum
Percent Disk Size Percent Disk Diskgroup
Diskgroup Name Imbalance Varience Free Count Redundancy
------------------------------ --------- --------- ------- ----- ----------
DATA 9.0 .5 15.2 84 EXTERN
SYS@+ASM SQL>l
Select dg.name,dg.allocation_unit_size/1024/1024 "AU(Mb)",min(d.free_mb) Min,
max(d.free_mb) Max, avg(d.free_mb) Avg
from v$asm_disk d, v$asm_diskgroup dg
where d.group_number = dg.group_number
group by dg.name, dg.allocation_unit_size/1024/1024
SY@+ASM SQL>/
NAME AU(Mb) MIN MAX AVG
------------------------------ ---------- ---------- ---------- ------
DATA 1 7728 11599 8026
alter diskgroup data rebalance power 4;
NAME AU(Mb) MIN MAX AVG
------------------------------ ---------- ---------- ---------- ------
DATA 1 7734 11483 8026 – no difference
alter system set "_asm_imbalance_tolerance"=0;
alter diskgroup data rebalance power 4;
NAME AU(Mb) MIN MAX AVG
------------------------------ ---------- ---------- ---------- ----------
DATA 1 8020 8062 8026 - Now nicely rebalanced