34.4. 提高大量连续数据流的吞吐量
根据 IEEE 802.3 标准,没有 Virtual Local Area Network (VLAN)标签的默认以太网帧有1518 字节的最大大小。这些帧的每一个都包含一个 18 字节标头,给有效负载保留 1500 字节。因此,对于服务器通过网络传输的每个 1500 字节数据,18 字节(1.2%)以太网帧标头是开销,且也会被传输。第 3 层和 4 协议中的标头进一步增加了每个数据包的开销。
如果您网络上的主机经常发送大量连续的数据流,如备份服务器或存有大量巨大文件的文件服务器,则请考虑使用巨型帧来节省开销。巨型帧是非标准化的帧,其最大传输单位(MTU)比 1500 字节的标准以太网有效负载大小大。例如,如果您使用最大允许的 9000 字节有效负载配置 MTU 巨型帧,则每个帧的开销减少到 0.2%。
根据网络和服务,仅在网络的特定部分(如集群的存储后端)中启用巨型帧会很有帮助。这可避免数据包碎片。
34.4.1. 配置巨型帧前的注意事项
根据您网络中的硬件、应用程序和服务,巨型帧可能有不同的影响。仔细决定启用巨型帧是否能在您的场景中提供好处。
先决条件
传输路径上的所有网络设备都必须支持巨型帧,并使用相同的最大传输单元(MTU)大小。相反,您可能遇到以下问题:
- 丢弃的数据包。
- 由于碎片数据包,导致更高的延迟。
- 增加了碎片导致的数据包丢失的风险。例如,如果路由器将一个 9000 字节帧划分为六个 1500 字节帧,且任何一个 1500 字节帧丢失了,则整个帧都丢失了,因为它无法重新组装。
在下图中,如果来自网络 A 的主机向网络 C 中的一个主机发送了一个数据包,则这三个子网中的所有主机都必须使用相同的 MTU:
巨型帧的好处
- 较高的吞吐量:每个帧包含更多的用户数据,而协议开销是固定的。
- 较低的 CPU 使用率:巨型帧导致较少的中断,因此节省了 CPU 周期。
巨型帧的缺陷
- 较高的延迟:大型帧延迟后面的数据包。
- 增加了内存缓冲区使用率:大型帧可以更快地填充缓冲区队列内存。
34.4.2. 在现有 NetworkManager 连接配置文件中配置 MTU
如果您的网络需要不同于默认的最大传输单元(MTU),您可以在相应的 NetworkManager 连接配置文件中配置此设置。
巨型帧是有效负载在 1500 核 9000 字节之间的网络数据包。同一广播域中的所有设备都必须支持这些帧。
先决条件
- 广播域中的所有设备都使用相同的 MTU。
- 您知道网络的 MTU。
- 您已为具有发散 MTU 的网络配置了连接配置文件。
流程
可选:显示当前的 MTU:
# ip link show ... 3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff ...
可选:显示 NetworkManager 连接配置文件:
# nmcli connection show NAME UUID TYPE DEVICE Example f2f33f29-bb5c-3a07-9069-be72eaec3ecf ethernet enp1s0 ...
在管理到具有分散 MTU 的网络的连接的配置文件中设置 MTU :
# nmcli connection modify Example mtu 9000
重新激活连接:
# nmcli connection up Example
验证
显示 MTU 设置:
# ip link show ... 3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff ...
验证传输路径上没有主机对数据包进行碎片处理:
在接收端,显示内核的 IP 重新组装统计信息:
# nstat -az IpReasm* #kernel IpReasmTimeout 0 0.0 IpReasmReqds 0 0.0 IpReasmOKs 0 0.0 IpReasmFails 0 0.0
如果计数器返回
0
,则不会重新组装数据包。在发送端,传输一个带有 prohibit-fragmentation-bit 的 ICMP 请求:
# ping -c1 -Mdo -s 8972 destination_host
如果命令成功,则数据包没有被进行碎片处理。
按如下所示计算
-s
数据包大小选项的值:MTU 大小 - 8 字节 ICMP 标头 - 20 字节 IPv4 标头 = 数据包大小