记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优
原创 国文 三七互娱技术团队 2024年07月08日 18:00 广东 听全文 01问题现象
A云主机公网访问B云游戏服的一个接口出现偶发超时的问题。
02问题原因
经抓包定位到B云游戏服接口未响应请求报文导致,具体原因:服务端的内核参数net.ipv4.tcp_tw_recycle值都为1,表示服务端会检查每一个TCP连接报文中的时间戳(Timestamp),若Timestamp不是递增的关系( 中间经过NAT网关,很大概可能会到时间戳不是递增关系),则不会响应这个报文。
03问题处理
1、偶发超时期间,排查网络层正常。
2、确认网络访问路径,分别在四个点-部署抓包,待问题复现,即可定位到报文丢包点。
经过抓包确认请求接口超时原因为TCP建连失败:SYN请求报文到B云主机(部署游戏接口服务的主机)后被drop(根据抓包文件SYN报文重传时间间隔符合:重传时间为上一次超时时间的 2 倍):
3、考虑中间经过NAT,排查tcp_tw_recycle参数发现是启用状态
修改net.ipv4.tcp_tw_recycle=0
修改后问题解决,偶发超时问题未在出现。
备注:
TCP规范要求TIME_WAIT状态的TCP连接需等待2MSL时间。但在Linux系统中,若启用tcp_tw_recycle选项(在内核4.x已被弃用),TIME_WAIT连接则无需等待2MSL,旨在快速重用处于TIME_WAIT的TCP连接。
这可能导致新连接接收到旧连接的数据。
因此,Linux在启用tcp_tw_recycle时,会记录TIME_WAIT连接的对端信息,如IP地址和时间戳。当收到同一IP的SYN包时,会检查其时间戳是否滞后,若滞后则丢弃,以避免接收旧数据。这对大多数情况有效,但在client-server服务中,若NAT后有多个用户访问同一服务,可能因时间戳滞后导致连接丢失。
04解决方案
修改服务器主机内核参数tcp_tw_recycle:
1)、vi /etc/sysctl.conf,修改net.ipv4.tcp_tw_recycle 参数为0。
2)、执行sysctl -p ,使配置生效
标签:tw,报文,tcp,调优,TCP,Linux,recycle,超时 From: https://www.cnblogs.com/cheyunhua/p/18353781