如何优化高并发TCP链接中产生的大量的TIME_WAIT的状态(nginx)

背景

线上有一套高并发的系统经常出现访问超时、服务不可用的告警,访问链路如下:client-> nginx-> web server,所以第一时间排查了nginx服务器,这台服务器主要是做前端web和后端的反向代理。排查nginx日志时发现大量的报错
,负载均衡时无法分配请求的地址。

(99: Cannot assign requested address) while connecting to upstream  

排查问题时,发现系统存在几万多个time_wait状态连接

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

由于time_wait连接会占用本地端口,而本地默认的最大端口数是65535,所以导致了端口不够用的情况

time_wait什么是

在 TCP 连接的生命周期中,TIME_WAIT 是连接终止过程中的一个状态

TIME_WAIT 状态有两个主要目的:
1、确保最后一个 ACK 包的可靠传输
2、允许旧的重复数据包消失

如何优化

1、系统内核参数调优

vi /etc/sysctl.conf
...
# 减少 TIME_WAIT 持续时间
net.ipv4.tcp_fin_timeout = 30 
# 启用端口复用
net.ipv4.tcp_tw_reuse = 1 
# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
其他优化:

net.ipv4.ip_local_port_range = 1024 65535 增加可用端口范围,让系统拥有的更多的端口来建立链接,这里有个问题需要注意,对于这个设置系统就会从1025~65535这个范围内随机分配端口来用于连接,如果我们服务的使用端口比如8080刚好在这个范围之内,在升级服务期间,可能会出现8080端口被其他随机分配的链接给占用掉,这个原因也是文章开头提到的端口被占用的另一个原因
net.ipv4.ip_local_reserved_ports = 7005,8001-8100 针对上面的问题,我们可以设置这个参数来告诉系统给我们预留哪些端口,不可以用于自动分配。
...
#使内核参数生效
sysctl -p

2、nginx调整短链接为长链接

短连接是指SOCKET连接后发送后接收完数据后马上断开连接
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差

长连接比短连接从根本上减少了关闭连接的次数,减少了TIME_WAIT状态的产生数量,在高并发的系统中,这种方式的改动非常有效果,可以明显减少系统TIME_WAIT的数量

相关推荐

  1. 并发linux优化

    2024-06-14 15:12:03       47 阅读
  2. 如何在前端优化处理大量图像资源?

    2024-06-14 15:12:03       61 阅读
  3. 如何增加服务器并发

    2024-06-14 15:12:03       31 阅读
  4. nginx 概念、并发处理及详细参数配置

    2024-06-14 15:12:03       59 阅读
  5. Python爬虫如何处理页面相对

    2024-06-14 15:12:03       63 阅读
  6. 并发场景下httpClient使用优化技巧

    2024-06-14 15:12:03       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 15:12:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 15:12:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 15:12:03       87 阅读
  4. Python语言-面向对象

    2024-06-14 15:12:03       96 阅读

热门阅读

  1. MYSQL5.7 切换datadir数据目录

    2024-06-14 15:12:03       27 阅读
  2. SQL入门教程

    2024-06-14 15:12:03       29 阅读
  3. Oracle复习部分记录

    2024-06-14 15:12:03       26 阅读
  4. 多个服务器的用户共享同一个用户目录的做法

    2024-06-14 15:12:03       30 阅读
  5. mybatis条件判断及动态sql的简单拓展

    2024-06-14 15:12:03       23 阅读
  6. Web前端技术:深入剖析与未来展望

    2024-06-14 15:12:03       26 阅读
  7. 服务器上设置pnpm环境变量

    2024-06-14 15:12:03       21 阅读
  8. C++的封装(十三):迭代器问题

    2024-06-14 15:12:03       24 阅读