Intel 网卡开启 SR-IOV,如何作为虚拟机之间互联使用(不插网线)?

2022-01-17 21:49:52 +08:00
 einsdisp

Linux 主机,使用 KVM/Qemu/Libvirt 运行虚拟机。

为了减少对主机 CPU 的占用及其他一些原因,虚拟机的网卡不使用 QEMU 的虚拟网卡(例如 e1000e 、virtio ),而是使用物理网卡开启 SR-IOV 之后的 VF ( virtual function ) 。主机的网卡为 PF ( physical function ),每个虚拟机分配一个 VF 网卡( virtual function ) 。然后主机与虚拟机、虚拟机与虚拟机之间使用 PF 、VF 直接进行连接。

目前使用一个闲置的 PCIe 四口千兆网卡( I350-T4 )作为测试,不连接任何网线,不需要接入其他物理设备,仅仅作为主机虚拟机之间互联使用。如果测试成功,最终目标是购买一张支持 SR-IOV 的 PCIe 接口的万兆(甚至 40G )网卡,作为虚拟机之间高速互联使用。

测试发现一个严重问题,网口必须插入网线,主机中的 PF 网卡、虚拟机中的 VF 网卡才为连同状态,此时主机与虚拟机之间、虚拟机与虚拟机之间可以相互连通。一旦拔出网线,网卡就为断开状态,无法相互通信。

如何在不插网线的情况下使用?

7598 次点击
所在节点    程序员
27 条回复
yanqiyu
2022-01-17 22:02:49 +08:00
虽然这个需求很奇怪,这样虚拟机交换性能就收到网卡限制了,我猜想办法做 nocopy 的话整体性能会更好
回到
yanqiyu
2022-01-17 22:03:41 +08:00
回到正题 文章 https://access.redhat.com/solutions/2651771

提到
All the virtual functions running on a physical function have its own state.
It does not matter if the virtual function has been passed through into some VM or not.
The state is only about the link status of the virtual function.

This state can be seen and modified with the ip link set dev PF vf NUM state { auto | enable | disable} command.
Where the "PF" is the physical function device name and the NUM is the number of the virtual function running on it.

也就是说可以直接在 host 改 vf 状态
yanqiyu
2022-01-17 22:06:44 +08:00
还是想吐槽,占不占 host CPU 不是重点,整个系统 CPU 不管是谁的都是这个机器的 CPU 时间,这么折腾虚拟机都要走一边物理网卡收发包的流程,包拷来拷去性能怎么也不会好(猜测,搞错了欢迎指出)
flynaj
2022-01-17 23:23:22 +08:00
虚拟机通讯直接走虚拟网卡。virtio 性能最好。10g 的速度也没有什么瓶颈。
RatioPattern
2022-01-17 23:26:06 +08:00
专业!以前一直以为 virtio 就是“透传”
jim9606
2022-01-18 04:05:06 +08:00
SRIOV 网卡也没有以太网交换功能啊。就算它可以,数据得在 PCIe 总线上来回传一趟,怎么也快不过软件网桥的内存 copy 吧?
mayli
2022-01-18 04:32:21 +08:00
@jim9606 我也是有这个疑问 你这虚拟机之间包交换还需要一个 switch 吧,只传 vf 没啥用吧。
Virtio 基本上已经是内存速度了,除非 vf 有啥 dma 黑科技降低 cpu 负载。
我是没大搞懂你这个操作。
ryd994
2022-01-18 05:44:00 +08:00
@jim9606 sriov 的 vf 之间是有 switch 的。但是可能需要在固件里配置。可以配置成虚拟 switch 或 vepa 等多种模式。如果是商业用的话比较多见 vepa ,因为要的就是隔离。

@mayli 一定要说的话还真有。rdma 。
但是 virtio 因为完全在内存里,再加上支持超大的 jumbo frame 支持,所以配置得当的话应该还是 virtio 好。前提是 jumbo frame 要开得够大。
软件处理虚拟网络的瓶颈一般在包。因为硬件支持 tso tro ,所以通过硬件走的开销可以相当于处理最大的 jumbo frame 。

处理速度的瓶颈不是复制 payload ,这个全看内存速度。难的是 header match 。用 CPU 去 hash 然后模拟 mac 表 /路由表,这就很耗 CPU 。但是对于硬件 switch 来说完全由专用电路实现。哪怕最便宜的 switch 都可以做到线速。
defunct9
2022-01-18 06:21:18 +08:00
不插网线,那你怎么登录物理机呢,直接显示器键盘鼠标么
msg7086
2022-01-18 06:27:14 +08:00
@defunct9 人家测试的是 PCIe 独立网卡内部互联。网线可以插在主板集成网卡上。
msg7086
2022-01-18 06:51:21 +08:00
https://serverfault.com/q/985533/205688

这个讨论应该可以帮到你。

> Table 1-7. Internal Switching Features
>
> Internal switching operates independently of the state of the LAN ports (also when LAN ports are down).

如果网卡支持的话会提到这个功能。你可以找找看哪些是支持的。

至于常见的 Mellanox 卡,似乎 SR-IOV 每个 VF 的在线状态是可以定制的:
- Down - the VPort PortState remains 'Down'
- Up - if the current VPort PortState is 'Down', it is modified to 'Initialize'. In all other states, it is unmodified. The result is that the SM may bring the VPort up.
- Follow - follows the PortState of the physical port. If the PortState of the physical port is 'Active', then the VPort implements the 'Up' policy. Otherwise, the VPort PortState is 'Down'.
所以只要从 Follow 改成 Up ,应该就能强制启用端口了。
yanqiyu
2022-01-18 07:44:31 +08:00
@jim9606 #6 有的网卡是可以的,毕竟对于外面的交换机,这个口来的包不会回到这个口,要是网卡不做交换的话,vf 之间,vf ,pf 之间就够用不了了


@mayli 同上
zhangsanfeng2012
2022-01-18 07:51:54 +08:00
sriov 网卡 vf 和物理机是隔离的吧,需要外接 switch
lolizeppelin
2022-01-18 10:28:30 +08:00
再开一个网卡啊
开一个 sr-iov 再开一个 virtio 不行么非要一个网卡折腾自己
thtznet
2022-01-18 11:53:29 +08:00
建议直接走 virtio 虚拟网卡,性能最强。
hefish
2022-01-18 14:35:38 +08:00
我怎么觉着这是舍近求远。就跟以前有人说网卡插多了,会占用 cpu 一样。。
FabricPath
2022-01-18 16:42:10 +08:00
virtio 是半虚拟化,需要有 backend 的啊,host 上 CPU 那么高的 vhost-net 就是开销。
如果你真的想玩 sriov 的话,你可以买一张二手的 mellanox cx5 ,sriov 模式分 legacy (就是你目前用的这种方式),还有一种是 switchdev ,开启 switchdev 之后,每个 VF 会出现 VF+Rep 两个接口,同时在这个模式下,可以打开 hw-tc-offload ,配置 tc flower 可以直接下发到网卡,你就可以通过 tc flower 配置卡上 e-switch 去转发报文了。
此外,sriov 最重要的意义是 pci passthough ,消除了 vhost 的开销。

不过你这个环境的网络 IO 有这么高吗?
FabricPath
2022-01-18 16:45:07 +08:00
vf+rep 在不配置任何规则的情况下,用起来和 veth 一模一样,只是带方向,vf 是实体 pci 设备,可以 passthough 给 vm ,rep 是一个虚拟接口,用来处理卡上 flow miss 的报文。简单点就是 switchdev+ovs ,最新的 ovs 已经支持 flower offload ,只要不开 conntrack offload 就没啥问题
geekvcn
2022-01-18 17:38:14 +08:00
virtio 内部交换走的是 Linux 网桥,你把 VF 网卡加到网桥里就解决了,但是问题又来了,Linux 网桥的性能堪忧,既然走 Linux 网桥了 sriov 意义不大了,走外部交换机才有意义。总结下就是你想内部互联不走外部交换机,这样 sriov 的性能优势就有限了,瓶颈在 Linux 网桥,你把 VF 网卡绑定到一个网桥内就能互联了,前提是不能直通 VF 网卡,那么直接 localhost 互联不就行了,搁这原地 TP 呢

服务器都是有网络背板的,就是一个定制的交换机,现在数据中心解决内部互联也不用 sriov 了限制太多了,没钱的 DPDK+OVS ,有钱的 FPGA/ASIC 加速

建议放弃折腾,直接 virtio ,或者网口上接个交换机
geekvcn
2022-01-18 17:46:21 +08:00
sriov 可以理解为高级虚拟化版 macvlan ,macvlan 之间互联也是需要走内部网桥或者外部交换机的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/828856

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX