提示
X
本案例来自tskb,请前往tskb修改源内容:立即前往
'>

进阶排查-步骤四:确认是否为虚拟服务异常经典案例--端口复用

|

问题描述

七层虚拟服务访问慢,部分用户虚拟服务访问慢或访问不到。

有效排查步骤

虚拟服务后端数据包很容易看出来,如图:

数据包解读:
服务器主动发FIN关闭连接;AD发FIN给服务器,服务器收到FIN+ACK后,回第三个包ACK,进入了TIME_WAIT状态;AD复用源端口,给服务器发SYN准备建立新连接,但此时服务器还在TIME_WAIT状态(上一次的连接还没有完全结束)最后服务器应答了个ACK,并且ACK的数值990068585还是之前连接的,此ACK说明前一条连接还没完全结束 ;最后AD给服务器发送SYN建立新连接的数据包,没有得到对应正确ACK应答建立后续TCP连接,导致访问异常。

根因

服务器FIN主动关闭连接后,服务器上会残留大量的Timewait连接状态,AD发包端口复用,
使用相同端口的连接请求过来新建三次握手,服务器回应之前连接的ACK(time_wait机制,认为上一条连接还没断),三次握手异常,会出现连接缓慢的现象。

解决方案

导致复用的原因比较多,常见的解决方案有以下,建议尽可能的覆盖。
1、TCP策略“启用”强制关闭连接(默认启用),强制关闭连接功能可以发送RST包主动清理服务器的timewait连接。

2、虚拟服务做了SNAT场景下,建议增加SNAT池的地址数量,地址越多,出现复用的概率越小。
3、虚拟服务的调度方法改为按连接调度。当节点池有多个节点时,默认的按请求调度会拆分前端长连接为短连接,后端会频繁的建立和释放连接,容易出现端口复用。

4、调整虚拟服务的TCP策略,开启时间戳,将关闭连接后超时时间、TIME_WAIT时间都改成120秒。这种优化是为了让AD的连接保持久一点,不让五元组释放,避免快速被复用,此时虚拟服务的并发会有一定升高。



5、关闭指定虚拟服务的长连接优化:命令行下的命令是 sfcli modify slb virtual-service [虚拟服务名称] force_keep_alive disable
6、关闭全部七层长连接的优化:vi /etc/sinfor/ad/ad_limit_common.ini将optimize_keep_alive改为0,再执行/etc/init.d/ad_appd restart。这个需要重启服务生效,会短暂影响所有业务,需要业务变更窗口调整。
7、业务拓扑可以调整的情况下,可以考虑取消虚拟服务的SNAT转换功能。

建议与总结

Q:如何快速定位出是端口复用导致的?
A:分析后端数据包,在wireshark里面过即可定位,过滤命令 tcp.analysis.retransmission and tcp.flags.syn == 1  参考如下图,按照stream排序。



我要分享
文档编号: 221771
作者: admin
更新时间: 2023-06-28 15:01
适用版本: