使用 DPDK 驱动程序在 Ubuntu 接口上设置 MTU?

使用 DPDK 驱动程序在 Ubuntu 接口上设置 MTU?

嗨,OVS 网络专家,

我是一名开发人员,正在测试一款新的客户端/服务器应用程序,该应用程序将来必须通过 OVS 网络运行。一位同事用一台备用的 Ubuntu 主机(版本 16.04.2 LTS)为我构建了一个工作测试平台。我的测试客户端和服务器机器连接到 Ubuntu,在主机内,它们的流量通过 OVS 桥接器传输。(OVS 版本 2.12.1,DPDK 版本 18.11.2)您可以这样看待测试平台:

在此处输入图片描述

我对 Ubuntu 和 OVS 了解一点,但我的同事做了一些事情,Ubuntu 的物理接口(eno1eno2) 连接到 OVS 桥上的逻辑接口 (dpdk1dpdk2)当时,我记得他告诉我,他会“在物理接口上安装 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,所以我想eno1eno2仍然具有 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

浏览此页来了解您的系统如何(错误地)处理接口。

相关内容