我有一个使用 virtio-net 在 kvm 上运行的 Linux VM,我想检查链接速度。我该怎么做?
我到目前为止尝试过的:
# ethtool eth0
Settings for eth0:
Link detected: yes
ethtool 似乎还不支持 virtio-net(目前还不支持?)我有来自 debian jessie 的 3.16-1 版本,ethtool 有新版本支持它吗?似乎 6 版是最新版本。
# cat /sys/class/net/eth0/speed
cat: /sys/class/net/eth0/speed: Invalid argument
# lspci | grep -iE --color 'network|ethernet'
00:12.0 Ethernet controller: Red Hat, Inc Virtio network device
# lshw -class network
*-network
description: Ethernet interface
product: Virtio network device
vendor: Red Hat, Inc
physical id: 12
bus info: pci@0000:00:12.0
logical name: eth0
version: 00
serial: 4e:ff:a8:bf:61:12
width: 32 bits
clock: 33MHz
capabilities: msix bus_master cap_list rom ethernet physical
configuration: broadcast=yes driver=virtio_net driverversion=1.0.0 ip=172.30.2.152 latency=0 link=yes multicast=yes
resources: irq:10 ioport:c080(size=32) memory:febf2000-febf2fff memory:febe0000-febeffff
我发现一个链接描述了这个问题红帽知识库,但不幸的是我没有订阅来阅读它。
答案1
Virtio 是一种半虚拟化驱动程序,这意味着操作系统和驱动程序知道它不是物理设备。该驱动程序实际上是客户机和虚拟机管理程序之间的 API,因此其速度与任何物理设备或以太网标准完全无关。
这是一件好事,因为这比假装是物理设备并应用任意“链接速度”概念来流动的虚拟机管理程序要快得多。
VM 只是将帧转储到总线上,而主机的工作是处理物理设备;VM 无需知道或关心主机物理设备的链接速度。
这样做的优点之一是,当数据包在同一主机上的两个虚拟机之间移动时,它们发送数据包的速度与主机 CPU 将数据包从一组内存移动到另一组内存的速度一样快,在这里设置“链接速度”只会带来不必要的速度限制。
这还允许主机进行适配器组合并将流量分散到多个链路,而无需明确配置每个虚拟机以获取设置的全部带宽。
如果您想知道从虚拟机到另一个位置的实际传输速度有多快,您需要使用诸如 之类的工具进行实际吞吐量测试iperf
。
答案2
Cumulus Networks 已将其补丁上传到上游以设置 virtio_net 驱动程序的速度。这在使用其 Cumulus VX VM 产品进行网络模拟时非常有用。
补丁在 Ubuntu Xenial 中。不确定它现在是否在 Fedora 中。
更多详情可在这找到。 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1581132
另一个参考是我的博客文章,关于为什么在 virtio 驱动程序上进行速度设置很有用。
答案3
ethtool
对此进行稍微扩展一下,因为我最近也遇到过这个问题,并且对在虚拟机上运行时缺乏速度详细信息感到有些困惑:
$ 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
这些内核模块适用于某些操作系统(Linux、BSD 和 Windows)。在虚拟机中安装这些驱动程序后,虚拟机中的内核可以通过虚拟机管理程序上运行的内核访问底层硬件。
请记住,虚拟机管理程序有两种不同的类型。ESX/vsphere被考虑类型-1. 类型提醒:
- 类型 1,本机或裸机虚拟机管理程序
- 类型 2 或托管虚拟机管理程序
虚拟机更类似于类型 2,但具有一些元素,例如 virtio_*,通过向虚拟化公开虚拟机管理程序的底层 Linux 内核,使虚拟机可以半直接访问它,从而使其行为和性能更像类型 1。
我的网卡速度是多少?
假设你正在运行半虚拟化虚拟机管理程序,您必须进入实际的虚拟机管理程序,使用 找出 NIC 的理论速度ethtool
。 取而代之的是,只能通过使用iperf
对负载下的 NIC 进行基准测试,并通过实验找出 NIC 的速度。
例如,这里有 2 台服务器,它们在 2 个不同的虚拟机管理程序上运行。iperf
在两台服务器上使用:
$ sudo yum install iperf
iperf
然后在 host1 VM 上运行一个服务器:
host1$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
然后在客户端虚拟机 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
在 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/秒。