Virtio est un pilote para-virtualisé, ce qui signifie que le système d'exploitation et le pilote sont conscients qu'il ne s'agit pas d'un périphérique physique. Le pilote est en réalité une API entre l'invité et l'hyperviseur, sa vitesse est donc totalement déconnectée de tout périphérique physique ou standard Ethernet.
C'est une bonne chose car c'est plus rapide que l'hyperviseur prétendant être un périphérique physique et appliquant un concept arbitraire de "vitesse de liaison" au flux.
La machine virtuelle décharge simplement les trames sur un bus et c'est le travail de l'hôte de gérer les périphériques physiques ; la machine virtuelle n'a pas besoin de connaître ou de se soucier de la vitesse de liaison des périphériques physiques hôtes.
L'un des avantages de ceci est que lorsque les paquets se déplacent entre 2 machines virtuelles sur le même hôte, ils peuvent envoyer des paquets aussi vite que le processeur de l'hôte peut les déplacer d'un ensemble de mémoire à un autre, définir une "vitesse de liaison" ici met juste dans un limite de vitesse inutile.
Cela permet également à l'hôte d'effectuer une association d'adaptateurs et de répartir le trafic sur plusieurs liaisons sans que chaque machine virtuelle ait besoin d'être explicitement configurée pour obtenir la bande passante complète de la configuration.
Si vous voulez savoir à quelle vitesse vous pouvez réellement transférer des données de votre machine virtuelle vers un autre emplacement, vous devez effectuer des tests de débit réels avec des outils tels que iperf
.
Pour développer un peu cela parce que je suis trop récemment entré dans ce domaine et que j'étais également à moitié confus par le manque de détails sur la vitesse lors de l'exécution de ethtool
sur une VM :
$ ethtool eth0
Settings for eth0:
Link detected: yes
Quand j'ai regardé lshw
sortie :
$ lshw -class network -short
H/W path Device Class Description
==========================================================
/0/100/3 network Virtio network device
/0/100/3/0 eth0 network Ethernet interface
Cela nous indique que le pilote de périphérique utilisé pour cette VM est virtualisé, dans ce cas, il s'agit d'une VM fonctionnant sur KVM et donc la VM utilise les pilotes virtio_* pour toutes ses interactions avec le "matériel".
$ lsmod | grep virt
virtio_rng 13019 0
virtio_balloon 13864 0
virtio_net 28096 0
virtio_console 28066 1
virtio_scsi 18453 2
virtio_pci 22913 0
virtio_ring 22746 6 virtio_net,virtio_pci,virtio_rng,virtio_balloon,virtio_console,virtio_scsi
virtio 14959 6 virtio_net,virtio_pci,virtio_rng,virtio_balloon,virtio_console,virtio_scsi
Ces modules de noyau sont disponibles pour certains systèmes d'exploitation (Linux, BSD et Windows). Avec ces pilotes installés sur votre VM, le noyau de votre VM a un accès spécial au matériel sous-jacent via le noyau qui s'exécute sur votre hyperviseur.
N'oubliez pas qu'avec les hyperviseurs, il existe 2 types distincts. ESX/vsphere sont considérés comme de type 1. Rappel sur les types :
- Hyperviseurs de type 1, natifs ou sans système d'exploitation
- Hyperviseurs de type 2 ou hébergés
KVM s'apparente davantage à un type-2, mais possède certains éléments, tels que virtio_*, qui le font se comporter et fonctionner davantage comme un type-1, en exposant à la virtualisation le noyau Linux sous-jacent de l'hyperviseur de telle sorte que les VM peuvent y avoir un accès semi-direct.
La vitesse de ma carte réseau ?
Étant donné que vous utilisez un hyperviseur paravirtualisé, vous devez accéder à l'hyperviseur réel pour connaître la vitesse théorique de votre carte réseau en utilisant ethtool
. Au lieu de cela, on ne peut le savoir qu'en faisant quelque chose comme utiliser iperf
pour comparer la carte réseau sous charge et découvrir expérimentalement quelle semble être la vitesse de la carte réseau.
Par exemple, j'ai ici 2 serveurs qui tournent sur 2 hyperviseurs différents. Utilisation de iperf
sur les deux serveurs :
$ sudo yum install iperf
Ensuite, exécutez un serveur en tant que iperf
serveur sur la machine virtuelle host1 :
host1$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Puis sur une VM cliente host2 :
host2$ iperf -c 192.168.100.25
------------------------------------------------------------
Client connecting to 192.168.100.25, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.100.101 port 55854 connected with 192.168.100.25 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 10.0 GBytes 8.60 Gbits/sec
Sur la sortie de host1, vous verrez ceci :
$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 192.168.100.25 port 5001 connected with 192.168.100.101 port 55854
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 10.0 GBytes 8.60 Gbits/sec
Ici, nous pouvons voir que la carte réseau a pu monter jusqu'à 8,60 Gbits/sec.