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.8xlarge
instance 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 fio
test 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 raidz1
vdev 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 mirror
vdev, 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 zfs
paquet.
MISE À JOUR : Selon la suggestion de @ ewwhite, j'ai essayé ashift=12
et 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 top
et il montre la plupart du temps du noyau passé dans _raw_spin_unlock_irqrestore
en z_wr_int_4
et osq_lock
en 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é fio
pour 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.