搞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连接建立异常?相关推荐

  1. 基于消息队列 RocketMQ 的大型分布式应用上云较佳实践

    作者|绍舒 审核&校对:岁月.佳佳 编辑&排版:雯燕 前言 消息队列是分布式互联网架构的重要基础设施,在以下场景都有着重要的应用: 应用解耦 削峰填谷 异步通知 分布式事务 大数据处理 ...

  2. 基于消息队列 RocketMQ 的大型分布式应用上云最佳实践

    简介:Apache RocketMQ 作为阿里巴巴开源的支撑万亿级数据洪峰的分布式消息中间件,在众多行业广泛应用.在选型过程中,开发者一定会关注开源版与商业版的业务价值对比. 那么,今天就围绕着商业版 ...

  3. 基于消息队列 RocketMQ 的大型分布式应用上云实践

    简介: Apache RocketMQ 作为阿里巴巴开源的支撑万亿级数据洪峰的分布式消息中间件,在众多行业广泛应用.在选型过程中,开发者一定会关注开源版与商业版的业务价值对比. 那么,今天就围绕着商业 ...

  4. go tcp连接_在Go中构建并发TCP服务器样例

    开发一个并发TCP服务器,只使用大约65行Go代码生成随机数. 本文是Mihalis Tsoukalos的Go系列的一部分.阅读第1部分:在Go中创建随机安全密码. TCP和UDP服务器无处不在,通过 ...

  5. mac建立sftp连接_【5分钟玩转Lighthouse】Win10远程连接同步代码

    0x00 前言 最近不断有同学最近来咨询:之前咱们的Lighthouse教程都是从Linux/Mac笔记本下操作的,能不能出一篇Windows下的实践案例呢?而且,Windows笔记本的环境和远程Li ...

  6. Kafka(消息队列原理,kafka定义,Kafka架构原理,kafka架构的工作流程)秒懂的kafka

    目录 什么是Kafka? 消息队列原理: 为什么要用Kafka? kafka的架构 kafka工作流程详解: 什么是Kafka? kafka是一个分布式消息队列 这个定义意味深长,记住容易,理解不易. ...

  7. 系统架构设计师软件生命周期_云架构师生命中的一天

    系统架构设计师软件生命周期 OpenStack可能是一个谜. 我们有开放源代码的纯粹主义者,他们证明了OpenStack的优点,即使许多企业爱好者都怀疑OpenStack是否适合他们. 云实践负责人V ...

  8. mysql 云端连接_云服务器远程连接mysql数据库

    首先需要在云服务器上,下载安装好mysql与Navicat. mysql下载好以后,打开云端的开始,找到mysql的命令窗,进入输入自己的mysql密码,稍等片刻进入mysql数据库 进入之后输入下列 ...

  9. java 断开tcp连接_处理TCP客户端断开连接

    我有这个简单的服务器,接受客户端的TCP套接字连接 . 尝试连接的每个客户端都使用新的Socket获取自己的 TCPConnectionHandler 实例 . 我不明白我该如何处理客户端断开连接 . ...

最新文章

  1. 无法找到脚本库错误解决过程
  2. adb过滤只查看某一个app的日志
  3. 条码控件商IDAutomation极大改善了Barcode Image Generator性能
  4. 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析(一)...
  5. JQuery autocomplete使用手册
  6. [Hadoop]Hive r0.9.0中文文档(二)之联表查询Join
  7. 记字符编码与转义符的纠缠
  8. Matlab安装指南
  9. mame新版ROM下载网站推荐
  10. vmware 14 激活码
  11. Excel VBA生成SQL建表语句
  12. 应急响应样本分析查杀集合
  13. 如何获取html的页面宽度和高度,js获取屏幕,浏览器及网页的宽度和高度
  14. Ubuntu18.04下利用Gazebo搭建赛道完成ROS机器人定位导航仿真 + 加载YOLO检测识别标记物体【智能车】
  15. RadStudio 10.3.3 Rio (Delphi C++ Builder)及TMS TAdvStringGrid控件安装方法
  16. 线上AI僚机,告诉你对方喜好,手把手教你如何正确约会
  17. 如何在Unity中使用WebXR开发AR/VR应用
  18. python运维工程师前景_运维工程师的前景怎么样
  19. 远程计算机打印,通过远程桌面访问进行远程打印-Splashtop
  20. 计算机win7进不了,win7进不了系统怎么解决

热门文章

  1. datatables ajax错误,ajax datatable - DataTables警告:table id = example - 无法重新初始化DataTable(示例代码)...
  2. linux怎么让cat运行,使用lolcat让你的Linux命令行出现七彩虹
  3. c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...
  4. distcc 链接失败_distcc分布式编译时,icu host程序偶现编译失败原因分析
  5. hql查询之实体对象查询
  6. 变成一列_VBA实践(6)--excel横向排列的数据表变成竖向排列
  7. Kafka系列之-Kafka Protocol实例分析
  8. 13.C#的函数练习
  9. 离散卷积与自相关----------信号处理系列[原创]
  10. 1-算法-hanoi汉诺塔问题- 递归