嗨,OVS 网络专家,
我是一名开发人员,正在测试一款新的客户端/服务器应用程序,该应用程序将来必须通过 OVS 网络运行。一位同事用一台备用的 Ubuntu 主机(版本 16.04.2 LTS)为我构建了一个工作测试平台。我的测试客户端和服务器机器连接到 Ubuntu,在主机内,它们的流量通过 OVS 桥接器传输。(OVS 版本 2.12.1,DPDK 版本 18.11.2)您可以这样看待测试平台:
我对 Ubuntu 和 OVS 了解一点,但我的同事做了一些事情,Ubuntu 的物理接口(eno1和eno2) 连接到 OVS 桥上的逻辑接口 (dpdk1和dpdk2)当时,我记得他告诉我,他会“在物理接口上安装 DPDK 驱动程序。“我的笔记告诉我他使用了以下命令:
/usr/local/share/dpdk/tools/dpdk_nic_bind.py -u 01:00.0
/usr/local/share/dpdk/tools/dpdk_nic_bind.py -u 01:00.1
/usr/local/share/dpdk/tools/dpdk_nic_bind.py -b igb_uio 01:00.1
/usr/local/share/dpdk/tools/dpdk_nic_bind.py -b igb_uio 01:00.0
ovs-vsctl add-port OVS_Bridge dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.0
ovs-vsctl add-port OVS_Bridge dpdk2 -- set Interface dpdk2 type=dpdk options:dpdk-devargs=0000:01:00.1
一切都很顺利。我的客户端和服务器主机能够很好地相互通信。
但后来,我的同事离开了公司。
之后,我得到了一个新的测试要求,即我的客户端和服务器必须通过发送巨型数据包(即大于 1518 字节的数据包)进行通信。我可以在我的测试主机上设置数据包大小,没问题。但是当它们通过 Ubuntu 发送流量时,流量会分片为 1518 字节。通过在 Ubuntu 内部使用虚拟主机,我知道问题不在于 OVS 桥接器。我猜瓶颈是两个物理接口。
默认情况下,Ubuntu 接口的 MTU 为 1500 字节。当我的同事为我设置此环境时,我们从未使用过 MTU,所以我想eno1和eno2仍然具有 1500 的 MTU。但不幸的是,接口不再出现在输出中ifconfig
。
如果这些接口正在运行 DPDK 驱动程序,有人知道如何检查当前 MTU 吗?如果是这样,我可以将该 MTU 设置为 9000 吗?谢谢!
更新@heynnema...
me@linux:~# tracepath 168.161.114.120
1?: [LOCALHOST] pmtu 1500
1: 168.161.114.100 2999.544ms !H
Resume: pmtu 1500
root@upce-superl1:~#
@heynnema 的第二次更新:
“ovs-vsctl list-ports PDH_bridge2” 被删减,以显示我关心的两个端口。“sudo lshw -C bridge” 完全没有删减,因为我不知道这里有什么相关性。
但是……我相当确定 OVS 桥接器不是瓶颈。当我启动两个虚拟机并使用 iPerf 在它们之间传输流量时,大于 1500 字节的数据包没有问题。但是,当我通过连接到 OVS 桥接器端口 dpdk1 和 dpdk2 的两个物理接口传输流量时,我的大数据包会碎片化。我希望找到一种方法,在物理接口与 DPDK 驱动程序绑定后设置它们的 MTU。谢谢。
met@linux:~# ovs-vsctl list-ports PDH_bridge2
dpdk1
dpdk2
met@linux:~#
met@linux:~#
met@linux:~#
met@linux:~# sudo lshw -C bridge
*-pci:0
description: Host bridge
product: Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2
vendor: Intel Corporation
physical id: 100
bus info: pci@0000:00:00.0
version: 01
width: 32 bits
clock: 33MHz
*-pci:0
description: PCI bridge
product: Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1
vendor: Intel Corporation
physical id: 1
bus info: pci@0000:00:01.0
version: 01
width: 32 bits
clock: 33MHz
capabilities: pci msi pciexpress pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:25 ioport:6000(size=4096) memory:90000000-903fffff ioport:c7a00000(size=5242880)
*-pci:1
description: PCI bridge
product: Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2
vendor: Intel Corporation
physical id: 2
bus info: pci@0000:00:02.0
version: 01
width: 32 bits
clock: 33MHz
capabilities: pci msi pciexpress pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:27 ioport:5000(size=4096) memory:90400000-90afffff
*-pci:2
description: PCI bridge
product: Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3
vendor: Intel Corporation
physical id: 3
bus info: pci@0000:00:03.0
version: 01
width: 32 bits
clock: 33MHz
capabilities: pci msi pciexpress pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:29
*-pci:3
description: PCI bridge
product: C610/X99 series chipset PCI Express Root Port #1
vendor: Intel Corporation
physical id: 1c
bus info: pci@0000:00:1c.0
version: d5
width: 32 bits
clock: 33MHz
capabilities: pci pciexpress msi pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:30
*-pci:4
description: PCI bridge
product: C610/X99 series chipset PCI Express Root Port #5
vendor: Intel Corporation
physical id: 1c.4
bus info: pci@0000:00:1c.4
version: d5
width: 32 bits
clock: 33MHz
capabilities: pci pciexpress msi pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:31 ioport:4000(size=4096) memory:c6000000-c70fffff
*-pci
description: PCI bridge
product: AST1150 PCI-to-PCI Bridge
vendor: ASPEED Technology, Inc.
physical id: 0
bus info: pci@0000:05:00.0
version: 03
width: 32 bits
clock: 33MHz
capabilities: pci msi pm pciexpress normal_decode bus_master cap_list
resources: ioport:4000(size=4096) memory:c6000000-c70fffff
*-isa
description: ISA bridge
product: C610/X99 series chipset LPC Controller
vendor: Intel Corporation
physical id: 1f
bus info: pci@0000:00:1f.0
version: 05
width: 32 bits
clock: 33MHz
capabilities: isa bus_master cap_list
configuration: driver=lpc_ich latency=0
resources: irq:0
*-pci:1
description: PCI bridge
product: Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3
vendor: Intel Corporation
physical id: 3
bus info: pci@0000:80:03.0
version: 01
width: 32 bits
clock: 33MHz
capabilities: pci msi pciexpress pm normal_decode bus_master cap_list
configuration: driver=pcieport
resources: irq:33 memory:fba00000-fbefffff ioport:c8000000(size=1048576)
met@linux:~#
met@linux:~#
答案1
这不是一个简洁的答案,但您可能需要的所有信息都在这里......
来源:http://docs.openvswitch.org/en/latest/topics/dpdk/jumbo-frames/
另请阅读:https://software.intel.com/en-us/articles/jumbo-frames-in-open-vswitch-with-dpdk
备忘单:https://therandomsecurityguy.com/openvswitch-cheat-sheet/
巨型帧
2.6.0 版本中的新功能。
默认情况下,DPDK 端口配置为标准以太网 MTU(1500B)。要为 DPDK 端口启用巨型帧支持,请将接口的 mtu_request 属性更改为足够大的值。例如,要添加 MTU 为 9000 的 DPDK 物理端口,请运行:
$ ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk \
options:dpdk-devargs=0000:01:00.0 mtu_request=9000
相似地,更改现有端口的 MTU到 6200,运行:
$ ovs-vsctl set Interface dpdk-p0 mtu_request=6200
要利用 vHost User 端口的巨型帧,需要进行一些额外的配置:
必须为 vHost User 端口启用可合并缓冲区,如下面的 QEMU 命令行代码片段所示:
-netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=on
当 virtio 设备在客户机环境中绑定到 Linux 内核驱动程序时(即接口未绑定到客户机内的 DPDK 驱动程序),这些逻辑网络接口的 MTU 也必须增加到足够大的值。这可以避免客户机中收到的巨型帧被分段。请注意,“MTU”仅指 IP 数据包的长度,而不是整个帧的长度。
要计算标准 IPv4 帧的准确 MTU,请从支持的最大帧大小中减去 L2 标头和 CRC 长度(即 18B)。因此,要为 9018B 巨型帧设置 MTU:
$ ip link set eth1 mtu 9000
当启用巨型帧时,DPDK 端口的 mbuf 段的大小会增加,以便特定大小的完整巨型帧可以容纳在单个 mbuf 段中。
巨型帧支持已针对 9728B 帧进行了验证,这是使用 DPDK i40e 驱动程序的 Fortville NIC 支持的最大帧大小,但可能支持更大的帧和其他 DPDK NIC 驱动程序。这些情况通常适用于仅涉及东西向流量的用例。
更新#1:
你大概需要某物相似的对此... 虽然没有保证,因为我不是任何类型的 OVS 专家...
sudo ovs-vsctl set Interface dpdk1 mtu_request=9000
sudo ovs-vsctl set Interface dpdk2 mtu_request=9000
sudo ip link set en01 mtu 9000
sudo ip link set en02 mtu 9000
答案2
首先,阅读man ip;man ip-link
您可以使用以下方式查看 MTU 值:
ip link | grep -E 'mtu [0-9]+'
上面显示了系统所知的所有接口的 MTU。
并且您可以使用 更改 MTU ip link set
,如man
页面中所述。
如果您的接口没有出现在ip link
命令中,
您可以通过 详细观察系统如何发现其硬件/软件环境sudo journalctl -b 0
。
浏览此页来了解您的系统如何(错误地)处理接口。