Hier mal ein paar performance Messungen unter FreeBSD. Messungen sind ja alle sehr relativ, der eine mag das Andere, ich mag bonnie.
Die Messungen fanden statt auf einem i5-6600, 32GB Ram und FreeBSD 12.2, bonnie++1,98. Filesystem ist ZFS. Der Cache ist 29GB groß, das ZIL 1GB.
Samsung SSD 950 PRO 512GB
Die 950 Pro wurde abgelöst – durch eine SanDisk Extreme Pro 1TB. Sie dürfte baugleich mit der WD Black Series sein, WD kaufte SanDisk vor längerem.
Die performance Messungen fanden unter FreeBSD 13-Release statt.
SanDisk Extreme Pro 1TB
Raid1 mit 2x Seagate Barracuda 4TB
Bei der initialen Erstellung meines Raid1 bestehend aus 2 Seagate 4TB Festplatten des Typs ST4000DM004 hatte ich einfach den zpool create mit den raw-devices verwendet – und damit das sector 63 Problem:
2x4GB false sec63
raid1 mit cache und log (L2ARC - 29GB, logs 1GB beides auf nvme)
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1 64G 287k 99 10.4m 1 8373k 1 720k 99 2.7g 99 200.0 4
Latency 29770us 437s 430s 14303us 391us 859ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 165.746758 0 +++++ +++ +++++ +++ 566.048702 1
Latency 28743us 41us 54405ms 1516us 20us 5952ms
Dann habe ich das sector 63 Problem behoben:
gpart show ada3
=> 40 7814037088 ada3 GPT (3.6T)
40 2008 - free - (1.0M)
2048 7814033408 1 freebsd-zfs (3.6T)
7814035456 1672 - free - (836K)
gpart show ada5
=> 40 7814037088 ada5 GPT (3.6T)
40 2008 - free - (1.0M)
2048 7814033408 1 freebsd-zfs (3.6T)
7814035456 1672 - free - (836K)
Danach interessiert man sich dafür, wofür man sich die Arbeit gemacht hat und macht mal ein paar performance Messungen, angefangen mit einer Single-disk, über Zuschaltung von cache und zuletzt dem ZIL (log):
single disk, mit zfs
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1-single 64G 306k 98 105m 7 30.1m 2 727k 98 179m 6 145.7 1
Latency 28417us 38531us 1541ms 45365us 173ms 478ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1-single -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 4154.577626 8 +++++ +++ +++++ +++ 3948.968091 7
Latency 1598us 36us 967ms 1535us 24us 468ms
raid1 - "naggisch"
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1 64G 299k 97 76.8m 6 40.8m 3 702k 96 232m 8 220.6 2
Latency 28550us 38345us 861ms 68444us 175ms 325ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 4145.272690 8 +++++ +++ +++++ +++ 3683.089828 7
Latency 1502us 30us 899ms 1463us 83us 441ms
raid1 mit cache (L2ARC - auf 29GB nvme)
[root@alpina /raid1]# bonnie++ -r 32768 -m alpinaR1_cache -u root
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1_cache 64G 230k 89 68.9m 5 39.8m 3 720k 99 235m 8 241.0 3
Latency 33220us 7303ms 623ms 29652us 269ms 341ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1_cache -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 2690.164896 5 +++++ +++ +++++ +++ 4142.792682 8
Latency 1511us 37us 2925ms 1473us 25us 558ms
raid1 mit cache und log (L2ARC - 29GB, logs 1GB beides auf nvme)
[root@alpina /raid1]# bonnie++ -r 32768 -m alpinaR1_cache_log -u root
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1_cache_ 64G 258k 99 78.9m 6 46.4m 4 700k 96 229m 8 229.2 2
Latency 33061us 7278ms 567ms 103ms 196ms 391ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1_cache_log -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 3669.165249 7 +++++ +++ +++++ +++ 3656.157708 7
Latency 1560us 36us 1601ms 1470us 26us 580ms
und hier nochmal das listing im direkten Vergleich:
single disk, mit zfs im Vergleich zur Raid1 config
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1-single 64G 306k 98 105m 7 30.1m 2 727k 98 179m 6 145.7 1
Latency 28417us 38531us 1541ms 45365us 173ms 478ms
alpinaR1_cache_log 258k 99 78.9m 6 46.4m 4 700k 96 229m 8 229.2 2
Latency 33061us 7278ms 567ms 103ms 196ms 391ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1-single -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 4154.577626 8 +++++ +++ +++++ +++ 3948.9680 7
Latency 1598us 36us 967ms 1535us 24us 468ms
alpinaR1_cache_log /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 3669.165249 7 +++++ +++ +++++ +++ 3656.1577 7
Latency 1560us 36us 1601ms 1470us 26us 580ms
2x4GB Raid1 mit false sec63 im Vergleich zur "bereinigten" config:
Version 1.98 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
alpinaR1-sec63 287k 99 10.4m 1 8373k 1 720k 99 2.7g 99 200.0 4
Latency 29770us 437s 430s 14303us 391us 859ms
alpinaR1_new 258k 99 78.9m 6 46.4m 4 700k 96 229m 8 229.2 2
Latency 33061us 7278ms 567ms 103ms 196ms 391ms
Version 1.98 ------Sequential Create------ --------Random Create--------
alpinaR1-sec63 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 165.746758 0 +++++ +++ +++++ +++ 566.048702 1
Latency 28743us 41us 54405ms 1516us 20us 5952ms
alpinaR1_new /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 +++++ +++ +++++ +++ 3669.165249 7 +++++ +++ +++++ +++ 3656.1577 7
Latency 1560us 36us 1601ms 1470us 26us 580ms
Interessant empfinde ich, daß ein Spiegel unter dem Strich erkennbar schlechtere Werte liefern kann, als die Single-disk – ausgenommen beim seq-output rewrite und seq-input-block.
Ansonsten ist der Vergleich zwischen alter RAID1 und neuer ganz passabel – man sieht deutlich schlechtere Werte in der alten RAID1-config:
seq. output Block 10MB/s zu 78MB/s,
rewrite 8k3 zu 46m,
seq Input Block 2.7g zu 229m??? ein schlechterer Wert dafür mit wesentlich weniger Last
random seeks
und allgemein weniger CPU-Last… und vor allem sieht man wesentlich geringere Latenzen -> hat sich also meiner Meinung nach gelohnt, also wird irgendwann später das Raid5 auch umgestellt!
Raid5 mit 4x Seagate IronWolf 6TB
Leider hatte ich auch bei der initialen Erstellung meines raidz1 Volumes (Raid5) aus 4x 6TB Festplatten (Seagate Ironwolf 5400rpm, ST6000VN001) nicht GPT zur Partitionierung verwendet, sondern die raw-devices direkt mit zpool angesprochen. Jetzt habe ich die Umstellung vorgenommen und vorher wie nachher bonnie++ Messungen vorgenommen (zpool in allen Fällen mit gleichen Daten gefüllt zu etwa 80%):
Signifikanteste Verbesserungen mit korrektem Blockalignment sieht man beim sequential Output: 244 zu 311MB/s, beim rewrite von 116 zu 169MB/s, beim sequential Input Block von 296 zu 502MB/s – interessanterweise hierbei überall mit mehr CPU-Last zu vorher (meine Theorie: Daten kommen logisch sauberer im alignment auf die Platte und somit sind schneller die Parity-Berechnungen erforderlich).
Random seeks haben sich verbessert von ~138/sec zu ~173/sec.
Weitere Verbesserungen zu sehen beim sequential create die Latenz hat sich von ~12,800µs auf ~1450µs verbessert und beim Random Create von 178ms zu ~1500µs.
Das sind so die signifikantesten Verbesserungen des RAID5 Stapels, welche sich beim benchmarking zeigen. Ich unterstelle, daß ich in der Praxis bestimmt nicht soviel merken werde. Mit der Umstellung ist aber ein mögliches Bottleneck beseitigt.
Die Werte mit ZIL als Verbesserung erachte ich als vernachlässigbar, in Relation zu der damit einhergehenden Gefahr eines Total-filesystem-Verlustes mit dem Hops-gehen eines ZILs. Dafür macht man kein RAID5, um Datenverlusten vorzubeugen. Also wird beim nächsten Umbau der Systemplatte der ZIL verschwinden.