I’ve run a series of benchmarks on my prototyping server to determine performance differences between a variety of configurations:
- Single drive UFS2
- Single drive ZFS
- ZFS 3-way mirror
- ZFS stripe across 3 drives
- ZFS RaidZ across 3 drives
- ZFS RaidZ across 3 drives, plus a SSD as cache.
All the details on configuration and benchmark methods are below!
System Specification
Mainboard: MSI P45 Neo (v1.0)
Disk Controller:ICH10
RAM: 8GB DDR2 1066MHz
Hard drive: Seagate Barracuda® 2TB (ST2000DM001)
ZFS Cache partition resides on a a Corsair CSSD-V64GB2 2.2 (shared with OS + SWAP)
OS info: FreeBSD lou 9.0-RELEASE-p3 FreeBSD 9.0-RELEASE-p3 #0: Tue Jun 12 02:52:29 UTC 2012 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
Disk Info
diskinfo -t /dev/ada0
/dev/ada0
512 # sectorsize
2000398934016 # mediasize in bytes (1.8T)
3907029168 # mediasize in sectors
4096 # stripesize
0 # stripeoffset
3876021 # Cylinders according to firmware.
16 # Heads according to firmware.
63 # Sectors according to firmware.
W##0###A # Disk ident.
Seek times:
Full stroke: 250 iter in 5.911129 sec = 23.645 msec
Half stroke: 250 iter in 4.314233 sec = 17.257 msec
Quarter stroke: 500 iter in 7.031946 sec = 14.064 msec
Short forward: 400 iter in 1.652751 sec = 4.132 msec
Short backward: 400 iter in 2.368759 sec = 5.922 msec
Seq outer: 2048 iter in 0.322749 sec = 0.158 msec
Seq inner: 2048 iter in 0.237719 sec = 0.116 msec
Transfer rates:
outside: 102400 kbytes in 0.638196 sec = 160452 kbytes/sec
middle: 102400 kbytes in 0.579845 sec = 176599 kbytes/sec
inside: 102400 kbytes in 1.054388 sec = 97118 kbytes/sec
Tests
Machine is rebooted before each individual test. Test files are removed after each batch.
First batch: 8GiB working set, 4KiB buffer
dd RandomWrite: dd if=/dev/random bs=4k count=2m of=./test.bin
dd Read: dd if=./test.bin bs=4k count=2m of=/dev/null
dd ReadWrite: dd if=./test.bin bs=4k count=2m of=./test2.bin
dd ZeroWrite: dd if=/dev/zero bs=4k count=2m of=./test3.bin
Second batch: 8GiB working set, 64KiB buffer
dd RandomWrite: dd if=/dev/random bs=64k count=128k of=./test.bin
dd Read: dd if=./test.bin bs=64k count=128k of=/dev/null
dd ReadWrite: dd if=./test.bin bs=64k count=128k of=./test2.bin
dd ZeroWrite: dd if=/dev/zero bs=64k count=128k of=./test3.bin
Third batch: 16GiB working set
Bonnie: bonnie++ -s 16384 -n 100 -f 20M -q -m “<benchmark_name>” >>~/bonnie.csv
Configurations
UFS
gpart add -t freebsd-ufs -a 1m -l test ada0
ada0p1 added
newfs /dev/gpt/test
Reduced frags per cylinder group from 189440 to 189432 to enlarge last cyl group
/dev/gpt/test: 1907728.0MB (3907026944 sectors) block size 32768, fragment size 4096
using 2579 cylinder groups of 739.97MB, 23679 blks, 47360 inodes.
super-block backups (for fsck -b #) at:
[many numbers]
gpart show ada0
=> 34 3907029101 ada0 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-ufs (1.8T)
3907028992 143 - free - (71k)
gpart list ada0
Geom name: ada0
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 3907029134
first: 34
entries: 128
scheme: GPT
Providers:
1. Name: ada0p1
Mediasize: 2000397795328 (1.8T)
Sectorsize: 512
Stripesize: 4096
Stripeoffset: 0
Mode: r0w0e0
rawuuid: ####
rawtype: ####
label: test
length: 2000397795328
offset: 1048576
type: freebsd-ufs
index: 1
end: 3907028991
start: 2048
Consumers:
1. Name: ada0
Mediasize: 2000398934016 (1.8T)
Sectorsize: 512
Stripesize: 4096
Stripeoffset: 0
Mode: r0w0e0
ZFS
gpart add -t freebsd-zfs -a 1m -l test ada0
gpart show ada0
=> 34 3907029101 ada0 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gnop create -S 4K /dev/gpt/test
zpool create test /dev/gpt/test.nop
zfs set atime=off test
zfs set checksum=fletcher4 test
zdb | grep ashift
ashift: 12
zpool export test
gnop destroy /dev/gpt/test.nop
zpool import -d /dev/gpt test
zpool status
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
gpt/test ONLINE 0 0 0
errors: No known data errors
ZFS Mirror
gpart add -t freebsd-zfs -a 1m -l test1 ada0
gpart add -t freebsd-zfs -a 1m -l test2 ada1
gpart add -t freebsd-zfs -a 1m -l test3 ada2
gpart show ada0
=> 34 3907029101 ada0 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gpart show ada1
=> 34 3907029101 ada1 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gpart show ada2
=> 34 3907029101 ada2 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gnop create -S 4K /dev/gpt/test1
gnop create -S 4K /dev/gpt/test2
gnop create -S 4K /dev/gpt/test3
zpool create test mirror /dev/gpt/test1.nop /dev/gpt/test2.nop /dev/gpt/test3.nop
zfs set atime=off test
zfs set checksum=fletcher4 test
zdb | grep ashift
ashift: 12
zpool export test
gnop destroy /dev/gpt/test1.nop
gnop destroy /dev/gpt/test2.nop
gnop destroy /dev/gpt/test3.nop
zpool import -d /dev/gpt test
zpool status
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/test1 ONLINE 0 0 0
gpt/test2 ONLINE 0 0 0
gpt/test3 ONLINE 0 0 0
errors: No known data errors
ZFS Stripe
gpart add -t freebsd-zfs -a 1m -l test1 ada0
gpart add -t freebsd-zfs -a 1m -l test2 ada1
gpart add -t freebsd-zfs -a 1m -l test3 ada2
gpart show ada0
=> 34 3907029101 ada0 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gpart show ada1
=> 34 3907029101 ada1 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gpart show ada2
=> 34 3907029101 ada2 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gnop create -S 4K /dev/gpt/test1
gnop create -S 4K /dev/gpt/test2
gnop create -S 4K /dev/gpt/test3
zpool create test /dev/gpt/test1.nop /dev/gpt/test2.nop /dev/gpt/test3.nop
zfs set atime=off test
zfs set checksum=fletcher4 test
zdb | grep ashift
ashift: 12
ashift: 12
ashift: 12
zpool export test
gnop destroy /dev/gpt/test1.nop
gnop destroy /dev/gpt/test2.nop
gnop destroy /dev/gpt/test3.nop
zpool import -d /dev/gpt test
zpool status
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
gpt/test1 ONLINE 0 0 0
gpt/test2 ONLINE 0 0 0
gpt/test3 ONLINE 0 0 0
errors: No known data errors
ZFS RaidZ
gpart add -t freebsd-zfs -a 1m -l test1 ada0
gpart add -t freebsd-zfs -a 1m -l test2 ada1
gpart add -t freebsd-zfs -a 1m -l test3 ada2
gpart show ada0
=> 34 3907029101 ada0 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gpart show ada1
=> 34 3907029101 ada1 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gpart show ada2
=> 34 3907029101 ada2 GPT (1.8T)
34 2014 - free - (1M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (71k)
gnop create -S 4K /dev/gpt/test1
gnop create -S 4K /dev/gpt/test2
gnop create -S 4K /dev/gpt/test3
zpool create test raidz /dev/gpt/test1.nop /dev/gpt/test2.nop /dev/gpt/test3.nop
zfs set atime=off test
zfs set checksum=fletcher4 test
zdb | grep ashift
ashift: 12
zpool export test
gnop destroy /dev/gpt/test1.nop
gnop destroy /dev/gpt/test2.nop
gnop destroy /dev/gpt/test3.nop
zpool import -d /dev/gpt test
zpool status
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
gpt/test1 ONLINE 0 0 0
gpt/test2 ONLINE 0 0 0
gpt/test3 ONLINE 0 0 0
errors: No known data errors
ZFS RaidZ + Cache
eSame commands as ZFS RaidZ, plus these:
gpart add -a 1m -t freebsd-zfs -l zfscache ada3
gpart show ada3
=> 34 125045357 ada3 GPT (59G)
34 128 1 freebsd-boot (64k)
162 16777216 2 freebsd-ufs (8.0G)
16777378 4194304 3 freebsd-swap (2.0G)
20971682 1886 - free - (943k)
20973568 104071168 4 freebsd-zfs (49G)
125044736 655 - free - (327k)
zpool add test cache /dev/gpt/zfscache
zpool status
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
gpt/test1 ONLINE 0 0 0
gpt/test2 ONLINE 0 0 0
gpt/test3 ONLINE 0 0 0
cache
gpt/zfscache ONLINE 0 0 0
errors: No known data errors