获取 SR-IOV 虚拟功能计数器

问题描述 投票:0回答:3

假设我在具有 2 个虚拟功能的主机上启用了 SR-IOV passthrough,我正在使用 libvirt 运行两个 QEMU/KVM VM,每个虚拟机分别连接到一个 VF,有什么方法可以看到 host 上的 VF 计数器(例如 rx/tx pkts)?
我尝试使用

ethtool -S
查看统计数据,但只能看到物理功能的全局计数器。
我找到了 OpenStack Ceilometer 的 SR-IOV 计数器插件,但它是 Mellanox 插件,并在来宾虚拟机上使用专有驱动程序。
任何帮助将不胜感激。

intel qemu kvm libvirt nic
3个回答
1
投票

我已经在 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//桑吉夫·特瓦里


1
投票

当您在主机上启用 VF 时,VF 最初绑定到主机内核网络驱动程序模块,因此将显示为 ethNN,让您查询统计信息。然后,当您使用 PCI 设备分配将 VF 连接到客户机时,VF 与主机内核驱动程序解除绑定,因此 ethNNN 设备在主机中消失。因此不可能查询主机中该 VF 的网络统计信息。

实现此目的的唯一方法是不使用 PCI 设备分配,而是在直接模式下使用 MACVTAP 将 VF 与来宾关联。这虽然不如使用 PCI 分配那么高性能,但由于 virtio-net 设计,它仍然相当不错,并且可以让您看到主机中的 NIC 来监控流量。


0
投票

您可以通过以下方式从主机查看 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)'
© www.soinside.com 2019 - 2024. All rights reserved.