I've developed a JS web app to calculate the exact usable space and the reliability specially for the ZFS RAID types. You can find it using the orange button above.
It's stupid-proof but not idiot-proof. For example you can put only one drive and select a mirror RAID (even if the app gives to you the minimum number of drives for the chosen RAID...). It's that way because I don't want to clutter the code with a ton of useless checks on the values, the user must know a minimum what he's doing :)
The app assumes ashift=12, recordsize=128k and no compression.
The app is released under the GPL license.
Size
It supports striped mirrors (but not striped RAID-Zs). For example you can put 12 drives then select "3 Drives Mirror" and the result will be calculated for 4 striped 3 drives mirrors.
The blocks overhead is disabled for now. I can't find a lot of info on the exact value or on how to calculate it. I posted a thread so if someone knows the answer he is welcome :)
The parity and data spaces percentages are relative to the RAID total space. The overheads percentages are relative to the total data space. The minimum free and usable spaces percentages are relative to the total data space minus the total overhead.
The minimum recommended free space uses the 80% rule.
The usable data space is the total data space minus the total overhead and the minimum recommended free space.
Reliability
The MTBF is asked in Mh which stands for Megahours to avoid the need to input many zeros. It's the only other field (the other one is the drive size field) where you can put a decimal number.
The MTTPR (Mean Time To Physical Replacement) is the time needed to detect and physically replace a failed drive.
The MTTR (Mean Time To Recovery) is the sum of the MTTPR and the usable data space divided by the rebuild speed (this is the worst case, if you have a 50% full pool for example the rebuild time will be lower). It's not displayed for a Stripe RAID for obvious reasons...
The MTTDL (Mean Time To Data Loss) is expressed with the scientific notation because it's easier to read and to compare for very large or small numbers. It's not displayed for striped mirrors because it's a pain in the *** to implement :p
Misc
If you don't need the reliability stats you can just fill the first 3 inputs.
If you don't need the size stats you need to fill all the inputs anyway (the reliability stats use them).
You can suggest me some improvements of course ;)
TO-DO
# Move the app to my website
# Integrate the manual to the app
# Add "Minimum recommended free space" % input field (so the user can change the default 80 %)
# Add RAM minimum size recommendation (add checkbox for dedup)
# Rename "Usable data space" to "Recommended usable data space"
# Rename "Minimum recommended free space" to "Recommended minimum free space"
# Rename "Drive size" to "Drive space" (in the results, not the input)
# Add the total data space minus the total overhead (label: Usable data space)
# Add the swap size input (in GB, before RAID type); add swap space after drive space; add drive space - swap space (label: Usable drive space); add total swap space before total parity and data spaces; correct total data space to be total data space - total swap space
# Add Number of vdevs (after RAID type)
# Change the display block/none to be in each RAID type functions instead of a global if() (to allow to temporary not implement the MTTDL, MTTR, ... calculus for a RAID type if too complex)
# Add the DL probability percentage because of URE during resilver (take into account thet for multiple parity it must be URE on the same sector of each drive)
# Add the NOMDL and BHL if possible
# Add the DL probability percentages (for 1, 2, 3, 5, 10, 15, 20 and 30 y)
# Calculate and display the MTTDL for striped mirrors
# Fix the blocks overhead
# Add the allocation overhead
# Display the MTTDL on a logarithmic scale (e.g. 10^x.yz)
It's stupid-proof but not idiot-proof. For example you can put only one drive and select a mirror RAID (even if the app gives to you the minimum number of drives for the chosen RAID...). It's that way because I don't want to clutter the code with a ton of useless checks on the values, the user must know a minimum what he's doing :)
The app assumes ashift=12, recordsize=128k and no compression.
The app is released under the GPL license.
Size
It supports striped mirrors (but not striped RAID-Zs). For example you can put 12 drives then select "3 Drives Mirror" and the result will be calculated for 4 striped 3 drives mirrors.
The blocks overhead is disabled for now. I can't find a lot of info on the exact value or on how to calculate it. I posted a thread so if someone knows the answer he is welcome :)
The parity and data spaces percentages are relative to the RAID total space. The overheads percentages are relative to the total data space. The minimum free and usable spaces percentages are relative to the total data space minus the total overhead.
The minimum recommended free space uses the 80% rule.
The usable data space is the total data space minus the total overhead and the minimum recommended free space.
Reliability
The MTBF is asked in Mh which stands for Megahours to avoid the need to input many zeros. It's the only other field (the other one is the drive size field) where you can put a decimal number.
The MTTPR (Mean Time To Physical Replacement) is the time needed to detect and physically replace a failed drive.
The MTTR (Mean Time To Recovery) is the sum of the MTTPR and the usable data space divided by the rebuild speed (this is the worst case, if you have a 50% full pool for example the rebuild time will be lower). It's not displayed for a Stripe RAID for obvious reasons...
The MTTDL (Mean Time To Data Loss) is expressed with the scientific notation because it's easier to read and to compare for very large or small numbers. It's not displayed for striped mirrors because it's a pain in the *** to implement :p
Misc
If you don't need the reliability stats you can just fill the first 3 inputs.
If you don't need the size stats you need to fill all the inputs anyway (the reliability stats use them).
You can suggest me some improvements of course ;)
TO-DO
# Move the app to my website
# Integrate the manual to the app
# Add "Minimum recommended free space" % input field (so the user can change the default 80 %)
# Add RAM minimum size recommendation (add checkbox for dedup)
# Rename "Usable data space" to "Recommended usable data space"
# Rename "Minimum recommended free space" to "Recommended minimum free space"
# Rename "Drive size" to "Drive space" (in the results, not the input)
# Add the total data space minus the total overhead (label: Usable data space)
# Add the swap size input (in GB, before RAID type); add swap space after drive space; add drive space - swap space (label: Usable drive space); add total swap space before total parity and data spaces; correct total data space to be total data space - total swap space
# Add Number of vdevs (after RAID type)
# Change the display block/none to be in each RAID type functions instead of a global if() (to allow to temporary not implement the MTTDL, MTTR, ... calculus for a RAID type if too complex)
# Add the DL probability percentage because of URE during resilver (take into account thet for multiple parity it must be URE on the same sector of each drive)
# Add the NOMDL and BHL if possible
# Add the DL probability percentages (for 1, 2, 3, 5, 10, 15, 20 and 30 y)
# Calculate and display the MTTDL for striped mirrors
# Fix the blocks overhead
# Add the allocation overhead
# Display the MTTDL on a logarithmic scale (e.g. 10^x.yz)