Accélération du sous-système de disque Kemu Qemu sous Linux



Parfois, j'assume diverses tâches pour configurer des serveurs. Il y a quelque temps, le propriétaire d'une petite société d'hébergement m'a abordé avec un problème intéressant. Il aimerait exécuter des machines virtuelles Windows sous KVM sur ses serveurs, où Ubuntu 18.04 était déjà installé.

Cependant, ses tests ont montré que le système de disques KVM était décemment en retard par rapport aux indicateurs qu'il avait sous Hyper-V. Il voulait libérer qemu sur ses serveurs Ubuntu pour éviter d'acheter des licences de serveur Windows coûteuses (la version gratuite de Microsoft Hyper-V Server n'a pas fonctionné en raison de ses limites).

0. Disposition


Pour les tests, nous avons utilisé le SSD Samsung 970 Pro 1 To. Le client a vérifié les résultats du travail dans CrystalDiskMark, donc plus loin dans l'article tous les graphiques de celui-ci.

Windows 10 LTSC
Processeur Hyper-V 2

CPU KVM 2
La première étape consistait à améliorer les performances d'E / S aléatoires. Ce type de charge est typique des machines virtuelles, en particulier celles qui utilisent diverses bases de données.

Ubuntu (16.04 LTS et 18.04) utilise toujours la version 2.11 de qemu. Par conséquent, certains des derniers pains qemu ne sont pas pris en compte dans cet article.

Nous avons décidé que nous devons éviter de lier le fer à une machine virtuelle, car cela complique la portabilité des machines virtuelles, de sorte que les options de lancement de SSD / disques physiques / partitions dans des machines virtuelles ont été jugées indésirables.

À propos de la taille du fichier de test pour CrystalDiskMark
, 100 4. , : , .

, , Windows . 100 4 , 40 .

, , 100-1. 4.

1. Nous utilisons des volumes LVM, pas des fichiers pour stocker des disques de machine virtuelle.


La logique est la suivante. Le fichier avec le disque virtuel est stocké dans le système de fichiers Linux, NTFS est situé à l'intérieur du fichier lui-même. Chaque système de fichiers consomme des ressources pendant les opérations sur disque. Par conséquent, plus la profondeur de la poupée est petite, plus l'entrée / sortie est rapide.

Si nous parlons des fichiers qcow2, leur nom signifie «Qemu Copy-On-Write» et, en fait, ils ont leur propre table de traduction à l'intérieur qui est responsable des blocs occupés, de ceux qui ne le sont pas et de l'emplacement.

La couche LVM consomme beaucoup moins de ressources processeur que le système de fichiers. L'une des raisons à cela est que les blocs qu'il contient sont beaucoup plus volumineux qu'un bloc de système de fichiers typique (4 Ko). Plus le bloc (étendue) est important sur le périphérique LVM physique, plus les E / S se produisent rapidement et moins la fragmentation.

Mais même pour les SSD, les E / S aléatoires sont beaucoup plus lentes que les séries. Par conséquent, lors de la création du groupe de volumes, nous spécifierons une très large étendue: 256 Mo.

La lecture à l'avance sur un volume logique doit être désactivée, car il dépense des E / S sans gagner, car maintenant, personne ne défragmente les disques dans Windows sur des SSD.

LVM est assez pratique à utiliser pour héberger des machines virtuelles. Les volumes LVM sont facilement portables entre les disques physiques; il existe des instantanés et un redimensionnement en ligne. De plus, virt-manager (libvirt) peut créer des volumes logiques prêts à l'emploi pour les disques de machines virtuelles à partir du groupe Volume.

La capacité de créer des volumes minces semble également attrayante, mais étant donné qu'un volume mince est une couche supplémentaire d'abstraction, il est évident que cela dégradera les performances d'E / S. De plus, libvirt n'a pas de méthode élégante pour créer automatiquement des disques pour des machines virtuelles dans un pool léger.

#    SSD    (volume group)
pvcreate /dev/nvme1n1p1

#    win    (extent) 256.
vgcreate -s 256M win_pool /dev/nvme1n1p1

#    vm1.    C
lvcreate -n vm1 -L 100G win_pool

#      (read ahead)
lvchange -r none /dev/win_pool/vm1

1.1. Volume mince en tant que disque et / ou paramètres de volume logique pour les instantanés


Si vous souhaitez utiliser un pool léger dans lequel vous allez créer des volumes légers, il est logique de définir la taille de bloc du pool sur 4 Mo, ce qui est beaucoup plus important que la taille par défaut de 64 Ko.
Ce qui entraînera un travail plus rapide de cette couche d'abstraction.

Le mécanisme d'instantané dans LVM fonctionne presque sur le même code que les volumes légers, donc les paramètres seront les mêmes pour augmenter la vitesse de l'instantané.

lvcreate -c 4m -L 300G -T -Zn win_pool/thin

L'option -Zndésactive le remplacement du bloc avec des zéros lors de la mise en évidence, ce qui augmente la vitesse de travail.

Paramètres pour lvm.conf ou un fichier similaire (par exemple lvmlocal.conf):

thin_pool_chunk_size = 4096
thin_pool_zero = n

Vous pouvez déterminer la taille optimale du bloc en effectuant le test avec la commande suivante, en choisissant la valeur --blocksize:

fio --name=randwrite --filename=/dev/nvme0n1p9 --size=10G --ioengine=libaio --iodepth=1 --buffered=0 --direct=1 --rw=randwrite --blocksize=4m

Vous pouvez afficher la taille actuelle du bloc avec la commande:

lvs -ao name,chunksize

2. L'augmentation du nombre de processeurs logiques alloués à chaque machine virtuelle KVM améliore les performances du disque


10 CPU8 CPU4 CPU

Il est clair que presque personne n'allouera 10 processeurs à la machine virtuelle, mais il était intéressant de regarder le cas extrême.

Cela dépend déjà du nombre de processeurs gratuits. À mon avis, il n'est pas opportun d'en allouer plus de 4. Avec un nombre de threads égal à 8, nous avons obtenu les performances de lecture et d'écriture aléatoires maximales. Il s'agit d'une spécificité de CrystalDiskMark 6.0.2, dans laquelle le deuxième test effectue 8 threads.

D'où nous pouvons conclure qu'il est bon d'avoir un processeur logique pour chaque tâche qui utilise activement IO.

3. Nous utilisons d'énormes pages de mémoire à accès aléatoire (énormes pages) pour éviter la dégradation des performances due à la fragmentation de la RAM


Ce package peut être utile lorsque nous avons besoin de diverses informations sur les pages géantes pendant le fonctionnement.

apt install hugepages

Modifier /etc/default/grub:

GRUB_CMDLINE_LINUX="default_hugepagesz=1GB hugepagesz=1G hugepages=64"

Dans ce cas, 64 Go de mémoire ont été alloués à toutes les machines virtuelles sous forme de pages géantes. Dans votre cas, il peut y avoir moins / plus.

Nous appliquons ces paramètres à GRUB afin que la prochaine fois que le système démarre, ils deviennent actifs:

grub-mkconfig -o /boot/grub/grub.cfg

Modification de la configuration de la machine virtuelle:

virsh edit vm_name

Ajouter:

<memoryBacking>
  <hugepages/>
</memoryBacking>

4. Ajoutez un flux dédié à chaque machine virtuelle pour servir les E / S


Vous devez ajouter ce qui est mis en évidence en gras. Nous utilisons virsh, comme dans le paragraphe précédent.

<iothreads>1</iothreads>

<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='threads' iothread='1'/>
<source dev='/dev/win/terminal'/>
<target dev='vda' bus='virtio'/>
<boot order='2'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>


4.1. writeback


Pour accélérer l'écriture accidentelle sur le disque, mais avec un risque accru de perte de données, vous pouvez utiliser cache=writebackle paragraphe précédent. Il ne peut être utilisé que s'il existe une grande confiance dans la qualité et la sauvegarde de l'alimentation et en présence de sauvegardes.

5. Paramètres du sous-système de disque dans Virt Manager


Bus de disque:
format de stockage VirtIO : brut
Mode cache: écriture
différée Mode IO: threads

5.1. Configuration d'un sous-système de disque via un fichier de configuration


Qemu 2.11 (qui est actuellement utilisé par Ubuntu) prend en charge deux types de périphériques virtuels de disque: virtio-blk et virtio-scsi. Lorsque spécifié dans Virt Manager Disk bus: VirtIO, cela signifie utiliser le périphérique virtio-blk.

Dans tous les cas, virtio-blk est meilleur en vitesse, malgré le fait que dans la version testée de qemu il ne supportait toujours pas TRIM, contrairement à virtio-scsi (il le supporte déjà depuis la version 5.x ).

Du point de vue de la vitesse d'E / S disque, virtio-scsi n'a de sens que dans des cas exotiques, par exemple, lorsque vous devez connecter des centaines de disques à une machine virtuelle.

6. Pendant l'installation de Windows, installez le pilote VirtIO


Sinon, le disque ne sera pas disponible pour le système d'exploitation. Pour ce faire, utilisez l'image du pilote, que nous pré-connectons à la machine virtuelle.

7. Résultats après avoir appliqué tous les ajustements


En fait, le tweak 4.1 n'a pas été utilisé, car je n'étais pas sûr de la fiabilité de l'alimentation du client.

Processeur Hyper-V 2

CPU KVM 2

CPU KVM 4

Vous devez comprendre que ces résultats ont une certaine convention, car chaque fois que vous démarrez CrystalDiskMark, les valeurs sont légèrement différentes.

KVM prêt à l'emploi
2 CPU
KVM après ajustements
2 CPU

Nous voyons qu'il a été possible d'accélérer considérablement le travail du sous-système de disque en qemu (kvm) avec le même nombre de cœurs. L'écriture a été accélérée en moyenne de 58% et la lecture de 25%.

Éléments clés de réussite : utilisation de volumes LVM au lieu de fichiers qcow2, d'E / S séparées et de pages géantes.

Dirigez les erreurs constatées vers le PM. J'augmente le karma pour cela.

PS vhost-user-blk et vhost-user-nvme


Au cours des expériences, Qemu 2.12 et la version 3 ont également été compilés. L'option vhost-user-blk pour un disque a été testée.

En fin de compte, cela a fonctionné pire que virtio-blk.


CPU vhost-user-blk 4

CPU virtio-blk 4

Pour utiliser vhost-user-nvme, il était nécessaire de patcher qemu, cette option compliquait la mise à jour automatique des serveurs en production, elle n'a donc pas été testée.

PPS SPDK


Intel a conçu ce cadre pour atteindre des indicateurs de performances exceptionnels pour les systèmes de disques des machines virtuelles qui devraient fonctionner sur ses processeurs.

Pour que spdk fonctionne correctement, ils passent par de nombreuses astuces - ils lui allouent des noyaux séparés, placent les noyaux spdk et de machine virtuelle dans un socket. Chargez la machine virtuelle dans un bloc de mémoire contigu. Si vous appliquez de telles mesures à virtio-blk normal, cela fonctionnera également plus rapidement.

SPDK est capable de fonctionner en 3 modes: vhost-user-scsi, vhost-user-blk et vhost-user-nvme. Le deuxième mode est uniquement disponible dans qemu à partir de la 2.12, qui n'est pas encore disponible dans ubuntu. Le mode vhost-user-nvme est généralement méga-expérimental - vous devez patcher qemu pour cela. Actuellement, seule l'émulation scsi fonctionne et elle est lente.

Il existe une autre limitation sérieuse pour le mode vhost-user-scsi - spdk ne peut pas être amorçable.
Assurez-vous que l'option bootindex = 2 Qemu est donnée au périphérique vhost-user-scsi-pci.
Les enregistrements sont définis lorsqu'ils utilisent leur pilote pour partager des SSD sur plusieurs appareils et les transmettre en tant que vhost-user-nvme. L'approche perceuse de fer ne nous convenait pas.

L'impression était qu'il était normal d'utiliser SPDK uniquement avec leur implémentation de disques logiques (ce qui est complètement différent du LVM standard). Il s'agit d'un vélo fait maison avec ses photos et son clonage. Les équipes sont toutes différentes de LVM.

La difficulté de configurer le SPDK, le support et la portabilité des machines virtuelles, ainsi que la connexion aux processeurs Intel, se sont détournés de son utilisation.

Remerciements


Merci pour l'image TripletConcept . Il est préférable de le regarder en taille réelle dans une fenêtre séparée.

Pour obtenir la permission de partager des documents de travail -st_neon




Vous pouvez commander une machine virtuelle avec SSD auprès de RUVDS pour le coupon ci-dessous. Dirigez les erreurs constatées vers le PM. J'augmente le karma pour cela.




All Articles