Virtio ist ein paravirtualisierter Treiber, was bedeutet, dass das Betriebssystem und der Treiber wissen, dass es sich nicht um ein physisches Gerät handelt. Der Treiber ist wirklich eine API zwischen dem Gast und dem Hypervisor, sodass seine Geschwindigkeit vollständig von jedem physischen Gerät oder Ethernet-Standard getrennt ist.
Dies ist eine gute Sache, da dies schneller ist als der Hypervisor, der vorgibt, ein physisches Gerät zu sein, und ein willkürliches „Verbindungsgeschwindigkeits“-Konzept auf den Datenfluss anwendet.
Die VM wirft einfach Frames auf einen Bus und es ist die Aufgabe des Hosts, sich um die physischen Geräte zu kümmern; Die VM muss die Verbindungsgeschwindigkeit der physischen Geräte des Hosts nicht kennen oder sich darum kümmern.
Einer der Vorteile davon ist, dass Pakete, wenn sie zwischen zwei VMs auf demselben Host verschoben werden, Pakete so schnell senden können, wie die CPU des Hosts sie von einem Speichersatz zu einem anderen verschieben kann unnötige Geschwindigkeitsbegrenzung.
Dadurch kann der Host auch Adapter-Teaming durchführen und den Datenverkehr auf mehrere Links verteilen, ohne dass jede VM explizit konfiguriert werden muss, um die volle Bandbreite des Setups zu erhalten.
Wenn Sie wissen möchten, wie schnell Sie Daten tatsächlich von Ihrer VM an einen anderen Ort übertragen können, müssen Sie tatsächliche Durchsatztests mit Tools wie iperf
durchführen .
Um das ein wenig zu erweitern, weil ich vor kurzem darauf gestoßen bin und auch halb verwirrt war durch das Fehlen von Geschwindigkeitsdetails beim Ausführen von ethtool
auf einer VM:
$ ethtool eth0
Settings for eth0:
Link detected: yes
Als ich in lshw
schaute Ausgabe:
$ 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
Dies sagt uns, dass der für diese VM verwendete Gerätetreiber virtualisiert ist, in diesem Fall ist dies eine VM, die auf KVM läuft, und daher verwendet die VM die virtio_*-Treiber für alle ihre Interaktionen mit "Hardware".
$ 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
Diese Kernel-Module sind für bestimmte Betriebssysteme (Linux, BSD und Windows) verfügbar. Wenn diese Treiber in Ihrer VM installiert sind, hat der Kernel in Ihrer VM besonderen Zugriff auf die zugrunde liegende Hardware durch den Kernel, der auf Ihrem Hypervisor ausgeführt wird.
Denken Sie daran, dass es bei Hypervisoren zwei verschiedene Typen gibt. ESX/vsphere gelten als Typ-1. Erinnerung an die Typen:
- Typ-1, native oder Bare-Metal-Hypervisoren
- Typ-2 oder gehostete Hypervisoren
KVM ähnelt eher einem Typ-2, verfügt jedoch über einige Elemente, wie z kann halbdirekten Zugriff darauf haben.
Die Geschwindigkeit meiner Netzwerkkarte?
Da Sie auf einem paravirtualisierten Hypervisor laufen, müssen Sie auf den eigentlichen Hypervisor gehen, um die theoretische Geschwindigkeit Ihrer NIC mit ethtool
herauszufinden . Stattdessen kann man das nur herausfinden, indem man so etwas wie iperf
verwendet um die Netzwerkkarte unter Last zu benchmarken und experimentell herauszufinden, wie schnell die Netzwerkkarte zu sein scheint.
Hier habe ich zum Beispiel 2 Server, die auf 2 verschiedenen Hypervisoren laufen. Mit iperf
auf beiden Servern:
$ sudo yum install iperf
Dann einen Server als iperf
ausführen Server auf host1 VM:
host1$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Dann auf einer Client-VM 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
In der Ausgabe von host1 sehen Sie Folgendes:
$ 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
Hier können wir sehen, dass die Netzwerkkarte bis zu 8,60 Gbit/s erreichen konnte.