gpt4 book ai didi

docker - 如何将两个docker容器连接到openvswitch+DPDK

转载 作者:行者123 更新时间:2023-12-04 07:44:42 33 4
gpt4 key购买 nike

我正在尝试使用连接到OVS(openvswitch)和ubuntu 18.04(VMWare工作站)上的DPDK的Iperf3(任何吞吐量测试器应用程序)来测试两个docker容器之间的吞吐量。这样做的目的是比较 OVS-DPDK 与 Linux 内核在某些场景下的性能。
我找不到合适的解决方案,它解释了如何将 OVS+DPDK 连接到 docker 容器,以便容器可以相互传递 TCP/UDP 流量。
感谢您帮助解释如何使用 OVS+DPDK 连接两个 docker 容器。需要在 docker 容器中完成的配置,以及需要在主机操作系统中完成的配置。
顺便说一句,我没有来自外面的交通。
谢谢
编辑

  • DPDK 版本为 20.11.0
  • OVS 版本为 2.15.90
  • Iperf3

  • 以下是我采取的步骤:
  • 我使用 apt 安装 dpdk:sudo apt install openvswitch-switch-dpdk
  • 将替代设置为:sudo update-alternatives --set OvS-vswitchd /usr/lib/openvswitch-switch -dpdk/OvS-vswitchd-dpdk
  • 分配大页面并更新 grub。
  • 挂载大页面
  • 将 NIC 绑定(bind)到 DPDK:sudo dpdk-devbind --bind=vfio-pci ens33 .虽然我不需要这一步,因为如果我不绑定(bind)我的网卡,我没有来自外部的流量 sudo service openvswitch-switch restart失败。
  • 我创建了一个桥:ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
  • 我为我的容器创建了两个端口:ovs-vsctl add-port br0 client -- set Interface client type=dpdk options:dpdk-devargs=<binded_nic_pci_addr>ovs-vsctl add-port br0 server -- set Interface server type=dpdk options:dpdk-devargs=<binded_nic_pci_addr> . (服务器端口号:1,客户端端口号:2)
  • 打开端口之间的双向流:
  • sudo ovs-ofctl del-flows br0
  • sudo ovs-ofctl add-flow br0 in_port=1,action=output:2
  • ovs-ofctl add-flow br0 in_port=2,action=output:1


  • 在第 8 步之后,我不知道如何连接我的 iperf3 docker 容器以使用这些端口。感谢您帮助我了解如何将容器连接到端口并测试网络。
    编辑 2
    根据 Vipin 的回答,考虑到我的要求,这些步骤将不起作用。

    最佳答案

    [编辑:更新以反射(reflect)仅在容器上使用 OVS-DPDK 和 iperf3]
    有多种方法可以连接 2 个 docker 以使用运行 iperf3 直接相互交谈。

  • 来自 Docker-1 的 TAP-1|MAC-VETH-1 等虚拟接口(interface)连接到 TAP-2|通过 Linux 桥接的 MAC-VETH-2。
  • 从 OVS-DPDK 到 Docker-1 的虚拟端口 1 (TAP|memif) 和通过 DPDK-OVS 到 Docker-2 的虚拟端口 2 (tap|memif)

  • 对于场景 2,需要将 TAP 接口(interface)添加到 OVS。因为最终申请 iperf3 正在使用内核堆栈进行 TCP|UDP 终止。可以使用以下设置(根据 OVS-DPDK 版本修改)来实现结果。
    sudo ./utilities/ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
    sudo ./utilities/ovs-vsctl add-port br0 myeth0 -- set Interface myeth0 type=dpdk options:dpdk-devargs=net_tap0,iface=tap0
    sudo ./utilities/ovs-vsctl add-port br0 myeth1 -- set Interface myeth1 type=dpdk options:dpdk-devargs=net_tap1,iface=tap1
    sudo ./utilities/ovs-ofctl add-flow br0 in_port=1,action=output:2
    sudo ./utilities/ovs-ofctl add-flow br0 in_port=2,action=output:1
    笔记:
  • 正如评论中提到的,我不赞成这种方法,因为 TAP PMD 破坏了绕过内核的好处(Docker1 ==> Kenrel TAP-1 ==> DPDK PMD ==> OVS ==> DPDK PMD ==> 内核 TAP2 ==> Docker2)
  • 如果需要简单检查 iperf3 性能,请使用 DPDK-iperf3 如github project做同样的事情。
  • 推荐 TAP PMD 而不是 KNI PMD 的原因是使用 2 个 CPU 内核(DPDK 线程和内核线程)tap 和 KNI 与 iperf3
  • 的速度接近 4Gbps

    [EDIT-1] 基于对话 https://chat.stackoverflow.com/rooms/231963/ovs-dpdk , @MohammadSiavashi
  • Iperf3 需要内核或用户空间网络堆栈。
  • 在 Linux docker 中,可以使用内核堆栈来实现这一点。
  • DPDK-OVS 只会绕过 Linux 内核桥。
  • 因此,最简单的替代方法是使用 TAP 接口(interface)为 docker 注入(inject)回内核。
  • 纯粹在 DPDK 上的用户空间网络堆栈和 iperf3 有一个替代方案(如答案中所共享)。
  • OVS-DPDK 对于当前测试不是强制性的,因为可以运行 testpmd, l2fwd, skeleton而不是运行 OVS-DPDK。
  • 人们总是可以使用用户空间网络堆栈而不是内核网络堆栈。

  • 当前协议(protocol):
  • Docker 在主机上运行并使用按命名空间和组划分的内核堆栈
  • 根据目前的理解,@MohammadSiavashi 将尝试 TAP PMD based OVS-DPDKalternate to userspace iperf3 .
  • 关于docker - 如何将两个docker容器连接到openvswitch+DPDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67257888/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com