ZFS tuning, FreeBSD 8.2-RELEASE

Posted by Maciej Suszko on April 12, 2011
FreeBSD

Czym jest ZFS pisać chyba nie trzeba, jeżeli jednak tak jest, to z chęcią odsyłam do anglojęzycznej wersji wpisu w Wikipedii.

Generalnie, preferowaną architekturą do używania tego systemu plików jest architektura 64-bitowa, z racji choćby większej przestrzeni adresowej, ale i w środowisku 32-bitowym ZFS-a używać się da. Wymaga to jednak większej uwagi w przypadku tuningu, który dla tej architektury, jest moim zdaniem obowiązkowy.

W przypadku amd64, teoretycznie już od wersji 7.2-RELEASE, tunning ZFS nie jest wymagany, ale jak pokazują liczne maile na listach dyskusyjnych, w szczególnych przypadkach, niestety nie można go pominąć. Osobiście uważam, że o i386 należy powoli zapominać, dlatego poniższy wpis dotyczy tylko architektury amd64.

Poniżej zebrałem kilka porad, do których sam się stosuję i które, w moim przypadku, dają pozytywne rezultaty.

 

vm.kmem_size i vfs.zfs.arc_max

Te dwie zmienne są najważniejsze w całym procesie tuningu.

tlhscd@arsenic:~ $ sysctl -d vm.kmem_size vfs.zfs.arc_max
vm.kmem_size: Size of kernel memory
vfs.zfs.arc_max: Maximum ARC size

Domyślny rozmiar pamięci dostępnej dla kernela jest zdecydowanie za mały – trochę ponad 300MB. Ustawmy zmienną na 100% dostępnej pamięci, której wielkość sprawdzić można w pliku /var/run/dmesg.boot. W moim przypadku:

tlhscd@arsenic:~ $ grep 'avail memory' /var/run/dmesg.boot
avail memory = 3082637312 (2939 MB)

Maksymalny rozmiar ZFS Adaptive Replacement Cache (ARC) też niech będzie zdecydowanie większy – 75% dostępnej pamięci. ZFS bardzo lubi pamięć i na pewno się z tego powodu ucieszy.

Obie zmienne są ustawiane przy starcie systemu, więc należy je zdefiniować w /boot/loader.conf:

vm.kmem_size="2939M"
vfs.zfs.arc_max="2204M"

 

vfs.zfs.prefetch_disable

Obserwując statystyki kstat.zfs.misc.arcstats.prefetch* (via sysctl) można podjąć decyzję, czy algorytm prefetch włączyć, czy wyłączyć. W większości przypadków prefetch pozostawia się wyłączony, co ogólnie przyspiesza ZFS. Wadą takiego rozwiązania jest mniejsza responsywność systemu podczas zapisów.
Jeżeli system posiada mniej niż 4GB pamięci, prefetch wyłączony jest domyślnie. Ja wpis w /boot/loader.conf mam i tak, choćby po to, żeby w przyszłości (kiedy przybędzie pamięci), nie musieć o tym pamiętać.

Mechanizmem tym można sterować z użyciem sysctl, więc wystarczy wpis w /etc/sysctl.conf:

vfs.zfs.prefetch_disable="1"

 

vfs.zfs.txg.timeout

Podczas dużej ilości operacji I/O system sprawia wrażenie ,,przytykającego’‘ się – najłatwiej zaobserwować to w połączeniu z transmisją po sieci, kiedy w regularnych odstępach czasu, transfer znacząco spada albo wręcz zatrzymuje się. Zmniejszamy wartość domyślną z 30 sekund do 5:

Zmienna ustawiana podczas uruchamiania systemu, więc kolejny wpis w /boot/loader.conf:

vfs.zfs.txg.timeout="5"

 

vfs.zfs.zil_disable

ZFS Intenet Log jest używany podczas operacji zapisu i jego wyłączania raczej nikt nie poleca tam, gdzie wymagana jest spójność danych. Jeżeli możemy sobie na to pozwolić i chcemy trochę zyskać na szybkości, to możemy zil wyłączyć… W razie awarii systemu, system plików nie powinien na tym ucierpieć.

Podobnie jak mechanizm prefetch – możemy nim sterować w działającym systemie, więc dopisujemy kolejną linię do /etc/sysctl.conf:

vfs.zfs.zil_disable="1"

 

Większość z tych informacji można znaleźć na stronie ZFSTuningGuide. Tym, którzy są bardziej zainteresowani tematem polecam listę mailingową freebsd-fs oraz dokumentację ZFS Best Practices Guide – tu zawarte informacje tyczą się jednak oryginalnej wersji ZFS, więc mogą się znacząco różnić od wersji przeportowanej do FreeBSD.

Tags: ,

Comments are closed.