Zo, deze post na verder onderzoek maar even helemaal opnieuw begonnen. Was een beetje lang en onoverzichtelijk geworden.
1 SLOG en sync vs async
Voor zover ik begrijp is het ZIL een transactielog net zoals bij een database om bij reboot/crash uitstaande transacties alsnog in de database te verwerken.
- Een async write zal in het RAM geheugen komen en ZFS geeft meteen terug dat de transactie is verwerkt. Op basis van tijd of hoeveelheid data zal de transactiegroep naar de database druppelen. De async writes gaan dus nooit door ZIL.

- Een sync write gaat naar RAM en de ZIL, ZFS kan nu veilig bevestigen dat de transactie veilig is want hij zit in ZIL dus ook bij reboot/crash gaat hij de database in. De client moet langer op bevestiging wachten omdat de data ook daadwerkelijk eerst naar de ZIL (op disks) moet.

Omdat een ZIL nogal IO intensief is kun je een SLOG SSD toevoegen (in mirror) om je ZIL op te parkeren, de SSD heeft veel meer IOPS en de ZIL zal dus een stuk sneller worden echter is de SLOG
geen generieke write cache zoals ik het begrijp. In priciepe gaat de data altijd van de transactiegroep in RAM naar de disks, nooit van SLOG naar disk. De ZIL wordt nooit gelezen behalve als het systeem crashed en transactie moeten worden terug gerold.
Mijn conclusie is dan ook dan een ZVOL met sync=disabled heeft geen baat bij een SLOG. Elke write zal async zijn en nooit op de SLOG terecht komen. Anders dat een kleine hoeveelheid load van wat transactie administratie zal de de performance van een pool met SLOG niet beter zijn dan een pool zonder SLOG maar met sync=disabled.
- Als ik dus nu een ZVOL heb met sync=disabled gaat het toevoegen van een SLOG mijn performance niet significant verbeteren?
- Als ik een grote pool heb die gemount is en bestanden bevat maar ik maak ook een ZVOL in die pool en ik zet sync=disabled op alleen het ZVOL, niet op de hele pool. Loop ik dan het risico dat de hele pool stuk gaat bij een crash of alleen kan op corruptie in het ZVOL waar sync writes uit staan? In dat geval gewoon even een VM opnieuw bouwen.
2 IOPS en VDEVs
Ik was in de veronderstelling dat het aantal devices in een pool/VDEV bepaalt de throughput in MB/s. Hoe meer disks hoe meer throughput. Echter is het aantal IOPS gelimiteerd aan een enkele disk.
Voorbeeld:
RAIDZ2 Pool van 6 disks == IOPS van 1 disk
RAIDZ Pool van 3 VDEVs van 3 disks elk in RAIDZ == IOPS van 3 disks
MIRROR Pool van 2 VDEVs van 2 disks elk in MIRROR == IOPS van 2 disks
Mijn eigen benchmarks zeggen dat mijn 6 disk RAIDZ2 array veel meer IOPS aan kan dan mijn MIRROR van 2 VDEVs van 2 disks in MIRROR. Dit staat haaks op bovenstaande theorie.
Doet ZFS toch stiekem slimme dingen om de IOPS op te krikken of kloppen mijn benchmarks niet?
Hier mijn bevindingen:
2x 2TB WDC_WD20EFRX in een mirror:
code:
1
2
| read : io=3071.7MB, bw=11149KB/s, iops=2787 , runt=282127msec
write: io=1024.4MB, bw=3717.1KB/s, iops=929 , runt=282127msec |
4x (oude bagger) 500GB ST3500841AS in een pool zonder redundancy, dus stripe over 4 disks:
code:
1
2
| read : io=3071.7MB, bw=23351KB/s, iops=5837 , runt=134701msec
write: io=1024.4MB, bw=7786.2KB/s, iops=1946 , runt=134701msec |
6x 3TB WDC_WD30EZRX in een RAIDZ2:
code:
1
2
| read : io=3071.7MB, bw=215733KB/s, iops=53933 , runt= 14580msec
write: io=1024.4MB, bw=71942KB/s, iops=17985 , runt= 14580msec |
Wat mij dus opvalt is dat een RAIDZ2 met 6 schijven
veel meer IOPS heeft dan een MIRROR van 2 schijven. Ook nog eens WD Red vs WD Green. Ik zou verwachten dat het aantal IOPS op de MIRROR en de RAIDZ2 pool ongeveer gelijk zouden moeten zijn, zelfs in een licht voordeel naar de MIRROR omdat die REDs zijn ipv GREENs in het RAIDZ2 array.
Kortom, is bovenstaande claim mbt de IOPS nog wel geldig of doe ik gewoon iets verkeerd? (Heul goed mogelijk hoor)
3 SSDs en TRIM
Schijnbaar doet ZFS (nog) geen TRIM. Stel dat ik een pool maak van SSDs dedicated voor VM's zal dat natuurlijk ZOGMWTFBBQ* snel zijn (*technische term). Echter vraag ik me af of dit van lange duur is zonder TRIM. Iemand zal een TRIM command moeten geven om te zorgen dat de boel niet traag wordt op den duur. Wie zou dat moeten doen?
- VM naar het ZVOL? Kan me voorstellen dat als je hem zou kunnen markeren als 'non-rotational' dat een Windows client zal gaan TRIMmen.
- ZFS zelf (in toekomstige builds)
- Een cron scriptje.
4 Mijn huidige opties:
Een SLOG en L2ARC aan mijn trage mirror.
Gezien het feit dat de performance met sync=disabled nog steeds niet best is als er 8 VMs tegelijk op draaien verwacht ik geen wonderen van SLOG, voor zover het al wat zou doen. L2ARC heb ik wel eens gebruikt dus dat zal wel wat toevoegen maar niet als die machines staan te updaten en veel random bestandjes schrijven
kosten: 2 SSDs
winst: weinig
overig: -
Een MIRROR of RAIDZ van SSDs
Dit zal wel werken ja. Vraag is voor hoe lang zonder TRIM?
kosten: 2 of 3 SSDs
winst: veel
overig: TRIM? Lange termijn?
4x 500GB in een striped mirror
4 disks van een klein formaat, bijvoorbeeld 4x 500GB of 1TB verdelen in 2 mirrored VDEVs en die stripen in een pool.
kosten: 4 (goedkope) disks
winst: Dubbele throughput en IOPS van mijn huidige mirror.
overig: -
Zoals je ziet heb ik me zo goed mogelijk proberen in te lezen, ik heb geen onmogelijke verwachtingen van ZFS zoals "
Gooi er een SSD in en alles wordt automagisch snel". Gek genoeg wordt dit vaak wel aangeraden terwijl ik het idee heb dat de meeste 'thuis-gebruikers' en zelfs tweakers geen baat gaan hebben bij een SLOG omdat dat niet de limiterende factor is en ook niet bij een L2ARC omdat de systemen sowiezo niet genoeg RAM hebben.
Ik wil een plekje voor mijn VM's met zo veel mogelijk IOPS voor het liefst zo min mogelijk geld (wie niet). Echter heb ik het gevoel dat alle opties niet bepaald ideaal zijn en er overal nadelen aan kleven. De meeste VMz zijn niet mission critical en mogen van mij sync=disabled. Degene die wel belangrijk zijn zet ik wel handmatig sync=enabled.
Oke mislukt, nog steeds een lange post maar nu in ieder geval wat structuur aangebracht..
[
Voor 109% gewijzigd door
Pakjebakmeel op 28-03-2015 10:23
]