消息队列一直建立tcp连接_云架构那些事儿:为什么我的TCP连接建立异常?
搞IT的同学无论是做开发的、做测试的、做运维的一定都遇到过以下几种报错,导致服务调用失败:
connection timeout
read timeout
connection reset by peer
都是服务调用失败,但是有3种报错信息,到底有什么差别呢?
本文将给大家分享以上错误异常出现的一种可能性,希望对你理解TCP连接、解决系统问题有所帮助。
首先我们来看一下正常的TCP连接交互:
正常通信场景
如果你对TCP建立连接三次握手的流程可能有所了解,那么你对SYN,SYN-ACK,ACK,SYN_SENT,SYN_RECV,ESTABLISH一定并不陌生,但其中SYN Queue和Accept Queue你可能没有见过。这正是本文要讲的重点。
SYN Queue:接收TCP SYN连接的队列,由操作系统参数 tcp_max_syn_backlog 控制,如果处于SYN_RECV的数量超过tcp_max_syn_backlog的值,则操作系统将直接抛弃客户端发出的SYN。
客户端由于未收到服务端返回的SYN-ACK,将在客户端配置的系统参数tcp_syn_retries次数后,放弃建立该TCP链接,客户端侧的报错即:connection timeout
过程如下:
SYN Queue满的场景
Accept Queue:在完成SYN,SYN-ACK,ACK后,连接将进入accept queue,直到服务端将调用accept()后即开始正常处理后续的数据包请求。该值将在操作系统的somaxconn参数及该应用程序自身的backlog参数最小值决定,即min(somaxconn,backlog),请注意,这里的backlog并不是操作系统参数 tcp_max_syn_backlog。
如果Accept Queue由于应用程序性能不足或配置不当导致用满了,则根据操作系统参数tcp_abort_on_overflow来进行处理,下图为tcp_abort_on_overflow为默认值0时的返回情况,即操作系统将直接抛弃ACK,相当于服务端没有收到该ACK,但客户端会并不知道,认为三次握手已经完成,所以会发送业务数据包PSH,ACK,可惜的是从服务端的角度看,三次握手其实并没有真正完成,且由于最后一次握手的ACK相当于没有收到,因此会再次发送SYN-ACK给客户端(发送次数由tcp_synack_retries决定)。客户端将再次发送第三次握手的ACK给服务端,多次尝试后,客户端超时,将报错:read timeout。
Accept Queue满的场景1
如果Accept Queue满了,且系统参数tcp_abort_on_overflow=1,则操作系统将直接返回RST给客户端,客户端将报错:connection reset by peer。
Accept Queue满的场景2
查看端口的accept queue队列最大值:
ss -nlt
找到对应服务端口的Send-Q列值,即accept queue队列的最大值。
查看端口的accept queue队列当前值:
ss -tonp
找到对应服务端口的Send-Q列值,即accept queue队列的当前值。
总结:
对于小并发的场景,类似报错基本上都是服务端应用程序自身问题,导致的没有办法及时处理连接/业务请求。
对于高并发的场景,如果应用程序自身并不是瓶颈,就要考虑增加参数看是否可以避免这些问题了,
如增加系统参数 tcp_max_syn_backlog 的值来让系统可以同时接受更多SYN连接;
增加系统参数 somaxconn 的值增加accept队列的长度,当然同时要考虑增加应用的backlog参数,这里列三个比较常用的应用backlog设置方法
Tomcat:server.xml acceptcount=100
Redis:redis.conf tcp-backlog 511
Nginx:listen backlog=511
消息队列一直建立tcp连接_云架构那些事儿:为什么我的TCP连接建立异常?相关推荐
- 基于消息队列 RocketMQ 的大型分布式应用上云较佳实践
作者|绍舒 审核&校对:岁月.佳佳 编辑&排版:雯燕 前言 消息队列是分布式互联网架构的重要基础设施,在以下场景都有着重要的应用: 应用解耦 削峰填谷 异步通知 分布式事务 大数据处理 ...
- 基于消息队列 RocketMQ 的大型分布式应用上云最佳实践
简介:Apache RocketMQ 作为阿里巴巴开源的支撑万亿级数据洪峰的分布式消息中间件,在众多行业广泛应用.在选型过程中,开发者一定会关注开源版与商业版的业务价值对比. 那么,今天就围绕着商业版 ...
- 基于消息队列 RocketMQ 的大型分布式应用上云实践
简介: Apache RocketMQ 作为阿里巴巴开源的支撑万亿级数据洪峰的分布式消息中间件,在众多行业广泛应用.在选型过程中,开发者一定会关注开源版与商业版的业务价值对比. 那么,今天就围绕着商业 ...
- go tcp连接_在Go中构建并发TCP服务器样例
开发一个并发TCP服务器,只使用大约65行Go代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...
- mac建立sftp连接_【5分钟玩转Lighthouse】Win10远程连接同步代码
0x00 前言 最近不断有同学最近来咨询:之前咱们的Lighthouse教程都是从Linux/Mac笔记本下操作的,能不能出一篇Windows下的实践案例呢?而且,Windows笔记本的环境和远程Li ...
- Kafka(消息队列原理,kafka定义,Kafka架构原理,kafka架构的工作流程)秒懂的kafka
目录 什么是Kafka? 消息队列原理: 为什么要用Kafka? kafka的架构 kafka工作流程详解: 什么是Kafka? kafka是一个分布式消息队列 这个定义意味深长,记住容易,理解不易. ...
- 系统架构设计师软件生命周期_云架构师生命中的一天
系统架构设计师软件生命周期 OpenStack可能是一个谜. 我们有开放源代码的纯粹主义者,他们证明了OpenStack的优点,即使许多企业爱好者都怀疑OpenStack是否适合他们. 云实践负责人V ...
- mysql 云端连接_云服务器远程连接mysql数据库
首先需要在云服务器上,下载安装好mysql与Navicat. mysql下载好以后,打开云端的开始,找到mysql的命令窗,进入输入自己的mysql密码,稍等片刻进入mysql数据库 进入之后输入下列 ...
- java 断开tcp连接_处理TCP客户端断开连接
我有这个简单的服务器,接受客户端的TCP套接字连接 . 尝试连接的每个客户端都使用新的Socket获取自己的 TCPConnectionHandler 实例 . 我不明白我该如何处理客户端断开连接 . ...
最新文章
- 无法找到脚本库错误解决过程
- adb过滤只查看某一个app的日志
- 条码控件商IDAutomation极大改善了Barcode Image Generator性能
- 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析(一)...
- JQuery autocomplete使用手册
- [Hadoop]Hive r0.9.0中文文档(二)之联表查询Join
- 记字符编码与转义符的纠缠
- Matlab安装指南
- mame新版ROM下载网站推荐
- vmware 14 激活码
- Excel VBA生成SQL建表语句
- 应急响应样本分析查杀集合
- 如何获取html的页面宽度和高度,js获取屏幕,浏览器及网页的宽度和高度
- Ubuntu18.04下利用Gazebo搭建赛道完成ROS机器人定位导航仿真 + 加载YOLO检测识别标记物体【智能车】
- RadStudio 10.3.3 Rio (Delphi C++ Builder)及TMS TAdvStringGrid控件安装方法
- 线上AI僚机,告诉你对方喜好,手把手教你如何正确约会
- 如何在Unity中使用WebXR开发AR/VR应用
- python运维工程师前景_运维工程师的前景怎么样
- 远程计算机打印,通过远程桌面访问进行远程打印-Splashtop
- 计算机win7进不了,win7进不了系统怎么解决
热门文章
- datatables ajax错误,ajax datatable - DataTables警告:table id = example - 无法重新初始化DataTable(示例代码)...
- linux怎么让cat运行,使用lolcat让你的Linux命令行出现七彩虹
- c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...
- distcc 链接失败_distcc分布式编译时,icu host程序偶现编译失败原因分析
- hql查询之实体对象查询
- 变成一列_VBA实践(6)--excel横向排列的数据表变成竖向排列
- Kafka系列之-Kafka Protocol实例分析
- 13.C#的函数练习
- 离散卷积与自相关----------信号处理系列[原创]
- 1-算法-hanoi汉诺塔问题- 递归