在实施 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 网络的虚拟机通信异常。
下面列出了两种 MTU 测试方法:
- Underlay 测试法:在 ESXi 和 Edge 底层测试 TEP 网络;
- Overlay 测试法:在 VM 中模拟正常访问,测试报文是否能被正常接收,如果能被正常接收则表示底层 TEP 网络正常。
项目实施时根据喜好使用其中一种测试方法进行测试即可。
Underlay 测试方法
为了结果的准确性,建议对所有 ESXi 到 ESXi,ESXi 到 Edge 的 TEP 进行大包测试。
通过 vmkping 测试 ESXi 到 ESXi,ESXi 到 Edge 的 MTU 是否正常
通过 SSH 登陆任意一台安装好 NSX 的 ESXi,运行下列命令:
参数说明:
- ++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,执行下列命令进行测试:
Overlay 测试方法
Overlay 测试法是直接在虚拟机中 Ping 大包来模拟正常访问,看 Ping 包是否会被丢弃。
为了结果的准确性,建议进行虚拟机到虚拟机,以及外部 PC 到虚拟机的访问测试。
Windows 系统 Ping 命令格式
- -f :表示不分片;
- -l :是小写的 L,表示包的大小,进行 Overlay 测试时,包大小需要设置为 1472;
- Destination-IP:目标虚拟机或者 PC 的 IP 地址。
Linux 系统 Ping 命令格式
- -s :表示 ICMP 包大小;
- -M do :表示不分片;
- Destination-IP:目标虚拟机或者 PC 的 IP 地址。
MacOS 系统 Ping 命令格式
- -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(普通接口和聚合口通用):
三层 VLAN 接口 MTU:
三层物理接口 MTU:
华三交换机
二层接口 MTU(普通接口和聚合口通用):
三层 VLAN 接口 MTU:
注意:在某些软件版本下,需要通过 ip mtu 1600 来调整三层接口 MTU。
思科交换机(C4506/C2906/C3560/C3750 等老型号交换机)
全局配置二层接口的 MTU(FastEthernet):
全局配置二层接口的 MTU(GigabitEthernet):
全局配置三层 VLAN 接口 MTU:
配置指定三层 VLAN 接口的 MTU:
思科交换机(Nexus 3k/5k 等)
通过 QoS 策略全局调整二层接口的 MTU:
配置三层 VLAN 接口的 MTU:
配置三层物理接口的 MTU:
思科交换机(Nexus 7k/9k 等)
Nexus 7k/9k 不仅支持通过 QoS 策略全局调整 MTU,也支持为部分接口配置 MTU。
通过 QoS 策略全局调整二层接口的 MTU:
配置部分二层接口的 MTU:
配置三层 VLAN 接口的 MTU:
配置三层物理接口的 MTU:
思科交换机(Nexus 2k)
Nexus 2k 的 MTU 一般需要在父交换机上进行配置,部分父交换机支持在 FPC 口下配置 MTU,部分交换机则需要通过 network-qos 配置 MTU。
Per-Port Fabric Port Channel (FPC) 配置:
通过 network-qos 配置 MTU:
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,不要手动修改这个值,保持默认即可。
写在最后
一般在实施虚拟化项目时,建议将硬件网络和虚拟网络的 MTU 都调整为最大,比如一般交换机最大支持 9216,虚拟交换机最大支持 9000,vmkernel 最大支持 9000。调大 MTU 可以显著提高 vMotion、vSAN 等网络的性能,原因是传输同等大小的数据,更大的 MTU 会产生更少的 IP 包,TCP/IP 封装/解封装的开销更少,系统处理的中断也会更少。
部分很老的交换机更改 MTU 后需要重启设备或者端口才能生效,一般新生产的交换机都支持在线更改 MTU,更改 MTU 不会对网络造成影响。现在国内很多交换机出厂就会开启 Jumbo Frame,这应该也是迎合最终用户的需求做出的优化。