Virtio è un driver paravirtualizzato, il che significa che il sistema operativo e il driver sono consapevoli che non si tratta di un dispositivo fisico. Il driver è in realtà un'API tra il guest e l'hypervisor, quindi la sua velocità è totalmente disconnessa da qualsiasi dispositivo fisico o standard Ethernet.
Questa è una buona cosa in quanto è più veloce dell'hypervisor che finge di essere un dispositivo fisico e applica un concetto arbitrario di "velocità di collegamento" al flusso.
La VM scarica solo i frame su un bus ed è compito dell'host gestire i dispositivi fisici; non è necessario che la VM sappia o si preoccupi della velocità di collegamento dei dispositivi fisici host.
Uno dei vantaggi di ciò è che quando i pacchetti si spostano tra 2 VM sullo stesso host, possono inviare pacchetti alla stessa velocità con cui la CPU dell'host può spostarli da un set di memoria a un altro, l'impostazione di una "velocità di collegamento" qui mette solo in un limite di velocità non necessario.
Ciò consente inoltre all'host di eseguire il teaming dell'adattatore e distribuire il traffico su più collegamenti senza che ogni VM debba essere configurata in modo esplicito per ottenere l'intera larghezza di banda della configurazione.
Se vuoi sapere quanto velocemente puoi effettivamente trasferire i dati dalla tua VM a un'altra posizione, devi eseguire test di throughput effettivi con strumenti come iperf
.
Per espandere un po' questo argomento perché anch'io ci sono entrato di recente ed ero anche semi-confuso dalla mancanza di dettagli sulla velocità durante l'esecuzione di ethtool
su una VM:
$ ethtool eth0
Settings for eth0:
Link detected: yes
Quando ho esaminato lshw
uscita:
$ 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
Questo ci dice che il driver del dispositivo utilizzato per questa VM è virtualizzato, in questo caso si tratta di una VM in esecuzione su KVM e quindi la VM utilizza i driver virtio_* per tutte le sue interazioni con "l'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
Questi moduli del kernel sono disponibili per alcuni sistemi operativi (Linux, BSD e Windows). Con questi driver installati nella tua VM, il kernel nella tua VM ha un accesso speciale all'hardware sottostante tramite il kernel in esecuzione sul tuo hypervisor.
Ricorda che con gli hypervisor ci sono 2 tipi distinti. ESX/vsphere sono considerati di tipo 1. Promemoria sui tipi:
- Hypervisor di tipo 1, nativi o bare metal
- Hypervisor di tipo 2 o ospitati
KVM è più simile a un tipo 2, ma ha alcuni elementi, come virtio_*, che lo fanno comportare ed eseguire più come un tipo 1, esponendo alla virtualizzazione il kernel Linux sottostante dell'hypervisor in modo tale che le VM può avere accesso semi-diretto ad esso.
La velocità della mia scheda di rete?
Dato che stai girando su un hypervisor paravirtualizzato devi andare sull'hypervisor effettivo per scoprire la velocità teorica della tua NIC usando ethtool
. Al posto di ciò, puoi scoprirlo solo facendo qualcosa come usare iperf
per confrontare la NIC sotto carico e scoprire sperimentalmente quale sembra essere la velocità della NIC.
Ad esempio, qui ho 2 server in esecuzione su 2 diversi hypervisor. Usando iperf
su entrambi i server:
$ sudo yum install iperf
Quindi eseguire un server come iperf
server su host1 VM:
host1$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Quindi su un 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
Sull'output di host1 vedrai questo:
$ 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
Qui possiamo vedere che la scheda NIC è stata in grado di arrivare fino a 8,60 Gbit/sec.