Eine Reihe von Anpassungen können vorgenommen werden, um ZFS unter verschiedenen Belastungen während des Betriebs bestmöglich einzustellen.
vfs.zfs.arc_max
- Maximale Größe des ARC.
Die Voreinstellung ist der gesamte RAM
weniger 1 GB oder die Hälfte vom
RAM, je nachdem, was mehr ist.
Allerdings sollte ein niedriger Wert verwendet werden,
wenn das System weitere Dienste oder Prozesse laufen
lässt, welche Hauptspeicher benötigen. Dieser Wert kann
zur Laufzeit mit sysctl(8) eingestellt und in
/boot/loader.conf
permanent
gespeichert werden.
vfs.zfs.arc_meta_limit
- Schränkt die Menge des ARC
ein, welche für die Speicherung von Metadaten verwendet
wird. Die Voreinstellung ist ein Viertel von
vfs.zfs.arc_max
. Diesen Wert zu
erhöhen steigert die Geschwindigkeit, wenn die Arbeitslast
Operationen auf einer großen Menge an Dateien und
Verzeichnissen oder häufigen Metadatenoperationen
beinhaltet. Jedoch bedeutet dies auch weniger Dateidaten,
die in den ARC
passen. Dieser Wert kann zur Laufzeit mit
sysctl(8) eingestellt und in
/boot/loader.conf
oder
/etc/sysctl.conf
dauerhaft
gespeichert werden.
vfs.zfs.arc_min
- Minimale Größe des ARC.
Der Standard beträgt die Hälfte von
vfs.zfs.arc_meta_limit
. Passen Sie
diesen Wert an, um zu verhindern, dass andere Anwendungen
den gesamten ARC
verdrängen. Dieser Wert kann zur Laufzeit mit
sysctl(8) geändert und in
/boot/loader.conf
oder
/etc/sysctl.conf
dauerhaft
gespeichert werden.
vfs.zfs.vdev.cache.size
- Eine vorallokierte Menge von Speicher, die als Cache für
jedes Gerät im Pool reserviert wird. Die Gesamtgröße von
verwendetem Speicher ist dieser Wert multipliziert mit der
Anzahl an Geräten. Nur zur Bootzeit kann dieser Wert
angepasst werden und wird in
/boot/loader.conf
eingestellt.
vfs.zfs.min_auto_ashift
- Minimaler ashift
-Wert (Sektorgröße),
welche zur Erstellungszeit des Pools automatisch verwendet
wird. Der Wert ist ein Vielfaches zur Basis Zwei. Der
Standardwert von 9
repräsentiert
2^9 = 512
, eine Sektorgröße von 512
Bytes. Um write amplification zu
vermeiden und die bestmögliche Geschwindigkeit zu
erhalten, setzen Sie diesen Wert auf die größte
Sektorgröße, die bei einem Gerät im Pool vorhanden
ist.
Viele Geräte besitzen 4 KB große Sektoren. Die
Verwendung der Voreinstellung 9
bei
ashift
mit diesen Geräten resultiert in
einer write amplification auf diesen Geräten. Daten,
welche in einem einzelnen 4 KB Schreibvorgang Platz
finden würden, müssen stattdessen in acht 512-byte
Schreibvorgänge aufgeteilt werden. ZFS
versucht, die allen Geräten zugrundeliegende Sektorgröße
während der Poolerstellung zu lesen, jedoch melden viele
Geräte mit 4 KB Sektoren, dass ihre Sektoren aus
Kompatibilitätsgründen 512 Bytes betragen. Durch das
Setzen von vfs.zfs.min_auto_ashift
auf
12
(2^12 = 4096
)
bevor der Pool erstellt wird, zwingt
ZFS dazu, für diese Geräte 4 KB
Blöcke für bessere Geschwindigkeit zu nutzen.
Erzwingen von 4 KB Blöcken ist ebenfalls
hilfreich auf Pools bei denen Plattenaufrüstungen geplant
sind. Zukünftige Platten werden wahrscheinlich
4 KB große Sektoren und der Wert von
ashift
lässt sich nach dem Erstellen
des Pools nicht mehr ändern.
In besonderen Fällen ist die kleinere Blockgröße von 512-Byte vorzuziehen. Weniger Daten werden bei kleinen, zufälligen Leseoperationen übertragen, was besonders bei 512-Byte großen Platten für Datenbanken oder Plattenplatz für virtuelle Maschinen der Fall ist. Dies kann bessere Geschwindigkeit bringen, ganz besonders wenn eine kleinere ZFS record size verwendet wird.
vfs.zfs.prefetch_disable
- Prefetch deaktivieren. Ein Wert von 0
bedeutet aktiviert und 1
heißt
deaktiviert. Die Voreinstellung ist 0
,
außer, das System besitzt weniger als
4 GB RAM. Prefetch funktioniert
durch das Lesen von grösseren Blöcken in den ARC als
angefordert wurden, in der Hoffnung, dass diese Daten
ebenfalls bald benötigt werden. Wenn die I/O-Last viele
große Mengen von zufälligen Leseoperationen beinhaltet,
ist das Deaktivieren von prefetch eine
Geschwindigkeitssteigerung durch die Reduzierung von
unnötigen Leseoperationen. Dieser Wert kann zu jeder Zeit
über sysctl(8) angepasst werden.
vfs.zfs.vdev.trim_on_init
- Steuert, ob neue Geräte, die dem Pool hinzugefügt
werden, das TRIM
-Kommando ausführen
sollen. Das beinhaltet die beste Geschwindigkeit und
Langlebigkeit für SSDs, benötigt jedoch
zusätzliche Zeit. Wenn das Gerät bereits sicher gelöscht
wurde, kann durch deaktivieren dieser Option das
Hinzufügen neuer Geräte schneller geschehen. Über
sysctl(8) lässt sich dieser Wert jederzeit
einstellen.
vfs.zfs.vdev.max_pending
- Begrenzt die Menge von ausstehenden I/O-Anfragen pro
Gerät. Ein größerer Wert wird die Gerätewarteschlange
für Befehle gefüllt lassen und möglicherweise besseren
Durchsatz erzeugen. Ein niedrigerer Wert reduziert die
Latenz. Jederzeit kann dieser Wert über sysctl(8)
angepasst werden.
vfs.zfs.top_maxinflight
- Maximale Anzahl von ausstehenden I/Os pro
darüberliegendem vdev. Begrenzt die Tiefe
Kommandowarteschlange, um hohe Latenzen zu vermeiden. Das
Limit ist pro darüberliegendem vdev, was bedeutet, dass
das Limit für jeden mirror, RAID-Z, oder anderes
vdev unabhängig gilt. Mit sysctl(8) kann dieser Wert
jederzeit angepasst werden.
vfs.zfs.l2arc_write_max
- Begrenzt die Menge an Daten, die pro Sekunde in den L2ARC
geschrieben wird. Durch diese Einstellung lässt sich die
Lebensdauer von SSDs erhöhen, indem die
Menge an Daten beschränkt wird, die auf das Gerät
geschrieben wird. Dieser Wert ist über sysctl(8) zu
einem beliebigen Zeitpunkt änderbar.
vfs.zfs.l2arc_write_boost
- Der Wert dieser Einstellung wird zu vfs.zfs.l2arc_write_max
addiert und erhöht die Schreibgeschwindigkeit auf die
SSD bis der erste Block aus dem L2ARC
verdrängt wurde. Diese „Turbo Warmup Phase“
wurde entwickelt, um den Geschwindigkeitsverlust eines
leeren L2ARC
nach einem Neustart zu reduzieren. Jederzeit kann dieser
Wert mit sysctl(8) geändert werden.
vfs.zfs.scrub_delay
- Anzahl von Ticks an Verzögerung zwischen jedem I/O
während eines scrub
.
Um zu gewährleisten, dass ein scrub
nicht mit die normalen Vorgänge eines Pools
beeinträchtigt. Wenn währenddessen andere
I/Os durchgeführt werden, wird der
scrub
zwischen jedem Befehl verzögert.
Dieser Wert regelt die Gesamtmenge von
IOPS (I/Os Per Second), die von
scrub
generiert werden. Die
Granularität der Einstellung ist bestimmt durch den Wert
von kern.hz
, welcher standardmäßig auf
auf 1000 Ticks pro Sekunde eingestellt ist. Diese
Einstellung kann geändert werden, was in einer
unterschiedlich effektiven Limitierung der
IOPS resultiert. Der Standardwert ist
4
, was ein Limit von
1000 ticks/sec / 4 =
250 IOPS ergibt. Ein Wert von
20
würde ein Limit von
1000 ticks/sec / 20 =
50 IOPS ergeben. Die
scrub
-Geschwindigkeit ist nur begrenzt,
wenn es kürzlich Aktivität auf dem Pool gab, wie der Wert
von vfs.zfs.scan_idle
verrät. Zu einem beliebigen Zeitpunkt kann über
sysctl(8) eine Änderung an diesem Wert
erfolgen.
vfs.zfs.resilver_delay
- Anzahl an Millisekunden Verzögerung, die zwischen jedem
I/O während eines resilver eingefügt
wird. Um zu versichern, dass ein resilver nicht die
normalen Vorgänge auf dem Pool stört, wird dieser zwischen
jedem Kommando verzögert, wenn andere I/Os auf dem Pool
passieren. Dieser Wert steuert das Limit der
Gesamt-IOPS (I/Os Pro Sekunde), die vom
resilver erzeugt werden. Die Granularität der Einstellung
wird durch den Wert von kern.hz
bestimmt, welcher standardmäßig 1000 Ticks pro Sekunde
beträgt. Diese Einstellung lässt sich ändern, was in
einem unterschiedlich effizienten
IOPS-Limit resultiert. Die
Voreinstellung ist 2, was ein Limit von
1000 ticks/sec / 2 =
500 IOPS beträgt. Einen Pool
wieder in den Zustand Online zu versetzen ist
möglicherweise wichtiger wenn eine andere Platte den Pool
in den Fault-Zustand versetzt,
was Datenverlust zur Folge hat. Ein Wert von 0 wird der
resilver-Operation die gleiche Priorität wie anderen
Operationen geben, was den Heilungsprozess beschleunigt.
Die Geschwindigkeit des resilver wird nur begrenzt, wenn
es kürzlich andere Aktivitäten auf dem Pool gab, wie von
vfs.zfs.scan_idle
festgestellt wird. Dieser Wert kann zu jeder Zeit über.
sysctl(8) eingestellt werden.
vfs.zfs.scan_idle
- Anzahl an Millisekunden seit der letzten Operation bevor
der Pool als im Leerlauf befindlich deklariert wird. Wenn
sich der Pool im Leerlauf befindet, wird die Begrenzung
für scrub
und
resilver
deaktiviert. Dieser Wert kann mittels sysctl(8)
jederzeit angepasst werden.
vfs.zfs.txg.timeout
- Maximale Anzahl von Sekunden zwischen
Transaktionsgruppen
(transaction group). Die momentane Transaktionsgruppe
wird auf den Pool geschrieben und eine frische
Transaktionsgruppe begonnen, wenn diese Menge an Zeit seit
der vorherigen Transaktionsgruppe abgelaufen ist. Eine
Transaktionsgruppe kann verfrüht ausgelöst werden, wenn
genug Daten geschrieben werden. Der Standardwert beträgt
5 Sekunden. Ein größerer Wert kann die
Lesegeschwindigkeit durch verzögern von asynchronen
Schreibvorgängen verbessern, allerdings kann dies
ungleiche Geschwindigkeiten hervorrufen, wenn eine
Transaktionsgruppe geschrieben wird. Dieser Wert kann zu
einem beliebigen Zeitpunkt mit sysctl(8) geändert
werden.
Manche der Eigenschaften, die von ZFS bereitgestellt werden, sind speicherintensiv und benötigen Anpassungen für die maximale Effizienz auf Systemen mit begrenztem RAM.
Als absolutes Minimum sollte der gesamte verfügbare Hauptspeicher mindestens ein Gigabyte betragen. Die vorgeschlagene Menge an RAM ist bedingt durch die Poolgröße und welche Eigenschaften von ZFS verwendet werden. Eine Faustregel besagt, dass 1 GB RAM für jedes 1 TB Storage vorgesehen werden sollte. Wenn Deduplizierung zum Einsatz kommt, besagt die Regel, dass 5 GB RAM pro TB an Speicher, der dedupliziert werden soll, bereitgestellt sein muss. Obwohl manche Anwender ZFS mit weniger RAM einsetzen, stürzen Systeme häufiger wegen unzureichendem Hauptspeicher ab. Weitere Anpassungen sind unter Umständen nötig für Systeme mit weniger als die vorgeschlagene Menge an RAM.
Wegen des begrenzten Addressraumes der i386™-Plattform müssen ZFS-Anwendern auf der i386™-Architektur diese Option der Kernelkonfigurationsdatei hinzufügen, den Kernel erneut bauen und das System neu starten:
options KVA_PAGES=512
Dies erweitert den Addressraum des Kernels, was es
erlaubt, die Einstellung vm.kvm_size
hinter die momentan vorgegebene Grenze von 1 GB
oder das Limit von 2 GB für
PAE zu bringen. Um den passenden Wert
für diese Option zu finden, teilen Sie den gewünschten
Addressraum in Megabyte durch vier. In diesem Beispiel
beträgt sie 512
für 2 GB.
Der kmem
-Addressraum kann auf allen
FreeBSD-Architekturen erhöht werden. Auf einem Testsystem mit
1 GB physischen Speichers wurden mit diesen Optionen in
/boot/loader.conf
und einem
anschließenden Systemneustart Erfolge erzielt:
vm.kmem_size="330M" vm.kmem_size_max="330M" vfs.zfs.arc_max="40M" vfs.zfs.vdev.cache.size="5M"
Für eine detailliertere Liste an Empfehlungen für ZFS-bezogene Einstellungen, lesen Sie https://wiki.freebsd.org/ZFSTuningGuide.
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.