如何将两个 docker 容器连接到 openvswitch+DPDK
How to connect two docker containers to openvswitch+DPDK
我正在尝试使用连接到 ubuntu 18.04(VMWare 工作站)上的 OVS(openvswitch)和 DPDK 的 Iperf3(任何吞吐量测试器应用程序)测试两个 docker 容器之间的吞吐量。这样做的目的是比较 OVS-DPDK 与 Linux 内核在某些情况下的性能。
我找不到合适的解决方案,它解释了如何将 OVS+DPDK 连接到 docker 容器,以便容器可以相互传递 TCP/UDP 流量。
非常感谢您帮助解释如何使用 OVS+DPDK 连接两个 docker 容器。 docker容器中需要做的配置,宿主机中需要做的配置OS.
顺便说一句,我没有来自外部的流量。
谢谢
编辑
- 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 绑定到 DPDK:sudo dpdk-devbind --bind=vfio-pci ens33
。虽然我不需要这一步,因为如果我不绑定我的 NIC,我就没有来自外部的流量,但 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 的回答,考虑到我的要求,这些步骤将不起作用。
[编辑:更新以反映仅在容器上使用 OVS-DPDK 和 iperf3]
有多种方法可以连接 2 dockers 使用 运行 iperf3 直接相互交谈。
- 像 TAP-1 这样的虚拟接口|MAC-VETH-1 来自 Docker-1 连接到 TAP-2| MAC-VETH-2 通过 Linux 桥。
- 虚拟端口 1 (TAP|memif) 从 OVS-DPDK 到 Docker-1,虚拟端口 2 (tap|memif) 通过 DPDK-OVS 到 Docker-2
对于方案2,需要将TAP 接口添加到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.whosebug.com/rooms/231963/ovs-dpdk,@MohammadSiavashi
- Iperf3 需要内核或用户空间网络堆栈。
- 在Linuxdocker中,可以使用内核栈来实现。
- DPDK-OVS 只会绕过 Linux 内核桥。
- 因此,最简单的替代方法是使用 TAP 接口注入回内核 dockers。
- 用户空间网络堆栈和 iperf3 有一个替代方案(如答案中共享),完全基于 DPDK。
- OVS-DPDK 对于当前测试不是强制性的,因为可以 运行
testpmd, l2fwd, skeleton
而不是 运行ing OVS-DPDK。
- 总是可以使用用户空间网络堆栈而不是内核网络堆栈。
当前协议:
- Dockers 运行 在主机上并使用由命名空间和组分叉的内核堆栈
- 根据目前的理解,@MohammadSiavashi 将尝试
TAP PMD based OVS-DPDK
和 alternate to userspace iperf3
。
我正在尝试使用连接到 ubuntu 18.04(VMWare 工作站)上的 OVS(openvswitch)和 DPDK 的 Iperf3(任何吞吐量测试器应用程序)测试两个 docker 容器之间的吞吐量。这样做的目的是比较 OVS-DPDK 与 Linux 内核在某些情况下的性能。
我找不到合适的解决方案,它解释了如何将 OVS+DPDK 连接到 docker 容器,以便容器可以相互传递 TCP/UDP 流量。
非常感谢您帮助解释如何使用 OVS+DPDK 连接两个 docker 容器。 docker容器中需要做的配置,宿主机中需要做的配置OS.
顺便说一句,我没有来自外部的流量。
谢谢
编辑
- 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 绑定到 DPDK:
sudo dpdk-devbind --bind=vfio-pci ens33
。虽然我不需要这一步,因为如果我不绑定我的 NIC,我就没有来自外部的流量,但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 的回答,考虑到我的要求,这些步骤将不起作用。
[编辑:更新以反映仅在容器上使用 OVS-DPDK 和 iperf3]
有多种方法可以连接 2 dockers 使用 运行 iperf3 直接相互交谈。
- 像 TAP-1 这样的虚拟接口|MAC-VETH-1 来自 Docker-1 连接到 TAP-2| MAC-VETH-2 通过 Linux 桥。
- 虚拟端口 1 (TAP|memif) 从 OVS-DPDK 到 Docker-1,虚拟端口 2 (tap|memif) 通过 DPDK-OVS 到 Docker-2
对于方案2,需要将TAP 接口添加到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.whosebug.com/rooms/231963/ovs-dpdk,@MohammadSiavashi
- Iperf3 需要内核或用户空间网络堆栈。
- 在Linuxdocker中,可以使用内核栈来实现。
- DPDK-OVS 只会绕过 Linux 内核桥。
- 因此,最简单的替代方法是使用 TAP 接口注入回内核 dockers。
- 用户空间网络堆栈和 iperf3 有一个替代方案(如答案中共享),完全基于 DPDK。
- OVS-DPDK 对于当前测试不是强制性的,因为可以 运行
testpmd, l2fwd, skeleton
而不是 运行ing OVS-DPDK。 - 总是可以使用用户空间网络堆栈而不是内核网络堆栈。
当前协议:
- Dockers 运行 在主机上并使用由命名空间和组分叉的内核堆栈
- 根据目前的理解,@MohammadSiavashi 将尝试
TAP PMD based OVS-DPDK
和alternate to userspace iperf3
。