大量TCP连接滞留TIME_WAIT、SYN_SENT、CLOSE_WAIT状态的分析
文章目录
- 一、统计各类状态的tcp连接数量
- 二、TIME_WAIT
- 应用服务器上,来自反向代理的连接
- 反向代理上,访问应用服务的连接
- 反向代理上,来自用户的连接
- 三、SYN_SENT
- 反向代理上,访问位于防火墙另一侧的目标
- 反向代理上,访问无防火墙阻断的目标
- 四、CLOSE_WAIT
- 应用服务器上,来自反向代理的连接
本文记录在nginx、tomcat服务器上一些处理异常TCP连接的方案
一、统计各类状态的tcp连接数量
ss、netstat两个工具都能统计:
ss -ant | awk '{print $1}' | sort | uniq -cnetstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
二、TIME_WAIT
应用服务器上,来自反向代理的连接
原因:从nginx发起的请求,申明的是http 1.0版本的协议(或者请求头的Connection字段指是Close),则tomcat响应完请求后会主动断开tcp连接
方案:nginx http_proxy模块的proxy_http_version配置默认使用http 1.0协议访问upstream实例,需要修改为1.1
proxy_connect_timeout 3s;
proxy_http_version 1.1;
# 通知客户端,连接保持60s;服务端实际在75s后才会主动关闭连接;
# 如果不设置第二个参数来返回空闲长连接的超时建议,有的客户端不会利用http连接池来长期保持空闲连接
keepalive_timeout 75s 60s;
# 要与请求端保持http1.1通讯,就不能关闭chunked机制;
# 否则nginx会在完成响应后主动关闭与请求端的tcp连接,相当于退化为http1.0协议
chunked_transfer_encoding on;upstream myapp {# nginx与upstream服务器之间的空闲长连接数量(默认最多保持60s)keepalive 20;server 10.0.0.1:8080;server 10.0.0.2:8080;
}server {listen 80 default;location / {proxy_pass http://myapp;# 请求头指定HTTP 1.1协议,并且Connection不为Close时,# 对方完成响应后才不会主动断开TCP连接proxy_http_version 1.1;proxy_set_header Connection '';proxy_set_header Cookie $http_cookie;proxy_set_header Host $host;proxy_set_header X-Forwarded-For ${proxy_add_x_forwarded_for};}
}
反向代理上,访问应用服务的连接
原因:nginx使用http 1.1协议访问upstream实例后,如果未开启空闲连接复用机制,就会主动关闭tcp连接
方案:nginx upstream模块的keepalive配置默认未开启,需要主动提供一个数值
反向代理上,来自用户的连接
原因1:在请求端(浏览器、http请求框架)默认开启连接池并使用http 1.1协议的情况下,如果nginx关闭了http 1.1协议的chunked_transfer_encoding机制,那么在完成请求后,nginx会主动断开与请求端的连接
方案:不要关闭chunked_transfer_encoding
原因2:未返回建议客户端保持连接的时长(response header里的Keep-Alive: timeout=time),导致用户的客户端迟迟不断开空闲连接,最终由nginx来主动断开连接,把TIME_WAIT留在了nginx服务器上
方案:keepalive_timeout配置最长空闲时间和建议客户端保持连接的时长,让客户端知道应该在什么时间之前关闭空闲连接
三、SYN_SENT
反向代理上,访问位于防火墙另一侧的目标
原因:telnet目标端口时,命令阻塞(未立即得到目标未开通此端口的响应),证明SYN包被防火墙drop了
方案:申请防火墙策略
反向代理上,访问无防火墙阻断的目标
原因1:目标tomcat服务器已接收(springboot应用的server.tomcat.max-connections配置,默认10000)的http连接数量、在服务端口排队等待accept(操作系统的net.core.somaxconn配置,默认128或1024)的tcp socket数量,都达到上限后,后续到达服务端口的SYN包会被丢弃,请求端的连接状态保持为SYN_SENT
方案:在使用webflux、websocket等响应式IO框架时,可调大server.tomcat.max-connections配置
原因2:telnet目标端口时,命令阻塞(未立即得到目标未开通此端口的响应),证明目标服务器上使用iptables对访问服务端口的请求进行了DROP处理
方案:使用iptables规则把请求方IP加入放行名单
原因3:应用服务的进程已处理的文件句柄(包含tcp socket)数量超过限额
# 查看当前用户下单进程的文件句柄限额
ulimit -n
方案:编辑/etc/security/limits.conf文件,重启应用服务进程
四、CLOSE_WAIT
应用服务器上,来自反向代理的连接
原因:应用程序开了端口,但是后续初始化失败(比如没有成功连接配置中心、服务注册中心、数据库等原因),accept socket的逻辑没运行起来;
已建立的请求放在服务端口待accept的backlog(操作系统的net.core.somaxconn配置)里,收到的请求内容放在操作系统tcp buffer里;
迟迟得不到应用程序处理并响应后,客户端发出FIN指令,服务端响应ACK后,服务端连接进入CLOSE_WAIT状态,由于tcp buffer里的数据没有被处理,所以服务端没有继续回复FIN,连接以CLOSE_WAIT状态滞留在服务端口待accept的backlog里;
在backlog塞满之前,应用服务端口实际处于可以连接但是不能响应的假死状态
方案:对部署的应用进行readyness定时探测,及时发现未成功初始化的应用
相关文章:

大量TCP连接滞留TIME_WAIT、SYN_SENT、CLOSE_WAIT状态的分析
文章目录 一、统计各类状态的tcp连接数量二、TIME_WAIT应用服务器上,来自反向代理的连接反向代理上,访问应用服务的连接反向代理上,来自用户的连接 三、SYN_SENT反向代理上,访问位于防火墙另一侧的目标反向代理上,访问…...

kotlin怎么定义类
在Kotlin中,你可以使用class关键字来定义一个类。以下是一个简单的例子: class MyClass {// class body} 这个例子定义了一个名为MyClass的类。你可以在类体中定义属性和方法。 如果你想定义一个带有属性的类,你可以这样做: cla…...

如何查看数据集下载后保存的绝对路径?
1.问题 当我们下载torchvision.datasets里面的数据集时,有时候会遇到找不到数据集保存路径的问题。 2.解决 引入os库 import os调用如下方法 os.path.abspath(数据集对象.root)以下面代码为例 import os import torchvision.datasets as datasets# 指定数据集…...

使用php实现微信登录其实并不难,可以简单地分为三步进行
使用php实现微信登录其实并不难,可以简单地分为三步进行。 第一步:用户同意授权,获取code //微信登录public function wxlogin(){$appid "";$secret "";$str"http://***.***.com/getToken";$redirect_uriu…...

【LeetCode-中等题】24. 两两交换链表中的节点
文章目录 题目方法一:递归方法二:三指针迭代 题目 方法一:递归 图解: 详细版 public ListNode swapPairs(ListNode head) {/*递归法:宗旨就是紧紧抓住原来的函数究竟返回的是什么?作用是什么即可其余的细枝末节不要细究,编译器…...

5.10 汇编语言:汇编过程与结构
过程的实现离不开堆栈的应用,堆栈是一种后进先出(LIFO)的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。 栈是由CPU管…...

【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表
统计参与通信的服务器【LC1267】 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请你统…...

深度解读零信任身份安全—— 全面身份化:零信任安全的基石
事实上,无论是零信任安全在数据中心的实践,还是通用的零信任安全架构实践,全面身份化都是至关重要的,是“企业边界正在瓦解,基于边界的安全防护体系正在失效”这一大背景下,构筑全新的零信任身份安全架构的…...

音视频 ffmpeg命令提取音视频数据
保留封装格式 ffmpeg -i test.mp4 -acodec copy -vn audio.mp4 ffmpeg -i test.mp4 -vcodec copy -an video.mp4提取视频 保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264 强制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h2…...

vscode 配置
vscode 配置 安装插件 Better C SyntaxC/CCMake、CMake Tools 、CMake Language SupportDoxygen Documentation GeneratorGit Graphhighlight-wordsPythonvscode-iconsClang-Format和clangdtyporahex editor .vscode 中的文件 在 VS Code 中,.vscode 文件夹是用于…...

企业数字化管控平台及信息化治理体系建设方案(附300份方案)
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除,更多浏览公众号:智慧方案文库 数字化校园整体解决方案.doc150页6万字数字化智能工厂信息化系统集成整合规划建设方案.docx2022年采购数字化市场研究报告…...

ABB PCD231B通信输入/输出模块
多通道输入和输出: PCD231B 模块通常配备多个输入通道和输出通道,用于连接传感器、执行器和其他设备。 通信接口: 这种模块通常支持各种通信接口,如以太网、串口(RS-232、RS-485)、Profibus、CAN 等&#…...

在springboot项目中显示Services面板的方法
文章目录 前言方法一:Alt8快捷键方法二:使用Component标签总结 前言 在一个springboot项目中,通过开启Services面板,可以快速的启动、配置、管理多个子项目。 方法一:Alt8快捷键 1、在idea界面输入Alt8,在…...

spring之AOP简介
1.AOP简介 什么是AOP Aspect Oriented Program面向切面编程在不改变原有逻辑上增加额外的功能,比如解决系统层面的问题,或者增加新的功能 场景 权限控制缓存日志处理事务控制 AOP思想把功能分两个部分,分离系统中的各种关注点 核心关注点&a…...

ros::init用途用法
文章目录 用途:用法:ros::init 是 ROS(Robot Operating System)中的一个重要函数,它用于初始化 ROS 节点。在启动任何 ROS 节点之前,都必须首先调用这个函数。以下是其用途和基本用法。 用途: 节点初始化:为ROS系统中的节点进行初始化。一个节点是ROS计算图中的一个可…...

逻辑回归的含义
参考:线性回归 & 逻辑回归 问题 1、线性回归(Linear Regression)和逻辑回归(Logistic Regression)有什么联系? 2、逻辑回归的“逻辑”、“回归是什么意思”? 回答1 线性回归假设因变量…...

解决Apache Tomcat “Request header is too large“ 异常
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

腾讯音乐如何基于大模型 + OLAP 构建智能数据服务平台
本文导读: 当前,大语言模型的应用正在全球范围内引发新一轮的技术革命与商业浪潮。腾讯音乐作为中国领先在线音乐娱乐平台,利用庞大用户群与多元场景的优势,持续探索大模型赛道的多元应用。本文将详细介绍腾讯音乐如何基于 Apach…...

Java 16进制字符串转换成GBK字符串
问题: 现在已知有一个16进制字符串 435550D3C3D3DAD4DABDBBD2D7CFECD3A6CFFBCFA2D6D0B4E6B7C5D5DBBFDBD0C5CFA2A3ACD5DBBFDBBDF0B6EE3130302E3036 而且知道这串的字符串对应的内容是: CUP用于在交易响应消息中存放折扣信息,折扣金额100.06 但…...

【ES6】JavaScript中的Symbol
Symbol是JavaScript中的一种特殊的、不可变的、不可枚举的数据类型。它通常用于表示一个唯一的标识符,可以作为对象的属性键,确保对象的属性键的唯一性和不可变性。 Symbol.for()是Symbol的一个方法,它用于创建一个已经注册的Symbol对象。当…...

理解React页面渲染原理,如何优化React性能?
React JSX转换成真实DOM过程 当使用React编写应用程序时,可以使用JSX语法来描述用户界面的结构。JSX是一种类似于HTML的语法,但实际上它是一种JavaScript的扩展,用于定义React元素。React元素描述了我们想要在界面上看到的内容和结构。 在运…...

数据通信——传输层TCP(可靠传输机制的滑动窗口)
引言 之前提到过拥塞问题,如果大量数据疯狂涌入,接收端无法及时处理就会导致数据丢包,从而使得通信受到干扰。之前的连续ARQ如果不加以节制,疯狂发送报文,接收端无法及时返回ACK就会导致网络瘫痪。 滑动窗口机制协议 这…...

Mycat之前世今生
如果我有一个32核心的服务器,我就可以实现1个亿的数据分片,我有32核心的服务器么?没有,所以我至今无法实现1个亿的数据分片。——MyCAT ‘s Plan 话说“每一个成功的男人背后都有一个女人”,自然MyCAT也逃脱不了这个诅…...

Linux- 重定向标准输出(stdout)和标准错误(stderr)
在Linux或Unix系统中,可以通过重定向标准输出(stdout)和标准错误(stderr)来将脚本的输出保存到一个文件中。以下是一些方法: 只重定向标准输出到文件: ./your_script.sh > output.txt这将只捕…...

PostgreSQL分区表
什么是分区表 数据库分区表将表数据分成更小的物理分片,以此提高性能、可用性、易管理性。分区表是关系型数据库中比较常见的对大表的优化方式,数据库管理系统一般都提供了分区管理,而业务可以直接访问分区表而不需要调整业务架构,…...

android framework之Applicataion启动流程分析(二)
上一篇讲了Zygote是如何收到启动Application的启动消息,并一步步进入Fork(),下面来分析zygote fork启动application后,application进程后续处理操作,是如何真正的启动的。 ZygoteInit.main():-->...caller ZygoteServer.runSelectLoop()…...

django静态文件无法访问解决方案
nginx配置如下: # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/user nginx; worker_processes auto; error_log /var/log/ng…...

WIndows 配置多版本python环境,非常清晰明了
配置多个python环境 下面以配置三个python版本环境为例子 首先下载好三个环境的python,如:python2.7、python3.6、python3.10 给个官网链接自己下,想要几版本就下几:https://www.python.org/downloads/windows/ 下载完成后将pyth…...

Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)
目录 1267. 统计参与通信的服务器 题目描述: 实现代码与解析: 写法一:两次遍历 hash 原理思路: 写法二:三次遍历 原理思路: 1267. 统计参与通信的服务器 题目描述: 这里有一幅服务器分…...

c++(8.28)菱形继承,虚继承,多态,抽象类,模板+Xmind
xmind: 作业: 1.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴…...