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

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

经过一些研究英特尔 SR-IOV,我意识到没有方便的方法来获得心室颤动反击而心室颤动接口正在连接到虚拟机(例如QEMU/KVM虚拟机Libvirt经理)。此外,我没有找到任何不方便的方法,因为一旦虚拟机正在创建主持人并且它在配置上绑定到一些心室颤动接口(这是 SRI-OV VF 的主要用例),接口将自动与主持人并附于虚拟机(我认为这是故意的,以便允许通过绕过内核或其他东西),实际上我还没有找到找到计数器的方法心室颤动附件中使用的虚拟机主持人(我使用的是 Ubuntu 16.04,我曾尝试在 VF 端口上寻找计数器,ethtool -S在 PF 接口上也一样,但无济于事),这些计数器在各种情况下可能非常有用。如果有人有处理此类问题的经验,那将非常有帮助斯里奥夫能否阐明这个问题并告诉我我错了,还有一个简单的方法。
谢谢!

更新:. 其实我发现这ethtool -S可能有用,它让你看到发送/接收网卡的队列计数器,我发现心室颤动函数驱动程序 ixgbevf 使用一对不同的发送/接收每个队列心室颤动。而且它们是按升序分配的,因此可能可以进行映射。但不幸的是,这是一个丑陋且依赖驱动程序的解决方案。

答案1

不幸的是,你没有错,SR-IOV 的整个想法是它允许虚拟机直接与 NIC 交互,而无需中间的虚拟机管理程序或主机。它不会看到数据包来生成计数器,你不会使用 ethtool 或常规方式获得任何东西。你也许能够从 NIC 的根目录中获得一些东西,但这取决于你使用的驱动程序等。

答案2

我已经在 Ubuntu 上测试了此解决方案,在 openstack 安装中启用 SRIOV 的计算上运行。获取 PF 的单个 VF 计数器的步骤。物理 NIC (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 link show 的输出

## 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

您可以进行 1 对 1 映射并确定您感兴趣的 vf。假设它的 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// Sanjeev Tewari

答案3

您可以使用以下命令从主机查看 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)'

相关内容