Richard's blog analyzes MTTDL as a function of N+P+S: http://blogs.sun.com/relling/entry/raid_recommendations_space_vs_mttdl
But to understand how to best utilize an array with a fixed number of drives, I add the following constraints: - N+P should follow ZFS best-practice rule of N={2,4,8} and P={1,2} - all sets in an array should be configured similarly - the MTTDL for S sets is equal to (MTTDL for one set)/S I got the following results by varying the NUM_BAYS parameter in the source code below: *_4 bays w/ 300 GB drives having MTBF=4 years_* - can have 1 (2+1) w/ 1 spares providing 600 GB with MTTDL of 5840.00 years - can have 1 (2+2) w/ 0 spares providing 600 GB with MTTDL of 799350.00 years - can have 0 (4+1) w/ 4 spares providing 0 GB with MTTDL of Inf years - can have 0 (4+2) w/ 4 spares providing 0 GB with MTTDL of Inf years - can have 0 (8+1) w/ 4 spares providing 0 GB with MTTDL of Inf years - can have 0 (8+2) w/ 4 spares providing 0 GB with MTTDL of Inf years *_8 bays w/ 300 GB drives having MTBF=4 years_* - can have 2 (2+1) w/ 2 spares providing 1200 GB with MTTDL of 2920.00 years - can have 2 (2+2) w/ 0 spares providing 1200 GB with MTTDL of 399675.00 years - can have 1 (4+1) w/ 3 spares providing 1200 GB with MTTDL of 1752.00 years - can have 1 (4+2) w/ 2 spares providing 1200 GB with MTTDL of 2557920.00 years - can have 0 (8+1) w/ 8 spares providing 0 GB with MTTDL of Inf years - can have 0 (8+2) w/ 8 spares providing 0 GB with MTTDL of Inf years *_12 bays w/ 300 GB drives having MTBF=4 years_* - can have 4 (2+1) w/ 0 spares providing 2400 GB with MTTDL of 365.00 years - can have 3 (2+2) w/ 0 spares providing 1800 GB with MTTDL of 266450.00 years - can have 2 (4+1) w/ 2 spares providing 2400 GB with MTTDL of 876.00 years - can have 2 (4+2) w/ 0 spares providing 2400 GB with MTTDL of 79935.00 years - can have 1 (8+1) w/ 3 spares providing 2400 GB with MTTDL of 486.67 years - can have 1 (8+2) w/ 2 spares providing 2400 GB with MTTDL of 426320.00 years *_16 bays w/ 300 GB drives having MTBF=4 years_* - can have 5 (2+1) w/ 1 spares providing 3000 GB with MTTDL of 1168.00 years - can have 4 (2+2) w/ 0 spares providing 2400 GB with MTTDL of 199837.50 years - can have 3 (4+1) w/ 1 spares providing 3600 GB with MTTDL of 584.00 years - can have 2 (4+2) w/ 4 spares providing 2400 GB with MTTDL of 1278960.00 years - can have 1 (8+1) w/ 7 spares providing 2400 GB with MTTDL of 486.67 years - can have 1 (8+2) w/ 6 spares providing 2400 GB with MTTDL of 426320.00 years *_20 bays w/ 300 GB drives having MTBF=4 years_* - can have 6 (2+1) w/ 2 spares providing 3600 GB with MTTDL of 973.33 years - can have 5 (2+2) w/ 0 spares providing 3000 GB with MTTDL of 159870.00 years - can have 4 (4+1) w/ 0 spares providing 4800 GB with MTTDL of 109.50 years - can have 3 (4+2) w/ 2 spares providing 3600 GB with MTTDL of 852640.00 years - can have 2 (8+1) w/ 2 spares providing 4800 GB with MTTDL of 243.33 years - can have 2 (8+2) w/ 0 spares providing 4800 GB with MTTDL of 13322.50 years *_24 bays w/ 300 GB drives having MTBF=4 years_* - can have 8 (2+1) w/ 0 spares providing 4800 GB with MTTDL of 182.50 years - can have 6 (2+2) w/ 0 spares providing 3600 GB with MTTDL of 133225.00 years - can have 4 (4+1) w/ 4 spares providing 4800 GB with MTTDL of 438.00 years - can have 4 (4+2) w/ 0 spares providing 4800 GB with MTTDL of 39967.50 years - can have 2 (8+1) w/ 6 spares providing 4800 GB with MTTDL of 243.33 years - can have 2 (8+2) w/ 4 spares providing 4800 GB with MTTDL of 213160.00 years While its true that RAIDZ2 is /much /safer that RAIDZ, it seems that /any /RAIDZ configuration will outlive me and so I conclude that RAIDZ2 is unnecessary in a practical sense... This conclusion surprises me given the amount of attention people give to double-parity solutions - what am I overlooking? Thanks, Kent _*Source Code*_ (compile with: cc -std:c99 -lm <filename>) [its more than 80 columns - sorry!] #include <stdio.h> #include <math.h> #define NUM_BAYS 24 #define DRIVE_SIZE_GB 300 #define MTBF_YEARS 4 #define MTTR_HOURS_NO_SPARE 16 #define MTTR_HOURS_SPARE 4 int main() { printf("\n"); printf("%u bays w/ %u GB drives having MTBF=%u years\n", NUM_BAYS, DRIVE_SIZE_GB, MTBF_YEARS); for (int num_drives=2; num_drives<=8; num_drives*=2) { for (int num_parity=1; num_parity<=2; num_parity++) { double mttdl; int mtbf_hours = MTBF_YEARS * 365 * 24; int total_num_drives = num_drives + num_parity; int num_instances = NUM_BAYS / total_num_drives; int num_spares = NUM_BAYS % total_num_drives; double mttr = num_spares==0 ? MTTR_HOURS_NO_SPARE : MTTR_HOURS_SPARE; int total_capacity = num_drives * num_instances * DRIVE_SIZE_GB; if (num_parity==1) { mttdl = pow(mtbf_hours, 2.0) / (total_num_drives * (total_num_drives-1) * mttr ); } else if (num_parity==2) { mttdl = pow(mtbf_hours, 3.0) / (total_num_drives * (total_num_drives-1) * (total_num_drives-2) * pow(mttr, 2. } printf(" - can have %u (%u+%u) w/ %u spares providing %u GB with MTTDL of %.2f years\n", num_instances, num_drives, num_parity, num_spares, total_capacity, mttdl/24/365/num_instances ); } } } _______________________________________________ zfs-discuss mailing list zfs-discuss@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/zfs-discuss