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.
la source
Réponses:
Cette configuration peut ne pas être bien réglée. Des paramètres sont nécessaires pour le fichier /etc/modprobe/zfs.conf et la valeur ashift lors de l'utilisation de disques SSD
Essayez ashift = 12 ou 13 et testez à nouveau.
Éditer:
Il s'agit toujours d'une solution virtualisée, nous ne savons donc pas grand-chose sur le matériel sous-jacent ou comment tout est interconnecté. Je ne sais pas que vous obtiendrez de meilleures performances de cette solution.
Éditer:
Je suppose que je ne vois pas l'intérêt d'essayer d'optimiser une instance de cloud de cette manière. Parce que si les meilleures performances étaient l'objectif, vous utiliseriez du matériel, non?
Mais rappelez-vous que ZFS a beaucoup de paramètres ajustables, et ce que vous obtenez par défaut n'est pas proche de votre cas d'utilisation.
Essayez ce qui suit dans votre
/etc/modprobe.d/zfs.conf
et redémarrez. C'est ce que j'utilise dans mes pools de données entièrement SSD pour les serveurs d'applications. Votre ashift doit être de 12 ou 13. Benchmark avec compression = off, mais utilisez compression = lz4 en production. Réglez atime = off. Je laisserais la taille d'enregistrement par défaut (128K).la source
zfs get compression
. Dedupe est également éteint.Il semble probable que vous attendiez un verrou mutex du noyau Linux qui, à son tour, pourrait attendre un tampon en anneau Xen. Je ne peux pas en être certain sans avoir accès à une machine similaire, mais je ne suis pas intéressé à payer à Amazon 7 $ / heure pour ce privilège.
La rédaction plus longue est ici: https://www.reddit.com/r/zfs/comments/4b4r1y/why_is_zfs_on_linux_unable_to_fully_utilize_8x/d1e91wo ; Je préfère que ce soit à un endroit plutôt qu'à deux.
la source
J'ai passé beaucoup de temps à essayer de retrouver cela. Mon défi spécifique: un serveur Postgres et je veux utiliser ZFS pour son volume de données. La base de référence est XFS.
D'abord et avant tout, mes épreuves me disent que
ashift=12
c'est faux. S'il y a unashift
chiffre magique, ce n'est pas 12. J'utilise0
et j'obtiens de très bons résultats.J'ai également expérimenté un tas d'options zfs et celles qui me donnent les résultats ci-dessous sont:
atime=off
- Je n'ai pas besoin de temps d'accèschecksum=off
- Je me déshabille, pas en miroircompression=lz4
- Les performances sont meilleures avec la compression (compromis CPU?)exec=off
- C'est pour les données, pas les exécutableslogbias=throughput
- Lisez sur les interwebs c'est mieux pour Postgresrecordsize=8k
- Taille de bloc 8k spécifique à PGsync=standard
- essayé de désactiver la synchronisation; n'a pas vu beaucoup d'avantagesMes tests ci-dessous montrent mieux que les performances XFS (veuillez commenter si vous voyez des erreurs dans mes tests!).
Avec cela, ma prochaine étape est d'essayer Postgres fonctionnant sur un système de fichiers 2 x EBS ZFS.
Ma configuration spécifique:
EC2:
m4.xlarge
instanceEBS: 250 Go de
gp2
volumesnoyau: Linux [...] 3.13.0-105-générique # 152-Ubuntu SMP [...] x86_64 x86_64 x86_64 GNU / Linux *
Tout d'abord, je voulais tester les performances brutes d'EBS. En utilisant une variation de la
fio
commande ci-dessus, j'ai trouvé l'incantation ci-dessous. Remarque: j'utilise des blocs de 8k car c'est ce que j'ai lu, les écritures PostgreSQL sont:La performance brute pour le volume EBS est
WRITE: io=3192.2MB
.Maintenant, testons XFS avec la même
fio
commande:Notre base de référence est
WRITE: io=3181.9MB
; vraiment proche de la vitesse du disque brut.Maintenant, sur ZFS avec
WRITE: io=3181.9MB
comme référence:Remarquez, cela fonctionnait mieux que XFS
WRITE: io=4191.7MB
. Je suis sûr que cela est dû à la compression.Pour les coups de pied, je vais ajouter un deuxième volume:
Avec un deuxième volume,
WRITE: io=5975.9MB
donc ~ 1,8X les écritures.Un troisième volume nous donne
WRITE: io=6667.5MB
, donc ~ 2.1X les écritures.Et un quatrième volume nous donne
WRITE: io=6552.9MB
. Pour ce type d'instance, il semble que je plafonne presque le réseau EBS avec deux volumes, certainement avec trois et ce n'est pas mieux avec 4 (750 * 3 = 2250 IOPS).* À partir de cette vidéo, assurez-vous que vous utilisez le noyau Linux 3.8+ pour obtenir toutes les qualités EBS.
la source
WRITE: io=
; ce n'est pas la vitesse, c'est la quantité de données écrites pendant cette période. Lié à la vitesse uniquement pour les tests qui ont un temps d'exécution fixe, mais par souci de cohérence avec d'autres tests, il est préférable de se concentrer sur les IOPSiops=
. Dans votre cas, les résultats sont similaires. Vous pourriez probablement obtenir beaucoup mieux si vous utilisez des volumes EBS IOPS provisionnés et une instance plus grande. Voir cette page pour les plafonds EBS attendus par taille d'instance. Attention, les frais EBS s'additionnent rapidement si vous ne faites pas attention!/etc/modules.d/zfs.conf
. La question suivante serait quel est le nombre approprié d'iops pour une instance ec2 donnée. En regardant la page que vous référencez, c'est toujours délicat, et je ne vois pas les performances aussi bonnes que l'état des documents.