服务器CLOSE_WAIT请求太多的问题

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 服务器CLOSE_WAIT请求太多的问题

上周因为调用某个服务不可用,导致服务器出现了大量的CLOSE_WAIT的tcp链接,导致tomcat出现了假死的情况.大量的tcp请求一直卡着,其他请求进来tomcat已经不能提供服务了.
头一次遇到这样的情况,然后查了一下这个CLOSE_WAIT的资料.发现CLOSE_WAIT其实是tcp的一种状态,我们先来看张图了解一下tcp的各个状态.

状态:
CLOSED: 没有任何连接状态,是tcp状态的起点和终点(这时候服务器啥都没干)
LISTEN: 监听来自远方的TCP端口的连接请求
SYN_SENT: 第一次收到请求的状态,由客户端发送给服务端,成功后进入到SYN_RECEIVED,失败的直接CLOSED
SYN_RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED: 三次握手完成,已经简历一个打开的连接,这个时候就可以发送数据了
FIN_WAIT_1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN_WAIT_2: 接受了远端的ACK确认之后,从等待连接中断请求
CLOSE_WAIT: 等待从本地用户发来的连接中断请求
CLOSING: 等待远程TCP对连接中断的确认
LAST_ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME_WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认

对照着客户端和服务端的状态变化来理解消化下

问题分析:

看完上面tcp的各个状态变化过程之后,应该有了一个大致的了解 ,给我们看下服务器上的tcp请求状态情况,可以使用命令

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

当时检测出来CLOSE_WAIT 大概有1000左右,这个和httpClient设置的maxConnTotal的数量查不多.

tcp请求关闭包含主动关闭和被动关闭,当服务端收到了中断的seq和ack后,就处于CLOSE_WAIT状态,
,照理说应该立马发送ack.但是处于CLOSE_WAIT说明服务端没有发送ack到客户端(其实这里实际上是远端服务端).导致这种情况的可能是
服务端忙于处理数据或者是其他操作,导致没有发出去ack命令.

我检查了发送请求的代码response等流都是正常关闭了,那么我们看下是不是其他问题导致,发现当接收到响应的时候,如果状态不是200,请求就直接返回了.大概类似于这样:

if (response.getStatusLine() == HttpStatus.SC_OK) {
 // 具体处理
}

如果不等于200的情况没有处理,修改后

if (response.getStatusLine() == HttpStatus.SC_OK) {
 // 具体处理
} else {
  httpRequest.abort();
 // 中断状态不对的请求
}

然后我们在etc/sysctl.conf加上如下三个参数:
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 1800 // 单位是秒 就是30分钟

然后sysctl -p让配置生效.

1.tcp_keepalive_time
当keepalive起用的时候,TCP发送keepalive消息的频度,就是说空闲这个时间然后去确认连接是否还在,缺省是2小时。
2.tcp_keepalive_intvl
当探测没有确认时,重新发送探测的频度。缺省是75秒。
3.tcp_keepalive_probes
在认定连接失效之前,发送多少个TCP的keepalive探测包

我只做了这两个操作就CLOSE_WAIT数量就下来了,还有其他可能性也会导致这样的情况.可以参考下面的资料

参考资料:

1.https://www.cnblogs.com/jessezeng/p/5616518.html
2.https://blog.csdn.net/shootyou/article/details/6615051

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
23 1
|
5天前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
|
2月前
|
Linux
【Linux】一条命令,转发所有请求到另一台服务器上 -高级技巧
【Linux】一条命令,转发所有请求到另一台服务器上 -高级技巧
33 0
|
8天前
|
缓存 数据安全/隐私保护 UED
代理服务器在HTTP请求中的应用:Ruby实例
代理服务器在HTTP请求中的应用:Ruby实例
|
20天前
|
存储 运维 Java
函数计算产品使用问题之如何使用Python的requests库向HTTP服务器发送GET请求
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
Shell Python
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
|
1月前
|
前端开发 JavaScript
【node写接口】 通过node 快速搭建一个服务器、get请求、post请求 小白入门
【node写接口】 通过node 快速搭建一个服务器、get请求、post请求 小白入门
52 4
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
|
2月前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
31 3
|
2月前
|
应用服务中间件
tomcat服务器get、post请求及响应中文乱码问题
tomcat服务器get、post请求及响应中文乱码问题
29 1

热门文章

最新文章