Ich bin völlig neu in ZFS, also dachte ich zuerst, ich würde ein paar einfache Benchmarks machen, um ein Gefühl dafür zu bekommen, wie es sich verhält. Ich wollte die Grenzen seiner Leistung erweitern, also habe ich eine Amazon EC2- i2.8xlarge
Instanz bereitgestellt (fast 7 US-Dollar pro Stunde, Zeit ist wirklich Geld!). Diese Instanz verfügt über 8 SSDs mit 800 GB.
Ich habe fio
die SSDs selbst getestet und die folgende Ausgabe erhalten (abgeschnitten):
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --direct=1 --filename=/dev/xvdb
[trimmed]
write: io=67178MB, bw=229299KB/s, iops=57324, runt=300004msec
[trimmed]
57K IOPS für zufällige 4K-Schreibvorgänge. Seriös.
Ich habe dann ein ZFS-Volume erstellt, das sich über alle 8 erstreckt. Zuerst hatte ich einen raidz1
vdev mit allen 8 SSDs, aber ich habe gelesen, warum dies für die Leistung schlecht ist . Am Ende hatte ich also vier mirror
vdevs, wie folgt:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi
$ sudo zpool list -v
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
testpool 2.91T 284K 2.91T - 0% 0% 1.00x ONLINE -
mirror 744G 112K 744G - 0% 0%
xvdb - - - - - -
xvdc - - - - - -
mirror 744G 60K 744G - 0% 0%
xvdd - - - - - -
xvde - - - - - -
mirror 744G 0 744G - 0% 0%
xvdf - - - - - -
xvdg - - - - - -
mirror 744G 112K 744G - 0% 0%
xvdh - - - - - -
xvdi - - - - - -
Ich stellte die Aufzeichnungsgröße auf 4K ein und führte meinen Test durch:
$ sudo zfs set recordsize=4k testpool
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --filename=/testpool/testfile --fallocate=none
[trimmed]
write: io=61500MB, bw=209919KB/s, iops=52479, runt=300001msec
slat (usec): min=13, max=155081, avg=145.24, stdev=901.21
clat (usec): min=3, max=155089, avg=154.37, stdev=930.54
lat (usec): min=35, max=155149, avg=300.91, stdev=1333.81
[trimmed]
Ich erhalte nur 52.000 IOPS für diesen ZFS-Pool. Das ist eigentlich etwas schlimmer als eine SSD selbst.
Ich verstehe nicht, was ich hier falsch mache. Habe ich ZFS falsch konfiguriert oder ist dies ein schlechter Test für die ZFS-Leistung?
Hinweis Ich verwende das offizielle 64-Bit-CentOS 7 HVM-Image, obwohl ich auf den elrepo-Kernel 4.4.5 aktualisiert habe:
$ uname -a
Linux ip-172-31-43-196.ec2.internal 4.4.5-1.el7.elrepo.x86_64 #1 SMP Thu Mar 10 11:45:51 EST 2016 x86_64 x86_64 x86_64 GNU/Linux
Ich habe ZFS aus dem hier aufgelisteten ZFS-Repository installiert . Ich habe Version 0.6.5.5 des zfs
Pakets.
UPDATE : Per @ ewwhite's Vorschlag habe ich versucht ashift=12
und ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
und
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Beides machte keinen Unterschied. Soweit ich weiß, sind die neuesten ZFS-Bits intelligent genug, um 4K-SSDs zu identifizieren und angemessene Standardeinstellungen zu verwenden.
Mir ist jedoch aufgefallen, dass die CPU-Auslastung stark ansteigt. @Tim schlug dies vor, aber ich lehnte es ab, aber ich glaube, ich habe die CPU nicht lange genug beobachtet, um es zu bemerken. In dieser Instanz befinden sich etwa 30 CPU-Kerne, und die CPU-Auslastung steigt auf bis zu 80%. Der hungrige Prozess? z_wr_iss
viele Instanzen davon.
Ich habe bestätigt, dass die Komprimierung deaktiviert ist, es handelt sich also nicht um die Komprimierungsengine.
Ich verwende kein Raidz, daher sollte es nicht die Paritätsberechnung sein.
Ich habe eine gemacht perf top
und es zeigt den größten Teil der Kernel-Zeit, die _raw_spin_unlock_irqrestore
in z_wr_int_4
und osq_lock
in verbracht wurde z_wr_iss
.
Ich glaube jetzt, dass dieser Leistungsengpass eine CPU-Komponente hat, obwohl ich nicht näher dran bin, herauszufinden, was das sein könnte.
UPDATE 2 : Per @ewwhite und dem Vorschlag anderer, dass es die virtualisierte Natur dieser Umgebung ist, die zu Performance-Unsicherheiten führt, habe ich fio
zufällige 4K-Schreibvorgänge verglichen, die auf vier der SSDs in der Umgebung verteilt sind. Jede SSD für sich gibt ~ 55K IOPS, so dass ich ungefähr 240K IOs für vier von ihnen erwartet habe. Das ist mehr oder weniger was ich habe:
$ sudo fio --name randwrite --ioengine=libaio --iodepth=8 --rw=randwrite --bs=4k --size=398G --numjobs=8 --runtime=300 --group_reporting --filename=/dev/xvdb:/dev/xvdc:/dev/xvdd:/dev/xvde
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
...
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
fio-2.1.5
Starting 8 processes
[trimmed]
write: io=288550MB, bw=984860KB/s, iops=246215, runt=300017msec
slat (usec): min=1, max=24609, avg=30.27, stdev=566.55
clat (usec): min=3, max=2443.8K, avg=227.05, stdev=1834.40
lat (usec): min=27, max=2443.8K, avg=257.62, stdev=1917.54
[trimmed]
Dies zeigt deutlich, dass die Umgebung, auch wenn sie virtualisiert ist, die IOPS viel besser aushält als ich sie sehe. Etwas an der Art und Weise, wie ZFS implementiert wird, hindert es daran, die Höchstgeschwindigkeit zu erreichen. Ich kann einfach nicht herausfinden, was das ist.
quelle
Antworten:
Dieses Setup ist möglicherweise nicht gut abgestimmt. Bei Verwendung von SSDs sind Parameter sowohl für die Datei /etc/modprobe/zfs.conf als auch für den Wert ashift erforderlich
Versuchen Sie es mit ashift = 12 oder 13 und wiederholen Sie den Test.
Bearbeiten:
Dies ist immer noch eine virtualisierte Lösung, daher wissen wir nicht viel über die zugrunde liegende Hardware oder wie alles miteinander verbunden ist. Ich weiß nicht, dass Sie mit dieser Lösung eine bessere Leistung erzielen.
Bearbeiten:
Ich denke, ich sehe keinen Sinn darin, eine Cloud-Instanz auf diese Weise zu optimieren. Denn wenn Top-Performance das Ziel wäre, würden Sie Hardware verwenden, oder?
Denken Sie jedoch daran, dass ZFS viele anpassbare Einstellungen hat und das, was Sie standardmäßig erhalten, nicht in der Nähe Ihres Anwendungsfalls liegt.
Versuchen Sie Folgendes in Ihrem
/etc/modprobe.d/zfs.conf
und starten Sie neu. Dies verwende ich in meinen All-SSD-Datenpools für Anwendungsserver. Ihre Schicht sollte 12 oder 13 sein. Benchmark mit Komprimierung = aus, aber verwenden Sie Komprimierung = lz4 in der Produktion. Setze atime = off. Ich würde Recordsize als Standard (128K) belassen.quelle
zfs get compression
. Deduplizierung ist ebenfalls ausgeschaltet.Es ist wahrscheinlich, dass Sie auf ein Linux-Kernel-Mutex-Schloss warten, das wiederum auf einen Xen-Ringpuffer wartet. Ohne Zugang zu einem ähnlichen Computer kann ich mir das nicht sicher sein, aber ich bin nicht daran interessiert, Amazon 7 USD / Stunde für dieses Privileg zu bezahlen.
Weitere Informationen finden Sie hier: https://www.reddit.com/r/zfs/comments/4b4r1y/why_is_zfs_on_linux_unable_to_fully_utilize_8x/d1e91wo ; Ich möchte lieber an einem Ort als an zwei.
quelle
Ich habe anständig viel Zeit damit verbracht, dies aufzuspüren. Meine besondere Herausforderung: Ein Postgres-Server und ich möchten ZFS für sein Datenvolumen verwenden. Die Basis ist XFS.
In erster Linie sagen mir meine Versuche, dass
ashift=12
das falsch ist. Wenn es eine magischeashift
Zahl gibt, ist sie nicht 12. Ich benutze sie0
und erhalte sehr gute Ergebnisse.Ich habe auch mit einer Reihe von ZFS-Optionen experimentiert. Die Optionen, die mir die folgenden Ergebnisse liefern, sind:
atime=off
- Ich brauche keine Zugriffszeitenchecksum=off
- Ich streife und spiegele nichtcompression=lz4
- Leistung ist mit Komprimierung besser (CPU-Kompromiss?)exec=off
- Dies ist für Daten gedacht, nicht für ausführbare Dateienlogbias=throughput
- Lesen Sie in den Zwischenwebs nach, dass dies für Postgres besser istrecordsize=8k
- PG-spezifische 8k-Blockgrößesync=standard
- hat versucht, die Synchronisierung auszuschalten; sah nicht viel NutzenMeine Tests unten zeigen eine bessere Leistung als XFS (bitte kommentieren Sie, wenn Sie Fehler in meinen Tests sehen!).
Als nächstes versuche ich, Postgres auf einem 2 x EBS ZFS-Dateisystem auszuführen.
Mein spezielles Setup:
EC2:
m4.xlarge
InstanzEBS: 250 GB
gp2
VolumesKernel: Linux 3.13.0-105-generic # 152-Ubuntu SMP [...] x86_64 x86_64 x86_64 GNU / Linux *
Zuerst wollte ich die EBS-Leistung testen. Unter Verwendung einer Variation des
fio
obigen Befehls kam ich auf die Beschwörung unten. Hinweis: Ich verwende 8k-Blöcke, da ich gelesen habe, dass PostgreSQL-Schreibvorgänge wie folgt lauten:Die Rohleistung für das EBS-Volume beträgt
WRITE: io=3192.2MB
.Testen Sie nun XFS mit demselben
fio
Befehl:Unsere Grundlinie ist
WRITE: io=3181.9MB
; sehr nahe an der Geschwindigkeit der Rohplatte.Nun auf ZFS mit
WRITE: io=3181.9MB
als Referenz:Beachten Sie, dass dies besser funktioniert als XFS
WRITE: io=4191.7MB
. Ich bin mir ziemlich sicher, dass dies auf die Komprimierung zurückzuführen ist.Für Kicks werde ich einen zweiten Band hinzufügen:
Mit einem zweiten Band,
WRITE: io=5975.9MB
also ~ 1,8X, schreibt das.Ein dritter Band gibt uns
WRITE: io=6667.5MB
also ~ das 2,1-fache des Schreibens.Und ein vierter Band gibt uns
WRITE: io=6552.9MB
. Für diesen Instanztyp sehe ich so aus, als würde ich das EBS-Netzwerk fast mit zwei Volumes begrenzen, definitiv mit drei und es ist nicht besser mit 4 (750 * 3 = 2250 IOPS).* In diesem Video stellen Sie sicher, dass Sie einen Linux-Kernel mit 3.8+ verwenden, um alle Vorteile von EBS zu nutzen.
quelle
WRITE: io=
. Das ist nicht die Geschwindigkeit, sondern die Datenmenge, die in dieser Zeit geschrieben wurde. Bezogen auf die Geschwindigkeit nur für Tests mit fester Laufzeit, aber aus Gründen der Konsistenz mit anderen Benchmarks ist es besser, sich auf IOPS zu konzentriereniops=
. In Ihrem Fall sind die Ergebnisse ähnlich. Sie könnten wahrscheinlich viel besser werden, wenn Sie bereitgestellte IOPS-EBS-Volumes und eine größere Instanz verwenden. Auf dieser Seite finden Sie die erwarteten EBS-Caps nach Instanzgröße. Achtung, EBS-Gebühren summieren sich schnell, wenn Sie nicht aufpassen!/etc/modules.d/zfs.conf
. Die nächste Frage wäre, wie viele iops für eine give ec2-Instanz angemessen sind. Das Betrachten der Seite, auf die Sie verweisen, ist immer noch schwierig, und ich sehe keine so gute Leistung wie in den Dokumenten.