bonnie++ performance Disk IO-Werte unter FreeBSD mit zfs

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

bonnie benchmark Samsung SSD 950Pro
Die 950PRO dient auch als cache und ZILs für einen Raid1 und einen Raid5-zpool

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

SanDisk Extreme Pro 1TB mit cache für zRaid unter FreeBSD 13.R

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%):

Benchmarking mit sector63 Fehler, mit cache, mit ZIL
Benchmarking raidz1 ohne cache ohne ZIL
Benchmarking raidz1 mit cache ohne ZIL
Benchmarking raidz1 mit cache mit ZIL

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.