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

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

时间:2024-08-11 19:28:34浏览次数:10  
标签:tw 报文 tcp 调优 TCP Linux recycle 超时

记一次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

相关文章

  • 9 - Linux进程和计划任务管理
    目录一、进程1.程序和进程的关系2.查看进程信息2.1ps命令-查看进程信息2.2top命令-查看进程的动态信息2.3pgrep命令-查找进程信息2.4jobs命令-查看后台进程状态信息3.进程的启动方式4.进程的前后台调度5.中止进程的运行5.1Ctrl+C组合键5.2kill......
  • linux配制iscsi
    服务端centos7假定已经装好了两块磁盘/dev/sdb,/dev/sdcyuminstall-ytargetdtargetclitargetcli进入配制命令行通过/dev/sdb,/dev/sdc创建两个block/backstores/blockcreateidisk1/dev/sdb/backstores/blockcreateidisk2/dev/sdc创建一个iscsi服务iscsi/creat......
  • Linux 上 Conda 环境安装与配置超详细教程
    在数据分析、机器学习和科学计算等领域,Conda是一个非常流行的包管理和环境管理系统。它可以帮助你轻松地安装和管理Python、R以及其他语言的软件包,并且能够方便地创建隔离的工作环境。本文将为你详细介绍如何在Linux系统上安装和配置Conda环境。准备工作在开始之前,请确保你......
  • Linux:线程同步机制(互斥锁、读写锁、条件变量、信号量详细分析总结)
    目录速览1、互斥锁(1)What(什么是互斥锁)(2)Why(互斥锁的用途)(3)How(如何使用互斥锁)(4)代码实践2、读写锁(1)What(什么是读写锁)(2)Why(读写锁的作用)(3)How(如何使用读写锁)(4)读写锁的特征3、条件变量(1)What(什么是条件变量)(2)Why(条件变量的作用)(3)How(如何使用条件变量实现线程......
  • JetBrains IntelliJ IDEA 2024.2 (macOS, Linux, Windows) - 领先的 Java 和 Kotlin I
    JetBrainsIntelliJIDEA2024.2(macOS,Linux,Windows)-领先的Java和KotlinIDE请访问原文链接:https://sysin.org/blog/jetbrains-idea/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsIntelliJIDEA-领先的Java和KotlinIDE使开发更高效、更......
  • Linux文件操作函数仿写cat命令,diff命令,cp命令
    #include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>intmain(intargc,constchar*argv[]){ printf("参数个数=%d\n",argc); if(2>argc) ......
  • 旧物利用 - 将机顶盒改造为一台Linux开发机!
    前言家里的机顶盒淘汰下来,博主想要物尽其用,看看是否能将其改造为一台Ubuntu"开发机",故开始倒腾准备工作机顶盒型号:移动魔百盒CM201-2(CH),芯片组:hi3798mv300(hi3798mv3dmm),其他型号类似理论上适用于以下SOC的机顶盒:Hi3798Mv100/Hi3798Cv200/Hi3798Mv200/Hi3798Mv3001.......
  • Linux 下利用 Valgrind 进行内存调试
    目录一、概述二、Valgrind的使用1、基本格式2、Valgrind工具集3、Memcheck3.1使用未初始化的内存3.2内存泄漏3.3在内存被释放后进行读/写3.4内存块的尾部进行读/写4、常见错误三、分析内存泄漏的使用技巧1、Valgrind协调GDB工作2、利用/proc定位问题3、使用......
  • Linux 错误码
    目录一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror一、概述在Linux系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0表示成功,正数表示警告或其他非致命错误。为了开发者更好地处理系统错误,内核中预定义的......
  • Linux解决频繁的sudo权限认证
    1.在进行一些软件包的安装时,经常性的需要输入密码以进行sudo权限执行。默认的sudo命令可以维持5分钟时间,这个时间是可以设置的。2.使用vi打开/etc/sudoers配置文件,(修改需要有权限,可以看下面第四点)。3.按i进入编辑状态,修改%admin该行代码,修改后按esc退出编辑状态,输入:wq,以保存退......