V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
einsdisp
V2EX  ›  程序员

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

  •  
  •   einsdisp · 2022-01-17 21:49:52 +08:00 · 6907 次点击
    这是一个创建于 801 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 网卡才为连同状态,此时主机与虚拟机之间、虚拟机与虚拟机之间可以相互连通。一旦拔出网线,网卡就为断开状态,无法相互通信。

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

    27 条回复    2022-01-19 08:29:03 +08:00
    yanqiyu
        1
    yanqiyu  
       2022-01-17 22:02:49 +08:00 via Android
    虽然这个需求很奇怪,这样虚拟机交换性能就收到网卡限制了,我猜想办法做 nocopy 的话整体性能会更好
    回到
    yanqiyu
        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 状态
    yanqiyu
        3
    yanqiyu  
       2022-01-17 22:06:44 +08:00 via Android
    还是想吐槽,占不占 host CPU 不是重点,整个系统 CPU 不管是谁的都是这个机器的 CPU 时间,这么折腾虚拟机都要走一边物理网卡收发包的流程,包拷来拷去性能怎么也不会好(猜测,搞错了欢迎指出)
    flynaj
        4
    flynaj  
       2022-01-17 23:23:22 +08:00 via Android
    虚拟机通讯直接走虚拟网卡。virtio 性能最好。10g 的速度也没有什么瓶颈。
    RatioPattern
        5
    RatioPattern  
       2022-01-17 23:26:06 +08:00
    专业!以前一直以为 virtio 就是“透传”
    jim9606
        6
    jim9606  
       2022-01-18 04:05:06 +08:00
    SRIOV 网卡也没有以太网交换功能啊。就算它可以,数据得在 PCIe 总线上来回传一趟,怎么也快不过软件网桥的内存 copy 吧?
    mayli
        7
    mayli  
       2022-01-18 04:32:21 +08:00 via Android
    @jim9606 我也是有这个疑问 你这虚拟机之间包交换还需要一个 switch 吧,只传 vf 没啥用吧。
    Virtio 基本上已经是内存速度了,除非 vf 有啥 dma 黑科技降低 cpu 负载。
    我是没大搞懂你这个操作。
    ryd994
        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 都可以做到线速。
    defunct9
        9
    defunct9  
       2022-01-18 06:21:18 +08:00 via iPhone
    不插网线,那你怎么登录物理机呢,直接显示器键盘鼠标么
    msg7086
        10
    msg7086  
       2022-01-18 06:27:14 +08:00
    @defunct9 人家测试的是 PCIe 独立网卡内部互联。网线可以插在主板集成网卡上。
    msg7086
        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 ,应该就能强制启用端口了。
    yanqiyu
        12
    yanqiyu  
       2022-01-18 07:44:31 +08:00 via Android
    @jim9606 #6 有的网卡是可以的,毕竟对于外面的交换机,这个口来的包不会回到这个口,要是网卡不做交换的话,vf 之间,vf ,pf 之间就够用不了了


    @mayli 同上
    zhangsanfeng2012
        13
    zhangsanfeng2012  
       2022-01-18 07:51:54 +08:00 via Android
    sriov 网卡 vf 和物理机是隔离的吧,需要外接 switch
    lolizeppelin
        14
    lolizeppelin  
       2022-01-18 10:28:30 +08:00
    再开一个网卡啊
    开一个 sr-iov 再开一个 virtio 不行么非要一个网卡折腾自己
    thtznet
        15
    thtznet  
       2022-01-18 11:53:29 +08:00
    建议直接走 virtio 虚拟网卡,性能最强。
    hefish
        16
    hefish  
       2022-01-18 14:35:38 +08:00
    我怎么觉着这是舍近求远。就跟以前有人说网卡插多了,会占用 cpu 一样。。
    FabricPath
        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 有这么高吗?
    FabricPath
        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 就没啥问题
    geekvcn
        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 ,或者网口上接个交换机
    geekvcn
        20
    geekvcn  
       2022-01-18 17:46:21 +08:00
    sriov 可以理解为高级虚拟化版 macvlan ,macvlan 之间互联也是需要走内部网桥或者外部交换机的
    C0reFast
        21
    C0reFast  
       2022-01-18 22:01:03 +08:00
    SR-IOV 的话,主机侧也是可以加载 VF 网卡的驱动的,然后给主机侧的 VF 也配置相同的 vlan ,配置和虚拟机相同网段的 IP 就直接可以和虚拟机通信。
    msg7086
        22
    msg7086  
       2022-01-18 23:43:56 +08:00 via Android
    @geekvcn 但凡把上面的回复看一下也不至于这么说……
    tempdban
        23
    tempdban  
       2022-01-19 06:22:42 +08:00 via Android
    @geekvcn 你这理解一看就是搞 docker
    tempdban
        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... 这个卡很难用,出什么问题都不奇怪…
    tempdban
        25
    tempdban  
       2022-01-19 06:38:38 +08:00 via Android
    我现在就是拿 cx5 的 vf 做虚拟机连通。
    另外 ip 命令,内核,网卡固件版本一定要新,对你配置 vf 有很大帮助。
    tempdban
        26
    tempdban  
       2022-01-19 06:40:30 +08:00 via Android
    @yanqiyu 用 vf 反倒是比 virtio 省了一次拷贝
    levinit
        27
    levinit  
       2022-01-19 08:29:03 +08:00 via iPhone
    你说的这种需求是不同物理机上的虚拟机网络通信才有意义吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   957 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:32 · PVG 04:32 · LAX 13:32 · JFK 16:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.