LVS转发后端丢包:MTU限制与解决策略

需积分: 36 5 下载量 159 浏览量 更新于2024-07-18 收藏 824KB PDF 举报
在使用LVS (Linux Virtual Server) 结合Keepalived实现高可用性和负载均衡的场景下,遇到了一个重要的网络问题:当LVS转发到后端的网络包长度超过MTU (Maximum Transmission Unit,最大传输单元) 限制时,会产生丢包,并返回ICMP (Internet Control Message Protocol) 需要分片的报文。这是因为RHEL6.3内核的LVS组件与网络gro/gso (Generic Receive Offload/Generic Segmentation Offload) 机制配合时存在缺陷,当数据包长度超过MTU阈值(通常是1500字节),LVS会尝试聚合多个小包,但这种聚合可能导致转发后的包体过大,超出MTU限制,LVS默认策略是直接丢弃。 问题的具体表现为在某个北京电信通服务器上传文件时,出现了显著的延迟。经过排查,虽然应用层未发现明显异常,但在LVS服务器上观察到了数据包长度超过MTU的情况,LVS发送了ICMP需要分片的消息。而在客户端,收到ICMP消息后需要一段时间才能重新传输,且接收端对序列号相同但长度不同的数据包进行了合并,合并后的包长度超过了MTU,导致问题出现。 解决这个问题的途径有两个方向:首先,可以尝试优化客户端对ICMP分片请求的响应速度,尽管Linux服务器响应迅速,但Windows服务器的表现不稳定。其次,从根源上禁止LVS对数据包的自动合并,这可以通过调整LVS配置或使用其他方法来实现,以避免发送ICMP分片请求,减少丢包和延迟。 在Wireshark抓包分析中,设置好相对序列号选项有助于更准确地追踪问题数据包。解决这个问题需要深入理解LVS的工作原理,以及如何配置网络参数以适应特定的应用场景和网络环境,确保数据传输的稳定性和效率。同时,针对不同操作系统的行为差异,可能需要针对性的优化措施。