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 网卡才为连同状态,此时主机与虚拟机之间、虚拟机与虚拟机之间可以相互连通。一旦拔出网线,网卡就为断开状态,无法相互通信。
如何在不插网线的情况下使用?
1
yanqiyu 2022-01-17 22:02:49 +08:00 via Android
虽然这个需求很奇怪,这样虚拟机交换性能就收到网卡限制了,我猜想办法做 nocopy 的话整体性能会更好
回到 |
2
yanqiyu 2022-01-17 22:03:41 +08:00 via Android
回到正题 文章 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 状态 |
3
yanqiyu 2022-01-17 22:06:44 +08:00 via Android
还是想吐槽,占不占 host CPU 不是重点,整个系统 CPU 不管是谁的都是这个机器的 CPU 时间,这么折腾虚拟机都要走一边物理网卡收发包的流程,包拷来拷去性能怎么也不会好(猜测,搞错了欢迎指出)
|
4
flynaj 2022-01-17 23:23:22 +08:00 via Android
虚拟机通讯直接走虚拟网卡。virtio 性能最好。10g 的速度也没有什么瓶颈。
|
5
RatioPattern 2022-01-17 23:26:06 +08:00
专业!以前一直以为 virtio 就是“透传”
|
6
jim9606 2022-01-18 04:05:06 +08:00
SRIOV 网卡也没有以太网交换功能啊。就算它可以,数据得在 PCIe 总线上来回传一趟,怎么也快不过软件网桥的内存 copy 吧?
|
7
mayli 2022-01-18 04:32:21 +08:00 via Android
@jim9606 我也是有这个疑问 你这虚拟机之间包交换还需要一个 switch 吧,只传 vf 没啥用吧。
Virtio 基本上已经是内存速度了,除非 vf 有啥 dma 黑科技降低 cpu 负载。 我是没大搞懂你这个操作。 |
8
ryd994 2022-01-18 05:44:00 +08:00 via Android 1
@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 都可以做到线速。 |
9
defunct9 2022-01-18 06:21:18 +08:00 via iPhone
不插网线,那你怎么登录物理机呢,直接显示器键盘鼠标么
|
11
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 ,应该就能强制启用端口了。 |
12
yanqiyu 2022-01-18 07:44:31 +08:00 via Android
|
13
zhangsanfeng2012 2022-01-18 07:51:54 +08:00 via Android
sriov 网卡 vf 和物理机是隔离的吧,需要外接 switch
|
14
lolizeppelin 2022-01-18 10:28:30 +08:00
再开一个网卡啊
开一个 sr-iov 再开一个 virtio 不行么非要一个网卡折腾自己 |
15
thtznet 2022-01-18 11:53:29 +08:00
建议直接走 virtio 虚拟网卡,性能最强。
|
16
hefish 2022-01-18 14:35:38 +08:00
我怎么觉着这是舍近求远。就跟以前有人说网卡插多了,会占用 cpu 一样。。
|
17
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 有这么高吗? |
18
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 就没啥问题
|
19
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 ,或者网口上接个交换机 |
20
geekvcn 2022-01-18 17:46:21 +08:00
sriov 可以理解为高级虚拟化版 macvlan ,macvlan 之间互联也是需要走内部网桥或者外部交换机的
|
21
C0reFast 2022-01-18 22:01:03 +08:00
SR-IOV 的话,主机侧也是可以加载 VF 网卡的驱动的,然后给主机侧的 VF 也配置相同的 vlan ,配置和虚拟机相同网段的 IP 就直接可以和虚拟机通信。
|
24
tempdban 2022-01-19 06:35:43 +08:00 via Android
插不插线还有一个很大的区别,就是 pf 的工作状态,简单的来说 就是在不插线的情况,你要手动把 pf 的状态置为 on: ifconfig eth0 up
82599 控制器的线卡 太久我记不清了 但是大概率是能成的。 如果你用的是 x710 x722 xl710(40g) 这些控制器 100%可以搞。 你如果是搞到了 cx3... 这个卡很难用,出什么问题都不奇怪… |
25
tempdban 2022-01-19 06:38:38 +08:00 via Android
我现在就是拿 cx5 的 vf 做虚拟机连通。
另外 ip 命令,内核,网卡固件版本一定要新,对你配置 vf 有很大帮助。 |
27
levinit 2022-01-19 08:29:03 +08:00 via iPhone
你说的这种需求是不同物理机上的虚拟机网络通信才有意义吧
|