Resent as HTML to avoid line-wrapping:
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