Qemu et réseau / DPDK
Pour l’utilisation d’une VM et l’interaction avec le réseau, le Host, spécifiquement dans le cas de DPDK, plusieurs options sont possibles.
La VM peut avoir un accès direct à un périphérique PCI en utilisant du Passthrough ou utiliser le back-end virtio-net-pci.
VirtIO
VirtIO est une API définissant comment coder un front-end et un backend pour un driver virtuel. Cet API est de plus en plus utilisé par la plus part des Hyperviseurs (VirtualBox, VMware, Qemu/KVM, …)
https://fr.wikipedia.org/wiki/Virtio
https://developer.ibm.com/articles/l-virtio/
https://www.ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf
Un driver virtuel est divisé en 2 parties, le front-end, coté Guest et le backe-end coté Host.
virtio définit 2 types de communication Guest/Host :
- un moyen de communication pour le Control (définition des capacités, e.g. TSO pour une carte réseau)
- un moyen de communcation pour les Data (e.g. envoi et réception de paquets réseaux dans le cas d’une carte réseau)
vhost
vhost protocol - A protocol that allows the virtio dataplane implementation to be offloaded to another element (user process or kernel module) in order to enhance performance.
https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net
http://www.virtualopensystems.com/fr/solutions/guides/snabbswitch-qemu/
in the kernel (vhost-net) or in the user space (vhost-user)
https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net
vhost-user
Comme pour Vhost, il y a une communication directe entre
mais cette fois l’élément prenant en charge le traitement est dans l’espace utilisateur.
Vhost-user est typiquement utilisé pour des switch réseaux implémenté en espace user (OpenVswitch, snabbswitch).
virtio-net-pci
C’est l’implémentation d’un device/driver virtio pour le réseau.
-device virtio-net-pci,netdev=${IF_VM},mac=${MAC} \
-netdev type=tap,ifname=${IF_VM},id=${IF_VM},script=./ovs-ifup-wan0,downscript=no \
https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net
netdev type=tap
Interface du host → TAP
-netdev type=tap,ifname=${IF_VM},id=${IF_VM},script=./ovs-ifup-wan0,downscript=no \
netdev type=vhost-user
Dans le cas d’une utilisation de OVS-DPDK, on crée dans OVS-DPDK des interfaces de type dpdkvhostuserclient qui vont être utilisées dans la ligne de commande de QEMU.
-chardev socket,id=char1,path=/tmp/dpdkvhostuserclient1,server \
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,
vfio-pci
Passthrough, on donne un accès direct au device PCI à l’OS du Guest. Le Guest va donc pouvoir utiliser directement son driver sur le hardware.
Le paramètre ‘host=’ correspond à un identifiant PCI. Cet identifiant est obtenu en regardant la sortie de la commande “lspci”.
-net none -device vfio-pci,host=0c:00.3
Options mémoire pour DPDK
Pour que DPDK fonctionne pleinement dans la VM, il est nécessaire de passer certains paramètres particuliers en terme de configuration mémoire.
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/hugepages,share=on \
-numa node,memdev=mem -mem-prealloc \
VFIO
VFIO is basically a framework for building userspace drivers.
Introduction to PCI Device Assignment with VFIO
SR-IOV
TODO …
Liens
https://software.intel.com/en-us/articles/configure-vhost-user-multiqueue-for-ovs-with-dpdk
un ensemble d’articles de RedHat :
https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net
https://www.redhat.com/en/blog/how-vhost-user-came-being-virtio-networking-and-dpdk
https://www.redhat.com/en/blog/all-you-need-know-about-kvm-userspace
https://www.redhat.com/en/blog/deep-dive-virtio-networking-and-vhost-net
https://www.redhat.com/en/blog/achieving-network-wirespeed-open-standard-manner-introducing-vdpa (SR-IOV et vDPA)
https://www.redhat.com/en/blog/how-vhost-user-came-being-virtio-networking-and-dpdk
https://www.redhat.com/en/blog/hands-vhost-net-do-or-do-not-there-no-try
https://www.redhat.com/en/blog/hands-vhost-user-warm-welcome-dpdk
Laisser un commentaire