socketmq 设置队列大小_[译] TCP的SYN队列和Accept队列

关于两个队列

e2d3e7bc4b1879209039ed4522c632b8.png

首先我们必须明白,处于“LISTENING”状态的TCP socket,有两个独立的队列:

  • SYN队列(SYN Queue)
  • Accept队列(Accept Queue)

这两个术语有时也被称为“reqsk_queue”,“ACK backlog”,“listen backlog”,甚至“TCP backlog”,但是这篇文章中我们使用上面两个术语以免造成混淆。

SYN队列

SYN队列存储了收到SYN包的连接(对应内核代码的结构体:struct inet_request_sock)。它的职责是回复SYN+ACK包,并且在没有收到ACK包时重传,直到超时。在Linux下,重传的次数为:

$ sysctl net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries = 5

文档中对tcp_synack_retries的描述如下:

tcp_synack_retries - int整型对于一个被动TCP连接,重传SYNACKs的次数。该值不能超过255。默认值为5,如果初始RTO是1秒,那么对应的最后一次重传是31秒。对应的最后一次超时是63秒之后。

发送完SYN+ACK之后,SYN队列等待从客户端发出的ACK包(也即三次握手的最后一个包)。当收到ACK包时,首先找到对应的SYN队列,再在对应的SYN队列中检查相关的数据看是否匹配,如果匹配,内核将该连接相关的数据从SYN队列中移除,创建一个完整的连接(对应内核代码的结构体:struct inet_sock),并将这个连接加入Accept队列。

Accept队列

Accept队列中存放的是已建立好的连接,也即等待被上层应用程序取走的连接。当进程调用accept(),这个socket从队列中取出,传递给上层应用程序。

这就是Linux处理SYN包的一个简单描述。顺便一提,当socket开启了TCP_DEFER_ACCEPTTCP_FASTOPEN时,工作方式将会有细微不同,本文不做介绍。

队列大小限制

应用程序通过调用系统调用listen(2),传入backlog参数,来设置SYN队列和Accept队列的最大大小。比如下面这样,将SYN队列和Accept队列的最大大小同时设置为1024:

listen(sfd, 1024)

注意,在4.3版本之前的内核,SYN队列的大小是用另一种方式计算。

SYN队列的最大大小以前是用net.ipv4.tcp_max_syn_backlog来配置,但是现在已经不再使用了。现在用net.core.somaxconn来同时表示SYN队列和Accept队列的最大大小。在我们的服务器上,我们将它设置为16k:

$ sysctl net.core.somaxconn
net.core.somaxconn = 16384

队列设置为多大合适

知道了上面这些信息后,你可能会问,队列设置为多大合适?

答案是:看情况。对于大多数的TCP服务来说,这并不太重要。比如,Go语言1.11版本之前,并没有提供设置队列大小的方法。

尽管如此,也存在一些合理的原因,需要增大队列的大小:

  • 当建立连接的请求速度确实很大时,即使是对于一个高性能的服务来说,SYN队列也可能需要设置的大一些。
  • SYN队列的大小,换言之就是等待ACK包的连接数。也即与客户端的平均往返时间越大,堆积在SYN队列中的连接就越多。对于那些大部分客户端都距离服务器很远的场景,比如说往返时间几百毫秒以上,可以将队列大小设置的大一些。
  • TCP_DEFER_ACCEPT选项如果打开了,会导致socket在SYN-RECV状态下维持更长的时间,也即增大了处于SYN队列中的时间。

但是,将backlog设置的过大也会带来不好的影响:

  • SYN队列中的每一个槽位都需要占用一些内存。当遇到SYN Flood攻击时,我们没有必要为这些发起攻击的包浪费资源。SYN队列中的inet_request_sock结构体,在4.14内核下,每个将占用256字节的内存。

linux下,如果想查看SYN队列的当前状态,我们可以使用ss命令来查询SYN-RECV状态的socket。比如如下执行结果,表示80端口的SYN队列中当前有119个元素,443端口则为78。

$ ss -n state syn-recv sport = :80 | wc -l
119
$ ss -n state syn-recv sport = :443 | wc -l
78

还可以通过我们的SystemTap脚本来观察这个数据:resq.stp

假如程序调用accept()不够快?

fb1e2e21d57c9c8ebc36a3739437b3e8.png

如果程序调用accept()不够快会发生什么呢?

  • 后续收到的SYN包,不会被SYN队列处理
  • 后续收到的(用于建立连接的)ACK包,不会被SYN队列处理
  • TcpExtListenOverflows / LINUX_MIB_LISTENOVERFLOWS计数增加
  • TcpExtListenDrops / LINUX_MIB_LISTENDROPS计数增加

发生这种情况时,我们只能寄希望于程序的处理性能稍后能恢复正常,客户端重新发送被服务端丢弃的包。

内核的这种表现对于大部分服务来说是可接受的。顺便一提,可以通过调整net.ipv4.tcp_abort_on_overflow这个全局参数来修改这种表现,但是最好还是不要改这个参数。

可以通过查看nstat的计数来观察Accept队列溢出的状态:

$ nstat -az TcpExtListenDrops
TcpExtListenDrops     49199     0.0

但是这是一个全局的计数。观察起来不够直观,比如有时我们观察到它在增长,但是所有的服务程序看起来都是正常的。此时我们可以使用ss命令来观察单个监听端口的Accept队列大小:

$ ss -plnt sport = :6443|cat
State   Recv-Q Send-Q  Local Address:Port  Peer Address:Port
LISTEN  0      1024                *:6443             *:*

Recv-Q这一列显示的是处于Accept队列中的socket数量,Send-Q显示的是队列的最大大小。在上面的例子中,我们发现并没有未被程序accept()的socket,但是我们依然发现ListenDrops计数在增长。

这是因为我们的程序只是周期性的短暂卡住不处理新的连接,而非永久性的不处理,过段时间程序又恢复了正常。这种情况下,用ss命令比较难观察这种现象,因此我们写了一个SystemTap脚本,它会hook进内核,把被丢弃的SYN包打印出来:

$ sudo stap -v acceptq.stp
time (us)        acceptq qmax  local addr    remote_addr
1495634198449075  1025   1024  0.0.0.0:6443  10.0.1.92:28585
1495634198449253  1025   1024  0.0.0.0:6443  10.0.1.92:50500
1495634198450062  1025   1024  0.0.0.0:6443  10.0.1.92:65434
...

通过上面的操作,可以观察到哪些SYN包被ListenDrops影响了。从而我们也就可以知道哪些程序在丢失连接。

英文原文来自cloudflare的博客,地址如下: SYN packet handling in the wild。 英文原文在后半部分还介绍了SYN Cookies对于SYN Flood的影响,我在本文中没有翻译,感兴趣的可以看看原文。

本文原始地址: https://pengrl.com/p/46323/声明: 本文后续所有修改都会第一时间在原始地址更新。本文欢迎任何形式转载,转载时注明原始出处即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

can总线报文是固定的吗_新能源汽车CAN总线Bus Off处理流程

CAN总线由其高可靠和实时性被广泛应用于新能源汽车、轨道交通、医疗、工程机械等行业,本文介绍CAN总线关闭对新能源汽车的功能和安全性能产生的影响,并针对工程师关注的问题,提供有效的解决方案。2020年10月28日全球汽车峰会中展示了未来新能…

java生日正则表达式_Java编程基础15——正则表达式常用工具类

1_正则表达式的概述和简单使用A:正则表达式是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的B:案例演示需求&#…

jsplumb拖线_基于jsplumb插件制作可拖拽、保存流程图、重绘保存后的流程图总结...

1.重点参考博文https://blog.csdn.net/j_bean/article/details/780926472.关键点总结1)实现可视区域图形画满后,拖动整个画布的效果a.最好不要给画图形的容器预设置很大的宽、高,这样遇到钻牛角尖的用户还是会将画布拖到边界。b.换个思维,拖动…

PP视频如何更改截图保存路径及图片类型

这篇文章主要说的是PP视频如何更改截图保存路径及图片类型,希望可以帮助大家。PP视频采用了先进的P2P流媒体播放技术,PP视频可以确保在大量用户同时观看节目的情况下,节目依然流畅清晰。PP视频是一个高品质的视频网站,PP视频依靠独…

win连接被远程计算机终止,windows系统远程连接后马上断开提示“远程计算机已结束连接”的解决方法...

原标题:windows系统远程连接后马上断开提示“远程计算机已结束连接”的解决方法此问题在远程系统是GHOST版的windowsxp和winserver2003时出现的比较普遍。现象描述:用windowsxp自带的“远程桌面”功能连接到另外一台windowsxp电脑时,在连接的…

搜狐视频怎么开启青少年模式

很多人都使用搜狐视频,播放器家园网小编给大家分享一下搜狐视频怎么开启青少年模式相关内容。搜狐视频播放器是一款深受广大用户欢迎的主流视频播放器软件,专注为用户提供在线视频播放的客户端软件,搜狐视频播放器为用户提供清晰、流畅、界面…

使用中断后不停止_乔丹体育公司构成侵权,为何又不判令彻底停止使用“乔丹”注册商标?法院解释来了...

2020年12月30日,上海二中院发布了迈克尔•乔丹姓名权纠纷案一审判决结果,引发社会各界广泛关注。现就大家关注的若干问题作如下释疑:1. 为何认定乔丹体育公司构成侵权乔丹体育公司是在明知迈克尔•乔丹具有较高知名度的情况下,仍然…

如何在家访问公司的文件服务器,企业的共享文件,该怎么高效管理?

原标题:企业的共享文件,该怎么高效管理?现在的企业基本上都有自己的文件服务器,并且会经常共享文件让局域网内用户访问。而企业的网络服务器共享文件是企业的无形资产和商业保密信息,员工也经常根据网络服务器来远程控…

roads 用户体验标准_全球领先技术加持,联发科 天玑1000+刷新5G用户体验新标准...

随着5G基站的一步步铺建,越来越多的地方都逐渐可以接收到5G信号了。这自然也催促着芯片厂商尽快推出全新的5G移动平台,比如骁龙的X55基带、华为的巴龙5000基带等。但在目前的环境下,尽管这些基带的加入让手机移动平台能够支持5G网络&#xff…

window系统服务器改名,微软:不会将 Windows Server 改名为 Microsoft Server 系统

原标题:微软:不会将 Windows Server 改名为 Microsoft Server 系统IT之家 4 月 18 日消息 外媒 MSPoweruser 报道,微软已经迅速行动,粉碎了一个传闻,此前有消息称,微软正计划将 Windows Server 更名为 Micr…

腾讯视频视频下载_如何下载腾讯视频

今天继续给大家分享腾讯视频方面的内容。一般来说vip会员可以提前点播热播剧,对于追剧党来说是非常好的,不过是否开通也要根据自己需求,毕竟价格也不低啊,而且还是有一些用户能够通过一些简单但不值得提倡的方法看遍全网vip资源电…

deebot扫地机器人使用_完美主义的双子座也选这款扫地机——小米米家扫地机器人使用心得...

赵女士是一枚85后,热爱生活、完美主义、中度洁癖。自从搬了新家后,赵女士一直想添置一台扫地机器人,一方面,孩子经常喜欢赤脚在家中玩耍,另一方面,白天上班晚上回来打扫卫生总显得有些心有余而力不足&#…

腾讯视频如何下载视频_腾讯视频如何做明星装扮

这篇文章主要说的是腾讯视频如何下载视频_腾讯视频如何做明星装扮,希望可以帮助大家。腾讯视频时刻为您推荐最新最火的视频,精彩不断随时观看。支持各种画质的下载,没网也能享受高视觉的享受,让生活的每一刻都不再枯燥!腾讯视频采…

路畅畅云固件升级教程_斐讯K2P MTK版简单几步刷入breed教程,附刷第三方固件方法...

教程适用于 K2P MTK版本(A1/A2)。教程转载自恩山1、检查路由固件版本,是否V22.8.5.189或V22.10.2.24,版本低于22.8.5.189就手动上传升级一下。2、下载辅助工具刷入breed。下载辅助工具,解压压缩文件到任意目录。解压后保留一下几个文件&#…

腾讯视频下载安装_如何上传视频到腾讯视频平台

播放器软件很多,本文小编给大家推荐腾讯视频。我们可以在腾讯视频播放器上,观看各种电视剧、电影、综艺节目等内容。里面的大部分视频都是免费的,部分独播大剧可能会存在vip收费的情况,这也是无法避免的。腾讯视频客户端是国内领先…

edtext 从右边开始输入 安卓_FreeRTOS 从入门到精通6--详解任务管理下(对比PLC,安卓)...

接着上一讲奔腾的心:FreeRTOS 从入门到精通5--详解任务管理上​zhuanlan.zhihu.com在这一讲中我将要介绍任务的运行模式,同时与可编程控制器(PLC)以及安卓系统的运行模式进行比较。我在德国读书时专业是嵌入式开发,工作…

礼物

礼物——大熊和小兔喜欢互送礼物,朋友总是这样。小兔给大熊送礼物有一个习惯—试试看。有一次,小兔送给大熊一本漫画书。 “哇,漫画书!”大熊马上接过书翻看起来。小老虎也围过来看,刚翻两页,小老虎就叫起来&#xff…

ps去水印教程_ps去水印教程,详细解析五种去水印的方法

平常我们从一些素材网站下载图片的时候,不免会带上一些水印,使图片的整体美感下降不少,今天教同学们五种去除水印的方法,相信你学习以后,有所收获,遇到喜欢的图片可以把不想要的水印去掉,不过水…

腾讯视频真实下载地址_腾讯视频如何多倍速播放视频

腾讯视频官网版是一款专注视频播放的客户端软件,您可运行腾讯视频,在线享受奇艺网站内全部免费高清正版视频。腾讯视频视频播放器内容丰富,影视更新快,包含腾讯视频所有的视频内容,在线享受腾讯视频站内全部免费高清正…

excel 图片转url_最全总结 | 聊聊 Python 办公自动化之 Excel(下)

聊聊 Python 数据处理全家桶(Memca 篇)点击上方“AirPython”,选择“加为星标”第一时间关注 Python 技术干货!1. 前言前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt、openpyxl其中,xlrd/xlwt 这一组…