假设我在具有 2 个虚拟功能的主机上启用了 SR-IOV passthrough,我正在使用 libvirt 运行两个 QEMU/KVM VM,每个虚拟机分别连接到一个 VF,有什么方法可以看到 host 上的 VF 计数器(例如 rx/tx pkts)?
我尝试使用
ethtool -S
查看统计数据,但只能看到物理功能的全局计数器。我已经在 Ubuntu 上测试了这个解决方案,在 OpenStack 安装中启用 SRIOV 的计算上运行。获取 PF 的各个 VF 计数器的步骤。物理网卡 (25G) 在 XXV710 设备的 INTEL i40 驱动程序上运行。
#lspci |grep -i ethernet
3b:00.1 Ethernet controller: Intel Corporation Ethernet Controller XXV710 for 25GbE SFP28 (rev 02)
.....
# ethtool -i eth2
driver: i40e
version: 2.7.29
firmware-version: 7.20 0x80009f02 1.2829.0
expansion-rom-version:
bus-info: 0000:3b:00.1
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
步骤1-
在 /sys/devices 中查找 sriov 目录:
# find /sys/devices/ -type d -name sriov
/sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.1/sriov
第 2 步:转到此目录并执行 ls -lrt。您将看到 VF 编号。这些数字与“ip link show '命令的输出中看到的相同。进行相关。
# find /sys/devices/ -type d -name sriov |xargs ls -lrt
/sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.1/sriov:
total 0
drwxr-xr-x 3 root root 0 Jan 9 21:40 7
drwxr-xr-x 3 root root 0 Jan 9 21:40 15
drwxr-xr-x 3 root root 0 Jan 9 21:40 5
drwxr-xr-x 3 root root 0 Jan 9 21:40 13
drwxr-xr-x 3 root root 0 Jan 9 21:40 3
drwxr-xr-x 3 root root 0 Jan 9 21:40 11
drwxr-xr-x 3 root root 0 Jan 9 21:40 1
drwxr-xr-x 3 root root 0 Jan 9 21:40 8
drwxr-xr-x 3 root root 0 Jan 9 21:40 6
drwxr-xr-x 3 root root 0 Jan 9 21:40 14
drwxr-xr-x 3 root root 0 Jan 9 21:40 4
drwxr-xr-x 3 root root 0 Jan 9 21:40 12
drwxr-xr-x 3 root root 0 Jan 9 21:40 2
drwxr-xr-x 3 root root 0 Jan 9 21:40 10
drwxr-xr-x 3 root root 0 Jan 9 21:40 0
drwxr-xr-x 3 root root 0 Jan 9 21:40 9
ip 链接显示的输出
## ip link show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq portid 3cfdfea85df9 state UP mode DEFAULT group default qlen 1000
link/ether 3c:fd:fe:a8:5d:f9 brd ff:ff:ff:ff:ff:ff
vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 1 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 2 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 3 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 4 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 5 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 6 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 7 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 8 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 9 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 10 MAC 00:00:00:00:00:00, spoof checking on, link-state auto, trust off
vf 11 MAC fa:16:3e:19:8c:05, vlan 1929, spoof checking off, link-state auto, trust on
vf 12 MAC fa:16:3e:43:88:4f, vlan 1927, spoof checking off, link-state auto, trust on
vf 13 MAC fa:16:3e:4f:b3:d0, vlan 1925, spoof checking off, link-state auto, trust on
vf 14 MAC fa:16:3e:56:b6:4a, vlan 1923, spoof checking off, link-state auto, trust on
vf 15 MAC 02:f1:f1:04:01:03, vlan 1938, spoof checking off, link-state auto, trust on
you can do 1 to 1 mapping and identify which is the vf you are interested in. Assume its vf 15.
第 3 步 - 转到目录 /。
# cd 15/stats
第 4 步 - 执行 ls 和 cat 所有文件,除了 tx_spoofed
# ls -lrt
total 0
-r--r--r-- 1 root root 4096 Jan 9 21:40 tx_errors
-r--r--r-- 1 root root 4096 Jan 9 21:40 rx_packets
-r--r--r-- 1 root root 4096 Jan 9 21:40 tx_dropped
-r--r--r-- 1 root root 4096 Jan 9 21:40 tx_spoofed
-r--r--r-- 1 root root 4096 Jan 9 21:40 tx_packets
-r--r--r-- 1 root root 4096 Jan 9 21:40 rx_bytes
-r--r--r-- 1 root root 4096 Jan 9 21:40 rx_dropped
-r--r--r-- 1 root root 4096 Jan 9 21:40 tx_bytes
# tail *
==> rx_bytes <==
108786154191
==> rx_dropped <==
0
==> rx_packets <==
975217621
==> tx_bytes <==
433665695588
==> tx_dropped <==
0
==> tx_errors <==
0
==> tx_packets <==
590997020
# tail *
==> rx_bytes <==
108786397727
==> rx_dropped <==
0
==> rx_packets <==
975220967
==> tx_bytes <==
433665771018
==> tx_dropped <==
0
==> tx_errors <==
0
==> tx_packets <==
590998121
这些是您的柜台。
BR//桑吉夫·特瓦里
当您在主机上启用 VF 时,VF 最初绑定到主机内核网络驱动程序模块,因此将显示为 ethNN,让您查询统计信息。然后,当您使用 PCI 设备分配将 VF 连接到客户机时,VF 与主机内核驱动程序解除绑定,因此 ethNNN 设备在主机中消失。因此不可能查询主机中该 VF 的网络统计信息。
实现此目的的唯一方法是不使用 PCI 设备分配,而是在直接模式下使用 MACVTAP 将 VF 与来宾关联。这虽然不如使用 PCI 分配那么高性能,但由于 virtio-net 设计,它仍然相当不错,并且可以让您看到主机中的 NIC 来监控流量。
您可以通过以下方式从主机查看 VF 计数器:
ip -s link show <pnic>
例如,我执行
ip -s link show ens1f0
并看到与 VF 22
对应的输出:
vf 22 link/ether 56:b8:7a:ed:41:e1 brd ff:ff:ff:ff:ff:ff, vlan 30, spoof checking off, link-state auto, trust on
RX: bytes packets mcast bcast dropped
30540 206 4 3 0
TX: bytes packets dropped
29082 213 0
以 JSON 形式获取这些值的一个好方法是:
ip -j -s link | jq '.[] | select(.ifname == "ens1f0") | .vfinfo_list[] | select(.vf==22)'