I've just been benchmarking a test ZFS setup to answer that very question in regards with performances (on a pair of old dusty servers revived from their ashes).
My setup is:
2x Intel Xeon L5640 CPU @ 2.27GHz (total: 12 cores; HT disabled)
96GiB DDR3 RAM @ 1333MHz
Adaptec 5805Z controller, exporting all disks as JBODs (with write-cache enabled, thanks to the controller's battery-backed NVRAM)
12x 15kRPM 146GB SAS disks (Seagate ST3146356SS)
per-disk DRBD replication (protocol C) via IP-over-Infiniband (20Gb/s Mellanox MT25204)
ZFS 0.7.6 on Debian/Stretch
zpool create -o ashift=12 ... /dev/drbd{...} (Note: DRBD works with a replication "unit" size of 4KiB)
zfs create -o recordsize=128k -o atime=off -o compression=off -o primarycache=metadata ... (the last two for benchmarking purposes only)
Below the bonnie++ results for all possible interesting combinations of RAIDz2 and RAIDz3 (averaged across 5 runs of 12 synchronized bonnie++ processes):
TEST: # data bandwidth
bonnie++ -p <threads>
for n in $(seq 1 <threads>); do
bonnie++ -r 256 -f -s 1024:1024k -n 0 -q -x 1 -y s &
done
# create/stat/delete operations
bonnie++ -p <threads>
for n in $(seq 1 <threads>); do
bonnie++ -r 256 -f -s 0 -n 128:0:0:16 -q -x 1 -y s &
done
CASE: 1*RAIDz2(10d+2p+0s), ashift:12(4k), recordsize:128k, threads:12, runs:5(data)/3(ops)
MiB/s: WR=278273, RW=150845, RD=487315
ops/s: SCr=132681, SDl=71022, RCr=133677, RDl=71723
CASE: 1*RAIDz3(9d+3p+0s), ashift:12(4k), recordsize:128k, threads:12, runs:5(data)/3(ops)
MiB/s: WR=276121, RW=158854, RD=480744
ops/s: SCr=132864, SDl=71848, RCr=127962, RDl=71616
CASE: 1*RAIDz2(9d+2p+1s), ashift:12(4k), recordsize:128k, threads:12, runs:5(data)/3(ops)
MiB/s: WR=260164, RW=151531, RD=541470
ops/s: SCr=137148, SDl=71804, RCr=137616, RDl=71360
CASE: 1*RAIDz3(8d+3p+1s), ashift:12(4k), recordsize:128k, threads:12, runs:5(data)/3(ops)
MiB/s: WR=269130, RW=184821, RD=672185
ops/s: SCr=134619, SDl=75716, RCr=127364, RDl=74545
CASE: 1*RAIDz2(8d+2p+2s), ashift:12(4k), recordsize:128k, threads:12, runs:5(data)/3(ops)
MiB/s: WR=255257, RW=135808, RD=509976
ops/s: SCr=136218, SDl=74684, RCr=130325, RDl=73915
CASE: 2*RAIDz2(4d+2p+0s), ashift:12(4k), recordsize:128k, threads:12, runs:5(data)/3(ops)
MiB/s: WR=379814, RW=225399, RD=586771
ops/s: SCr=120843, SDl=69416, RCr=122889, RDl=65736
DATA: WR = Sequential Write
RW = Sequential Rewrite
RD = Sequential Read
SCr = Sequential Create
SDl = Sequential Delete
RCr = Random Create
RDl = Random Delete
As far as performances are concerned:
As to how to interpret/explain those results; my 1-pennies:
8 data disks divides the 128k recordsize exactly, it might explain (?) why they always outperform 9 or 10 data disks (given the test is run with 1024k chunk size, which aligns exactly on all disks)
I would expect RAIDz3 to perform worse than RAIDz2, yet the 1*RAIDz3(8d+3p+1s) case very strangely contradicts this
the significantly smaller VDEVs size of the 2*RAIDz2(4d+2p+0s) case might explain (?) why it performs significantly better for writes
EDIT 1
In response to @AndrewHenle comment, below are additional benchmarks with varying "chunk" sizes. Unfortunately, bonnie++ does not allow chunk sizes other than power of 2; so I reverted to (5 averaged runs) of dd:
PS: remember, ZFS read cache (ARC) is disabled
TEST: # WR: Sequential Write
rm /zfs/.../dd.*
for n in $(seq 1 <threads>); do
dd if=/dev/zero of=/zfs/.../dd.${n} bs=<chunk> count=<count> &
done
# RD: Sequential Read
for n in $(seq 1 <threads>); do
dd of=/dev/null if=/zfs/.../dd.${n} bs=<chunk> count=<count> &
done
CASE: 1*RAIDz2(10d+2p+0s), ashift:12(4k), recordsize:128k, threads:12, runs:5
chunk: 1280k 1152k 1024k 128k 4k
count: 1024 (n/a) 1024 10240 327680(32768 for RD)
MiB/s: WR 418.64 (n/a) 434.56 404.44 361.76
RD 413.24 (n/a) 469.70 266.58 15.44
CASE: 1*RAIDz3(9d+3p+0s), ashift:12(4k), recordsize:128k, threads:12, runs:5
chunk: 1280k 1152k 1024k 128k 4k
count: 1024 1024 1024 10240 327680(32768 for RD)
MiB/s: WR 428.44 421.78 440.76 421.60 362.48
RD 425.76 394.48 486.64 264.74 16.50
CASE: 1*RAIDz3(9d+2p+1s), ashift:12(4k), recordsize:128k, threads:12, runs:5
chunk: 1280k 1152k 1024k 128k 4k
count: 1024 1024 1024 10240 327680(32768 for RD)
MiB/s: WR 422.56 431.82 462.14 437.90 399.94
RD 420.66 406.38 476.34 259.04 16.48
CASE: 1*RAIDz3(8d+3p+1s), ashift:12(4k), recordsize:128k, threads:12, runs:5
chunk: 1280k 1152k 1024k 128k 4k
count: 1024 (n/a) 1024 10240 327680(32768 for RD)
MiB/s: WR 470.42 (n/a) 508.96 476.34 426.08
RD 523.88 (n/a) 586.10 370.58 17.02
CASE: 1*RAIDz2(8d+2p+2s), ashift:12(4k), recordsize:128k, threads:12, runs:5
chunk: 1280k 1152k 1024k 128k 4k
count: 1024 (n/a) 1024 10240 327680(32768 for RD)
MiB/s: WR 411.42 (n/a) 450.54 425.38 378.38
RD 399.42 (n/a) 444.24 267.26 16.92
CASE: 2*RAIDz2(4d+2p+0s), ashift:12(4k), recordsize:128k, threads:12, runs:5
chunk: 1280k 1152k 1024k 128k 4k
count: 1024 (n/a) 1024 10240 327680(32768 for RD)
MiB/s: WR 603.64 (n/a) 643.96 604.02 564.64
RD 481.40 (n/a) 534.80 349.50 18.52
As for my 1-pennies:
ZFS obviously optimizes writes intelligently enough (even for chunk sizes below the record size) and/or (?) the Adaptec controller (non-volatile, 512MiB) cache significantly helps in this regards
Obviously again, disabling the ZFS read cache (ARC) is very detrimental for chunk sizes close or below the record size; and it seems the Adaptec controller cache is (surprisingly ?) not used for read purposes. Bottom-line: disabling ARC for benchmark purposes allows to have insights into "raw, low-level" performances but is ill-advised for production use (apart from specific cases, like a seldom-used library of large files)
Adjusting the chunk size to match the VDEVs size appears not to play a positive role [WRONG ASSUMPTION; see EDIT 2]
EDIT 2
About RAIDz and block size (ashift) and record size (ZFS filesystem):
And a WARNING:
BOTTOM LINE
(confirming what has already been said in other responses)
(Striping) smaller VDEVs - with less data disks - perform better than large ones; computing/verifying the parity is obviously a costly operation, which grows worse than linearly over the quantity of data disks (cf. 8d <-> 2*4d cases)
Same-size VDEVs with more parity disk(s) perform better than fewer parity disk(s) and hot spare(s), and provide better data protection
Use hot spare(s) to address "don't wake me up in the middle of the night" concerns, if you still have disk(s) to spare after favoring parity disk(s) [WARNING! see EDIT 2]
POST SCRIPTUM
My eventual use case being hosting a (long term) time-series database (steady medium-sized writes and potentially very large sporadic reads), for which I have very little detailed documentation on the I/O patterns (save for an "optimized for SSD" recommendation), I will personally go for 1*RAIDz2(8d+3p+1s): maximum security, little less capacity, (2nd) best performances