Je suis complètement nouveau sur ZFS, donc pour commencer, je pensais que je ferais quelques repères simples dessus pour avoir une idée de son comportement. Je voulais repousser les limites de ses performances alors j'ai provisionné une i2.8xlargeinstance Amazon EC2 (près de 7 $ / h, le temps c'est vraiment de l'argent!). Cette instance dispose de 8 SSD de 800 Go.
J'ai fait un fiotest sur les SSD eux-mêmes et j'ai obtenu la sortie suivante (découpée):
$ 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 pour les écritures aléatoires 4K. Respectable.
J'ai ensuite créé un volume ZFS couvrant tous les 8. Au début, j'avais un raidz1vdev avec tous les 8 SSD, mais j'ai lu les raisons pour lesquelles cela est mauvais pour les performances, donc je me suis retrouvé avec quatre mirrorvdev, comme ceci:
$ 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      -      -      -         -      -      -
J'ai réglé la taille d'enregistrement sur 4K et j'ai exécuté mon test:
$ 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]
Je reçois seulement 52K IOPS sur ce pool ZFS. C'est en fait légèrement pire qu'un SSD lui-même.
Je ne comprends pas ce que je fais mal ici. Ai-je mal configuré ZFS, ou s'agit-il d'un mauvais test des performances ZFS?
Remarque J'utilise l'image officielle HVM CentOS 7 64 bits, bien que j'ai mis à niveau vers le noyau elrepo 4.4.5:
$ 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
J'ai installé ZFS à partir du dépôt zfs répertorié ici . J'ai la version 0.6.5.5 du zfspaquet.
MISE À JOUR : Selon la suggestion de @ ewwhite, j'ai essayé ashift=12et ashift=13:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
et
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Aucun de ces éléments n'a fait de différence. D'après ce que je comprends, les derniers bits ZFS sont suffisamment intelligents pour identifier les SSD 4K et utiliser des valeurs par défaut raisonnables.
J'ai cependant remarqué que l'utilisation du processeur augmente. @Tim l'a suggéré mais je l'ai rejeté mais je pense que je n'ai pas regardé le CPU assez longtemps pour le remarquer. Il y a quelque chose comme 30 cœurs de processeur sur cette instance, et l'utilisation du processeur atteint 80%. Le processus de la faim?  z_wr_iss, beaucoup d'exemples.
J'ai confirmé que la compression était désactivée, ce n'est donc pas le moteur de compression.
Je n'utilise pas raidz, donc ce ne devrait pas être le calcul de parité.
Je l' ai fait une perf topet il montre la plupart du temps du noyau passé dans _raw_spin_unlock_irqrestoreen z_wr_int_4et osq_locken z_wr_iss.
Je crois maintenant qu'il y a un composant CPU dans ce goulot d'étranglement des performances, bien que je ne sois pas plus près de comprendre ce qu'il pourrait être.
MISE À JOUR 2 : Selon @ewwhite et d'autres suggérant que c'est la nature virtualisée de cet environnement qui crée une incertitude de performance, j'ai utilisé fiopour comparer les écritures 4K aléatoires réparties sur quatre des SSD de l'environnement. Chaque SSD à lui seul donne ~ 55K IOPS, donc je m'attendais à quelque 240K IO sur quatre d'entre eux. C'est plus ou moins ce que j'ai obtenu:
$ 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]
Cela montre clairement que l'environnement, aussi virtualisé soit-il, peut soutenir les IOPS beaucoup plus haut que ce que je vois. Quelque chose sur la façon dont ZFS est implémenté l'empêche d'atteindre la vitesse maximale. Je ne peux pas comprendre ce que c'est.