记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优

记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优

原创 国文 三七互娱技术团队
 
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 ,使配置生效

posted @ 2024-08-11 19:24  技术颜良  阅读(49)  评论(0)    收藏  举报