Virtio je paravirtualizovaný ovladač, což znamená, že operační systém a ovladač si uvědomují, že se nejedná o fyzické zařízení. Ovladač je ve skutečnosti API mezi hostem a hypervizorem, takže jeho rychlost je zcela odpojena od jakéhokoli fyzického zařízení nebo standardu Ethernet.
To je dobrá věc, protože je to rychlejší než hypervizor, který předstírá, že je fyzickým zařízením a používá na tok libovolný koncept „rychlosti spojení“.
VM pouze ukládá rámce na sběrnici a je úkolem hostitele, aby se vypořádal s fyzickými zařízeními; není potřeba, aby VM věděl nebo se staral, jaká je rychlost připojení fyzických zařízení hostitelů.
Jednou z výhod toho je, že když se pakety pohybují mezi 2 VM na stejném hostiteli, mohou posílat pakety tak rychle, jak je CPU hostitele může přesunout z jedné sady paměti do druhé, nastavení „rychlosti linky“ zde pouze vloží nepotřebné omezení rychlosti.
To také umožňuje hostiteli vytvořit týmový adaptér a rozložit provoz na více linek, aniž by musel být každý virtuální počítač explicitně konfigurován, aby získal plnou šířku pásma nastavení.
Pokud chcete vědět, jak rychle můžete skutečně přenášet data z vašeho VM do jiného umístění, musíte provést skutečné testy propustnosti pomocí nástrojů jako iperf
.
Abych to trochu rozvedl, protože jsem do toho nedávno přišel a byl jsem také částečně zmaten nedostatkem podrobností o rychlosti při spuštění ethtool
na virtuálním počítači:
$ ethtool eth0
Settings for eth0:
Link detected: yes
Když jsem se podíval do lshw
výstup:
$ 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
To nám říká, že ovladač zařízení používaný pro tento virtuální počítač je virtualizovaný, v tomto případě se jedná o virtuální počítač běžící na KVM, takže virtuální počítač používá ovladače virtio_* pro všechny své interakce s "hardwarem".
$ 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
Tyto moduly jádra jsou dostupné pro určité operační systémy (Linux, BSD a Windows). S těmito ovladači nainstalovanými ve vašem VM má jádro ve vašem VM speciální přístup k základnímu hardwaru prostřednictvím jádra, které běží na vašem hypervisoru.
Pamatujte, že hypervizory existují 2 různé typy. ESX/vsphere jsou považovány za typ 1. Připomenutí typů:
- Hypervizory typu 1, nativní nebo kovové hypervizory
- Hypervizory typu 2 nebo hostované hypervizory
KVM je více podobný typu 2, ale má některé prvky, jako je virtio_*, díky kterým se chová a funguje více jako typ 1 tím, že vystavuje virtualizaci základní linuxové jádro hypervizoru takovým způsobem, že virtuální počítače může k němu mít polopřímý přístup.
Rychlost mého NIC?
Vzhledem k tomu, že používáte paravirtualizovaný hypervizor, musíte přejít na skutečný hypervizor a zjistit teoretickou rychlost vašeho NIC pomocí ethtool
. Místo toho to lze zjistit pouze tím, že uděláte něco jako pomocí iperf
porovnat NIC pod zatížením a experimentálně zjistit, jaká je rychlost NIC.
Například zde mám 2 servery, které běží na 2 různých hypervizorech. Pomocí iperf
na obou serverech:
$ sudo yum install iperf
Poté spusťte jeden server jako iperf
server na hostiteli 1 VM:
host1$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Poté na klientském virtuálním počítači 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
Na výstupu hostitele1 uvidíte toto:
$ 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
Zde můžeme vidět, že NIC dokázalo dosáhnout rychlosti až 8,60 Gbit/s.