Virtio は準仮想化ドライバーです。これは、OS とドライバーが物理デバイスではないことを認識していることを意味します。ドライバーは実際にはゲストとハイパーバイザー間の API であるため、その速度は物理デバイスやイーサネット標準から完全に切り離されています。
これは、ハイパーバイザーが物理デバイスのふりをして、フローに任意の「リンク速度」の概念を適用するよりも高速であるため、良いことです。
VM はフレームをバスにダンプするだけで、物理デバイスを処理するのはホストの仕事です。 VM がホストの物理デバイスのリンク速度を認識したり気にしたりする必要はありません。
これの利点の 1 つは、パケットが同じホスト上の 2 つの VM 間を移動する場合、ホストの CPU が 1 つのメモリ セットから別のメモリ セットにパケットを移動できるのと同じ速さでパケットを送信できることです。ここで「リンク速度」を設定すると、不要な制限速度。
これにより、ホストはアダプタ チーミングを実行し、トラフィックを複数のリンクに分散させることもできます。すべての VM を明示的に構成してセットアップの全帯域幅を取得する必要はありません。
VM から別の場所に実際にデータを転送できる速度を知りたい場合は、iperf
などのツールを使用して実際のスループット テストを行う必要があります。 .
私も最近この問題に取り組み、ethtool
を実行したときの速度の詳細が不足していることに半ば混乱していたため、これについて少し詳しく説明します。 VM 上:
$ ethtool eth0
Settings for eth0:
Link detected: yes
lshw
を調べてみたら 出力:
$ 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
これは、この VM に使用されているデバイス ドライバーが仮想化されていることを示しています。この場合、これは KVM で実行されている VM であるため、VM は「ハードウェア」とのすべてのやり取りに virtio_* ドライバーを使用しています。
$ 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
これらのカーネル モジュールは、特定の OS (Linux、BSD、および Windows) で使用できます。 VM にこれらのドライバーをインストールすると、VM のカーネルは、ハイパーバイザーで実行されているカーネルを介して、基盤となるハードウェアに特別にアクセスできます。
ハイパーバイザーには 2 つの異なるタイプがあることに注意してください。 ESX/vsphere はタイプ 1 と見なされます。タイプに関する注意事項:
- タイプ 1、ネイティブまたはベアメタル ハイパーバイザー
- タイプ 2 またはホスト型ハイパーバイザー
KVM はタイプ 2 に似ていますが、virtio_* などのいくつかの要素があり、タイプ 1 のように動作および実行します。半直接アクセスできます。
NIC の速度は?
準仮想化ハイパーバイザーで実行している場合、実際のハイパーバイザーにアクセスして、ethtool
を使用して NIC の理論上の速度を調べる必要があります。 .その代わりに、 iperf
を使用するようなことをすることによってのみ見つけることができます 負荷がかかった状態で NIC のベンチマークを行い、実験的に NIC の速度を調べます。
たとえば、ここでは 2 つの異なるハイパーバイザーで実行されている 2 つのサーバーがあります。 iperf
の使用 両方のサーバーで:
$ sudo yum install iperf
次に、1 つのサーバーを iperf
として実行します。 host1 VM 上のサーバー:
host1$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
次に、クライアント VM ホスト 2 で:
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
host1 の出力には、次のように表示されます:
$ 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
ここで、NIC が最大 8.60Gbits/秒に達したことがわかります。