在实施 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 网络的虚拟机通信异常。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM5gzM2YTOhlTOiZWO5MDZyYzXzITMxMTM3EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
下面列出了两种 MTU 测试方法:
- Underlay 测试法:在 ESXi 和 Edge 底层测试 TEP 网络;
- Overlay 测试法:在 VM 中模拟正常访问,测试报文是否能被正常接收,如果能被正常接收则表示底层 TEP 网络正常。
项目实施时根据喜好使用其中一种测试方法进行测试即可。
Underlay 测试方法
为了结果的准确性,建议对所有 ESXi 到 ESXi,ESXi 到 Edge 的 TEP 进行大包测试。
通过 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 的下列位置获得:
通过 vmkping 测试 Edge 到 Edge,Edge 到 ESXi 的 MTU 是否正常
通过 Console 或者 SSH 登陆任意 Edge 节点。运行 get logical-router,查看 TUNNEL 对应的 VRF ID,一般都为 0。
运行 vrf 0 进入 Tunnel vrf,执行下列命令进行测试:
ping <Destination-TEP-IP> size 1570 dfbit enable
Overlay 测试方法
Overlay 测试法是直接在虚拟机中 Ping 大包来模拟正常访问,看 Ping 包是否会被丢弃。
为了结果的准确性,建议进行虚拟机到虚拟机,以及外部 PC 到虚拟机的访问测试。
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(下图所有红色线对应的接口):
如果 TEP 分散在多个网段,则所有相关设备的二层口,以及三层 VLAN 接口均需要调整 MTU(下图所有红色线对应的接口):
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 网卡。
而此 Segment 在 vDS-DC2 中,那么修改 vDS-DC2 的 MTU 即可:
如果使用的是标准交换机,参照下图配置 MTU 即可:
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:
使用 N-VDS 不需要额外的配置,但使用 vCenter VDS 时,需要全局将 VDS MTU 调整为 1600:
4、NSX 上行链路配置文件调整 MTU
在部署 NSX-T 时会用到“上行链路配置文件”,默认 NSX-T 下所有上行链路配置文件的 MTU 均为 1600,不要手动修改这个值,保持默认即可。