zpool et performances 1

zpool et performances

Récemment, Erik ABLESON de la société ARUMTEC attirait mon attention sur l’impact que le choix de la bonne structure de pool ZFS pouvait avoir sur les performances d’une baie basée sur ZFS de Solaris.

Pour appuyer son propos, il me citait l’article “WHEN TO (AND NOT TO) USE RAID-Z”. Selon cet article, les performances a attendre se résument de la façon suivante (où n est le nombre de disques et 100% la mesure pour 1 seul disque):

TailleVitesse
Simple100%100%
Stripen*100%n*100%
Mirrorn/2*100%n*100%
Raid-Z(n-1)*100%n*100%

Pour rappel:

  • simple = 1 disque
  • Stripe = les données sont réparties sur n disques, sans redondance (c.a.d. à peu près l’équivalent d’un RAID0)
  • Mirror = les disques sont groupés par paire; le contenu de chaque paire de disques est identique (c.a.d. à peu près l’équivalent d’un RAID1)
  • Raid-Z = les données sont réparties sur n-1 disques; un disque est réservé pour les informations de récupération en cas de défaillance d’un disque dans le Raid-Z (c.a.d. à peu près l’équivalent d’un RAID1). Il est à noté de ZFS propose plusieurs niveaux de redondance –  Raid-Z, Raid-Z2, Raid-Z3 – autorisant respectivement la perte d’un, deux ou trois disques par RAID.

J’ai voulu monté un benchmark pour mesurer ces affirmations mais il est très difficile d’obtenir des mesures aussi claires.

J’ai pris un Dell PowerEdge 300 équipé de 4Go de RAM et 4 disques SATA de 1 To. L’OS installé était un NexentaStor 3.0.3.  J’y ai exécuté un script créant successivement 7 structures de zpool:

  • 1 disque,
  • Stripe sur 4 disques,
  • Miroir de 4 disques,
  • Stripe sur 2 miroirs de chacun 2 disques,
  • raid-Z sur 4 disques,
  • raid-Z2 sur 4 disques,
  • raid-Z3 sur 4 disques.

Sur chacun de ces zpools, j’ai utilisé l’outil iozone et mesuré les performances “random read”, “random write” sur un fichier de 8G. Le script utilisé est listé ci-dessous:

[shell]echo “==== one disk ===”
zpool destroy data
zpool create data c0d1
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64 -f /data/test/testf

echo “==== Stripe===”
zpool destroy data
zpool create data c0d1 c1d0 c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64 -f /data/test/testf

echo “==== mirror ===”
zpool destroy data
zpool create data mirror c0d1 c1d0 c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== raidz ===”
zpool destroy data
zpool create data raidz c0d1 c1d0 c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== raidz2 ===”
zpool destroy data
zpool create data raidz2 c0d1 c1d0 c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== raidz3 ===”
zpool destroy data
zpool create data raidz3 c0d1 c1d0 c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== 2x mirror  – compress=off – dedup=off ===”
zpool destroy data
zpool create data mirror c0d1 c1d0 mirror c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64  -f /data/test/testf[/shell]

Les performances que j’ai pu relevé ainsi sont beaucoup moins tranchées que dans l’article cité plus haut:

Random ReadRandom Write
Simple100%100%
Stripe108%107%
Mirror101%81%
2x Mirror104%97%
Raid-Z78%75%
Raid-Z290%83%
Raid-Z393%70%

Pour finir ces tests, j’ai appliqué les options de compression et de déduplication au zpool 2x Mirror avant de relancer le même test. Le script est listé ci-dessous:

[shell]echo “==== 2x mirror  – compress=off – dedup=off ===”
zpool destroy data
zpool create data mirror c0d1 c1d0 mirror c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== 2x mirror – compress=on – dedup=off ===”
zpool destroy data
zpool create data mirror c0d1 c1d0 mirror c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
zfs set compress=on data/test
zfs set dedup=off data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== 2x mirror – compress=off – dedup=on ===”
zpool destroy data
zpool create data mirror c0d1 c1d0 mirror c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
zfs set compress=off data/test
zfs set dedup=on data/test
iozone -a -s 8g -r 64  -f /data/test/testf

echo “==== 2x mirror – compress=on – dedup=on ===”
zpool destroy data
zpool create data mirror c0d1 c1d0 mirror c1d1 c2t4d0
zpool status data
zfs create -o primarycache=none -o secondarycache=none data/test
zfs set compress=on data/test
zfs set dedup=on data/test
iozone -a -s 8g -r 64  -f /data/test/testf[/shell]

Les performances que j’ai pu relevé montre que ces options augmentent grandement les performances I/O; vraisemblablement, parce qu’elles réduisent les écritures/lectures sur les disques physiques:

Random ReadRandom Write
Simple100%100%
2xmirror-compress=off-dedup=off104%97%
2xmirror-compress=on-dedup=off272%198%
2xmirror-compress=off-dedup=on354%232%
2xmirror-compress=on-dedup=on709%579%

En conclusion, les performances que j’ai pu relevé ainsi sont beaucoup moins tranchées que  les performances théoriques annoncées. Cela prouve combien la difficulté de mettre en oeuvre une mesure de performances “réaliste”. Probablement, iometer générait une charge O/I importante mais pas suffisamment orientée “multithread”.

En tout cas, je peux affirmer qu’après l’audit de Arumtec et la reconfiguration des zpools, les performances de la baie étaient grandement améliorées.

A propos Olivier Olejniczak

Cofondateur de SynerGeek.fr. Passionné d'informatique, je m'intéresse plus particulièrement aux technologies de virtualisation et de stockage. J'apprécie la liberté et la quasi-absence de frontières à mon imagination qu'offre l'OpenSource et Linux. Professionnellement, je travaille exclusivement avec les outils Microsoft. Les pieds bien sur terre et ancrés dans le quotidien de l'entreprise, j'aime faire partager mes découvertes et contribuer à un meilleur usage des technologies. Vous aussi, rejoignez-nous sur Synergeek et partagez votre expérience!

Je vous propose également...

PowerShell : Programmation MultiTâches 2

PowerShell : Programmation MultiTâches

Il peut être intéressant, afin d’optimiser le temps de traitement de tâches n’ayant pas un …

[Projet] Stockage embarqué avec ZFSguru 3

[Projet] Stockage embarqué avec ZFSguru

On continue les recherches sur la meilleure solution de stockage embarquée, dont un des objectifs est de se créer son NAS perso. Etudions la solution ZFS guru, basée sur FreeBSD et administrable par une interface Web