在实施 NSX-v 或者 NSX-T 的项目时,经常听到一个词:MTU,本文着重讲讲为什么 MTU 在 NSX 环境中如此重要,如何根据不同的设计来配置/验证 MTU 等等,本文适合先收藏,后转发。


本文目录如下:

上篇:

  • 如果在 NSX 环境下 MTU 设置不正确会有什么现象?
  • 如何验证 MTU 设置是否正确?
  • 在 NSX-T 环境下如何设置 MTU?

下篇:

  • 为什么 NSX 环境中 MTU 如此重要?有没有 workaround?
  • NSX 多中心架构下对于 MTU 的优化


如果 MTU 设置不正确会有什么现象?

当一个 NSX-T 环境中存在 MTU 设置问题时,会有下列现象之一:


  • 虚拟机可以 Ping 通其他虚拟机,但 SSH 失败;
  • 虚拟机可以 Ping 通其他虚拟机,部分 HTTP 访问正常,部分 HTTP 访问会显示一直加载页面;
  • 虚拟机和其他虚拟机通信均正常,但是和外部 PC SSH 通信时有问题;
  • 通过 Iperf 打流,发现带宽远低于物理链路的带宽,比如带宽为 10G,但 Iperf 测试下来只有几百 mbps;
  • 多台虚拟机在同一台宿主机上运行,相互间所有通信正常;而跨主机通信时 SSH/HTTP 等服务异常;
  • 如果临时将虚拟机网卡的 MTU 由默认的 1500 改为 1400,则所有通信恢复正常。


如何验证 MTU 设置是否正确?

在 NSX 环境中会存在两层网络,一层是物理交换机、服务器、vSphere 组成的承载网络(Underlay),另一层是 NSX、vSphere、Edge 节点构成的虚拟网络(Overlay)。两层网络中都有 MTU 相关的配置,任意一层配置不对都可能造成使用 Overlay 网络的虚拟机通信异常。

关于 NSX-T 下的 MTU(上)_NSX

下面列出了两种 MTU 测试方法:

  • Underlay 测试法:在 ESXi 和 Edge 底层测试 TEP 网络
  • Overlay 测试法:在 VM 中模拟正常访问,测试报文是否能被正常接收,如果能被正常接收则表示底层 TEP 网络正常。

项目实施时根据喜好使用其中一种测试方法进行测试即可。


Underlay 测试方法​

为了结果的准确性,建议对所有 ESXi 到 ESXi,ESXi 到 Edge 的 TEP 进行大包测试。

关于 NSX-T 下的 MTU(上)_网络虚拟化_02

通过 vmkping 测试 ESXi 到 ESXi,ESXi 到 Edge 的 MTU 是否正常

通过 SSH 登陆任意一台安装好 NSX 的 ESXi,运行下列命令:

vmkping ++netstack=vxlan -d -s 1570 <Destination-TEP-IP>

参数说明:

  • ++netstack=vxlan:使用 vxlan TCP/IP 堆栈;
  • -d :不进行报文的切片;
  • -s 1570:发送的 ICMP 包载荷大小。ICMP 包头默认 8 bytes,IPv4 包头默认 20 bytes,于是发出的 IP 包大小等于 1598,刚好小于 NSX 要求的 1600,实际最大能发送的包为 1572 bytes,1570 只是为了方便记忆;
  • <Destination-TEP-IP>:其他 ESXi 主机/Edge 节点的 TEP 地址。

ESXi 或者 Edge 节点的 TEP 地址可以在 NSX Manager 的下列位置获得:

关于 NSX-T 下的 MTU(上)_网络虚拟化_03

关于 NSX-T 下的 MTU(上)_NSX_04


通过 vmkping 测试 Edge 到 Edge,Edge 到 ESXi 的 MTU 是否正常

通过 Console 或者 SSH 登陆任意 Edge 节点。运行 get logical-router,查看 TUNNEL 对应的 VRF ID,一般都为 0。

关于 NSX-T 下的 MTU(上)_NSX-T_05

运行 vrf 0 进入 Tunnel vrf,执行下列命令进行测试:

ping <Destination-TEP-IP> size 1570 dfbit enable

关于 NSX-T 下的 MTU(上)_NSX-T_06


Overlay 测试方法

Overlay 测试法是直接在虚拟机中 Ping 大包来模拟正常访问,看 Ping 包是否会被丢弃。

为了结果的准确性,建议进行虚拟机到虚拟机,以及外部 PC 到虚拟机的访问测试。

关于 NSX-T 下的 MTU(上)_VMware_07

Windows 系统 Ping 命令格式

ping -f -l 1472 <Destination-IP>
  • -f :表示不分片;
  • -l :是小写的 L,表示包的大小,进行 Overlay 测试时,包大小需要设置为 1472;
  • Destination-IP:目标虚拟机或者 PC 的 IP 地址。


Linux 系统 Ping 命令格式

ping -M do -s 1472 <Destination-IP>
  • -s :表示 ICMP 包大小;
  • -M do :表示不分片;
  • Destination-IP:目标虚拟机或者 PC 的 IP 地址。


MacOS 系统 Ping 命令格式

ping -s 1472 -D <Destination-IP>
  • -s :表示 ICMP 包大小;
  • -D :表示不分片;
  • Destination-IP:目标虚拟机或者 PC 的 IP 地址。


在 NSX-T 环境下如何设置 MTU?

以下面两张图为例,在一个 NSX-T 环境中,所有 TEP 到 TEP 沿途的设备(包括物理交换机、虚拟交换机等)均需要将 MTU 调整为 ≥ 1600。

如果所有 TEP 在同网段,则所有相关设备的二层口需要调整 MTU(下图所有红色线对应的接口):

关于 NSX-T 下的 MTU(上)_NSX_08


如果 TEP 分散在多个网段,则所有相关设备的二层口,以及三层 VLAN 接口均需要调整 MTU(下图所有红色线对应的接口):

关于 NSX-T 下的 MTU(上)_NSX_09


1、物理交换机调整 MTU

不同厂家,不同型号的交换机配置 MTU 的方法差别很大,建议在配置 MTU 时优先参考产品的配置手册。

笔者总结了一些常见设备的配置方法,供参考。


华为交换机

二层接口 MTU(普通接口和聚合口通用):

<HUAWEI> system-view
[HUAWEI] interface gigabitethernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] jumboframe enable 5000

三层 VLAN 接口 MTU:

[HUAWEI] interface Vlanif 100
[HUAWEI-Vlanif100] mtu 1600

三层物理接口 MTU:

[HUAWEI] interface gigabitethernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] undo portswitch
[HUAWEI-GigabitEthernet0/0/1] mtu 1600


华三交换机

二层接口 MTU(普通接口和聚合口通用):

interface G1/1
jumboframe enable 600

三层 VLAN 接口 MTU:

interface Vlanif 100
mtu 1600

注意:在某些软件版本下,需要通过 ip mtu 1600 来调整三层接口 MTU。


思科交换机(C4506/C2906/C3560/C3750 等老型号交换机)

全局配置二层接口的 MTU(FastEthernet):

system mtu 1600

全局配置二层接口的 MTU(GigabitEthernet):

system mtu jumbo 1600

全局配置三层 VLAN 接口 MTU:

system mtu routing 1600

配置指定三层 VLAN 接口的 MTU:

interface vlan 100 
mtu 1600


思科交换机(Nexus 3k/5k 等)

通过 QoS 策略全局调整二层接口的 MTU:

policy-map type network-qos jumbo
class type network-qos class-default
mtu 9216
system qos
service-policy type network-qos jumbo

配置三层 VLAN 接口的 MTU:

Switch(config)#interface vlan 1
Switch(config-if)#mtu 9216

配置三层物理接口的 MTU:

Switch(config)#interface ethernet 1/1
Switch(config-if)#no switchport
Switch(config-if)#mtu 9216


思科交换机(Nexus 7k/9k 等)

Nexus 7k/9k 不仅支持通过 QoS 策略全局调整 MTU,也支持为部分接口配置 MTU。

通过 QoS 策略全局调整二层接口的 MTU:

policy-map type network-qos jumbo
class type network-qos class-default
mtu 9216
system qos
service-policy type network-qos jumbo

配置部分二层接口的 MTU:

Switch(config)#interface ethernet 1/1
Switch(config-if)#mtu 9216

配置三层 VLAN 接口的 MTU:

Switch(config)#interface vlan 1
Switch(config-if)#mtu 9216

配置三层物理接口的 MTU:

Switch(config)#interface ethernet 1/1
Switch(config-if)#no switchport
Switch(config-if)#mtu 9216


思科交换机(Nexus 2k)

Nexus 2k 的 MTU 一般需要在父交换机上进行配置,部分父交换机支持在 FPC 口下配置 MTU,部分交换机则需要通过 network-qos 配置 MTU。

Per-Port Fabric Port Channel (FPC) 配置:

interface port-channel136
switchport mode fex-fabric
fex associate 136
vpc 136
mtu 9216

通过 network-qos 配置 MTU:

policy-map type network-qos jumbo
class type network-qos class-default
mtu 9216
system qos
service-policy type network-qos jumbo


2、修改 Edge VM 所使用 vSS/vDS 的 MTU

如果环境中使用虚拟机版本的 Edge 节点,那就需要将 Edge 节点 TEP 使用的虚拟交换机 MTU 调大。

比如在我的环境中使用 seg-vlan2-edge-vtep 这个 NSX VLAN Segment 作为 Edge VM 的 TEP 网卡。

关于 NSX-T 下的 MTU(上)_NSX_10

而此 Segment 在 vDS-DC2 中,那么修改 vDS-DC2 的 MTU 即可:

关于 NSX-T 下的 MTU(上)_网络虚拟化_11

关于 NSX-T 下的 MTU(上)_VMware_12

如果使用的是标准交换机,参照下图配置 MTU 即可:

关于 NSX-T 下的 MTU(上)_MTU_13


3、(NSX-T 3.0 之后)修改 VDS 的 MTU

在 NSX-T 3.0 之前,所有安装了 NSX 的 ESXi 只能使用 N-VDS(可以简单理解为 NSX 管理的 VDS),而在 3.0+vSphere7.0 之后,ESXi 既可以使用 N-VDS,也可以使用 vCenter VDS:

关于 NSX-T 下的 MTU(上)_网络虚拟化_14

使用 N-VDS 不需要额外的配置,但使用 vCenter VDS 时,需要全局将 VDS MTU 调整为 1600:

关于 NSX-T 下的 MTU(上)_VMware_15

关于 NSX-T 下的 MTU(上)_NSX_16


4、NSX 上行链路配置文件调整 MTU

在部署 NSX-T 时会用到“上行链路配置文件”,默认 NSX-T 下所有上行链路配置文件的 MTU 均为 1600,不要手动修改这个值,保持默认即可。

关于 NSX-T 下的 MTU(上)_VMware_17


写在最后

一般在实施虚拟化项目时,建议将硬件网络和虚拟网络的 MTU 都调整为最大,比如一般交换机最大支持 9216,虚拟交换机最大支持 9000,vmkernel 最大支持 9000。调大 MTU 可以显著提高 vMotion、vSAN 等网络的性能,原因是传输同等大小的数据,更大的 MTU 会产生更少的 IP 包,TCP/IP 封装/解封装的开销更少,系统处理的中断也会更少。

部分很老的交换机更改 MTU 后需要重启设备或者端口才能生效,一般新生产的交换机都支持在线更改 MTU,更改 MTU 不会对网络造成影响。现在国内很多交换机出厂就会开启 Jumbo Frame,这应该也是迎合最终用户的需求做出的优化。