压测场景下的 TIME_WAIT 处理

简介: 压测场景下的 TIME_WAIT 处理

 

1. 序

某专有云项目具备压测场景,在Windows的压测机上用 LoadRunner 进行业务的压力测试,压测运行一段时间后出现大量端口无法分配的报错。
其实通过问题描述,以及 Windows的报错信息基本确定是压测机的问题。但可能原因较多,一直未能达成一致。所以,趁机分析了客户端的压测机成为压测瓶颈的可能,除了CPU、网络、 I/O 等机器性能参数外,仍需考虑网络协议引入的资源短缺问题。
注:以下内容的目的是理清TCP协议中比较模糊的内容,对协议比较熟悉的可以忽略。

2. TIME_WAIT基础:RFC 793 TCP协议

众所周知, TCP存在三次握手,四次挥手过程。其具体设计的目的,简而言之,是为了在不稳定的物理网络环境中确保可靠的数据传输;因此,TCP在具体实现中加入了很多异常状况的处理,整体协议就变得比较复杂。
要理解TCP协议,推荐阅读 RFC 793,可参考文后链接了解详情[1]。同时,也要理解“TCP state transition”状态机,如下图所示,可参考文后资料了解详情[2]。

 


图1. TCP状态转换图

本文仅针对 TW 在TCP协议中的作用进行讨论,不涉及整体协议的分析。四次挥手后的TIME_WAIT 状态,后续将以TW缩写替代。

2.1 TW 作用

首先,主要作用是保证TCP连接关闭的可靠性。
考虑下在四次挥手过程中,如果主动关闭方发送的LAST_ACK丢失,那么被动关闭方会重传FIN。此时,如果主动关闭方对应的TCP Endpoint没有进入TW状态而是直接在内核中清理了,根据协议,主动关闭方会认为自己没有打开过这个端口,而以RST响应被动关闭方重传的FIN。最终该行为导致被动关闭方认为连接异常关闭,在业务上可能会收到异常报错等情况。
其次,TW状态同时也能避免相同的TCP端口收到在网络上前一个连接的重复数据包。
理论上,数据包在网络上过期时间对应即MSL(Maximal Segment Lifetime),随着操作系统的不断发展,也有例外情况,这部分搜索PAWS应该可以看到不少类似的文章说明。
再次,端口进入 TW 状态 同时也避免了被操作系统快速重复使用的可能。

2.2 TW形成的原因

当一台主机操作系统主动关闭TCP Endpoint(socket)时,该TCP Endpoint进入TW状态。以Windows为例,Windows内核会对 TCP Endpoint 数据结构进行相应清理,然后放入额外的 TW queue 中,设置2MSL 的定时器,等待定时器超时后调用对应的释放代码。Linux上的实现也是类似。
目前较多的说法是"TCP连接"进入TW ,但我们可能需要理解 "连接" 其实是抽象的概念。实际上"连接"在逻辑上存在,因为客户端和服务器端以及中间可能涉及的4层设备同时为一次传输创建了关联的TCP资源(Endpoint,或者 Session)。准确理解TW状态,即TCP EndpointTW进入TW状态。

2.3 小结

TW 是为了保证 TCP 连接正常终止(避免端口被快速复用),也是为了保证网络中迷失的数据包正常过期(防止前一个连接的数据包被错误的接收)。
TW暗杀术,可参考文后资料了解详情[3]。

3. 概念澄清

欢迎讨论
几个可能比较模糊的地方,明确如下:

  1. 作为连接双方,客户端和服务器端的TCP Endpoint都可能进入 TW 状态(极端情况下,可能双方同时进入 TW 状态)。

该情况在逻辑上是成立的,可参考文后资料了解详情[4]。

  1. TW 是标准的一部分,不代表TCP端口或者连接状态异常。(这个概念很重要,避免陷入某些不必要的陷阱。)
  2. CLOSE_WAIT 尽管也是标准的一部分,但它的出现预示着本端的 TCP Endpoint 处于半关闭状态,原因常常是应用程序没有调用 socket 相关的 close 或者 shutdown。可能的原因是应用程序仍有未发送完成的数据,该情况下CLOSE_WAIT 最终还是会消失的。 具体描述这部分,长期有 CLOSE_WAIT 状态的端口缓慢累积,这种情况是需要引起注意的,累积到一定程度,端口资源就不够了。

针对前面的 TCP Endpoint 这个词语,可能很多人不太了解,这边也简单说明下:
在Windows 2008 R2之前,socket是用户态(user mode) 的概念,大多数Windows socket应用程序基本都基于Winsock开发,由中间层AFD.sys 驱动翻译成内核 tcpip.sys 协议栈驱动 所能接受的TCP Endpoint数据结构。在2008 R2之后,微软为了方便内核的网络编程,在Windows Kernel中提供WSK,即Winsock在内核的实现。文中提到的TCP Endpoint是在Windows内核中由TCPIP.sys驱动文件实现的TCP数据结构,也对应Linux上的socket。该文简单以 Endpoint 代指内核的"socket"。

4. TW 优化手段

对于Linux,优化手段已经进行了很多讨论了,以Centos为例,

  1. 在timestamps启用的情况下,配置 tcp_tw_reuse 和tcp_tw_recycle。

针对客户端,连接请求发起方。
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1

针对服务器端,连接请求接收方
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_recycle = 1
注:tcp_tw_recycle的启用会带来一些 side effect,具体在NAT地址转换场景下,容易发生连接异常问题。
可参考文后资料了解详情[4]。

  1. 配置 max_tw_buckets,连接请求发起方接收方通用,但需要注意这个选项本身有违 TW 设计的初衷。

net.ipv4.tcp_max_tw_buckets = 5000

  1. 配置 ip_local_port_range,连接请求发起方。

net.ipv4.ip_local_port_range = 5000 65535

针对Windows ,资料较少,这边借之前的工作经验,总结如下:

  1. Windows Vista / Windows Server 2008 之前的操作系统,注册表

端口范围:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
MaxUserPort = 0n65534
TW 超时时间:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
TcpTimedWaitDelay = 0n30

  1. Windows 7 / Windows Server 2008 R2 及其之后的版本

端口范围:
netsh int ipv4 set dynamicport tcp start=1025 num=64511
TW 超时时间:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
TcpTimedWaitDelay = 0n30

Windows Server 2012 and earlier: 30-300 (decimal)
Windows 8 and earlier: 30-300 (decimal)
Windows Server 2012 R2 and later: 2-300 (decimal)
Windows 8.1 and later: 2-300 (decimal)
注:

  • 任何涉及注册表的修改,只有重启机器才会生效。
  • 与 Linux不同,Windows 没有快速回收机制,不存在快速回收 TW 的可能,只能等待2MSL过期(即TcpTimedWaitDelay)。
  • Windows唯一能快速回收TW状态的Endpoint 的情况:

新连接请求的SEQ序列号>TW状态的Endpoint记录的SEQ序列号。
此时,内核会认为该 SYN 请求合法。 这里,这个TW 状态的 TCP Endpoint 一定是在服务端(通过socket accept 打开的 服务端口)。(为了这个能力,Windows 的 RFC 1323 选项必须打开,内容可以自行搜索。)

5. 压测客户端无法分配端口的原因分析

端口无法分配有两种可能:

  • 完全随机的动态端口请求,报错端口分配异常,基本是操作系统没有可用端口。
  • 指定端口的绑定申请报错端口分配异常,可能存在端口使用冲突问题。

针对第一种情况,首先需要通过 netstat -ano 进行快速检查,分析是否存在端口占满的情况,以及占满端口的TCP Endpoint状态。针对不同的状态,考虑不同的方案。
比如,极端情况下,没有任何异常的服务器上,端口分配失败问题,可参考文后资料了解详情[5]。
以Windows操作系统TW状态Endpoint占满可用端口场景为例(在Linux上发生的可能性较低),分析问题前需要大概了解 Windows 上端口分配原理。

  • Windows和Linux在动态分配端口的机制上有很大的不同。
  • Linux以粗浅的理解应该是针对五元组的分配,即可能存在相同的动态端口访问不同服务器的服务端口。
  • Windows的动态端口分配实现基于Bitmap查找,无论访问哪里,动态端口的池子最大为 1025 – 65536,即64511个。
  • 考虑到最短30秒的 TW 超时时间,如果按照 64511/29 = 2225 ports/s 的速度去创建端口,那么很可能在30秒后持续发生端口无法分配的问题。
  • 这还是在连接处理比较快速的情况下,如果连接建立后不关闭,或者关闭时间比较久,创建端口的速度仍需持续下降来规避端口问题。

理解了 TW 的形成原因,相应的解决方案也就比较清楚了。

  1. 降低应用程序创建端口的速度。考虑连接持续时间和TW超时时间,计算相对合理的连接建立速度。不过,物理机操作系统、CPU/内存、网络IO等均可能影响连接状态,精确计算很难;同时,就应用程序而言,降低端口创建速度需要额外的逻辑,可能性不大。
  2. 在这个压测场景下,通过增加机器的方式来变相减少端口的需求。压测一般考虑某个固定阈值下整体系统的响应情况。在压力固定的情况下,可以通过分散压力的方式来减少端口资源的占用。
  3. 改变连接的行为,使用持久连接(注:非HTTP的长连接),例如针对500个并发,仅建立 500 个连接。好处显而易见,但坏处也很明显,持久连接不大符合用户真实行为,压测结果可能失真。同时,该方法需要应用程序上的支持。
  4. 不让机器的TCP Endpoint进入TW状态,可参考以下2种方案。
    a) 不让该机器主动关闭连接,而让对方主动关闭。这样,该主机进入被动关闭进程,在应用关闭TCP Endpoint之后,可直接释放端口资源。一些协议本身就有控制是否保持连接或者请求对方关闭连接的行为或者参数,在考虑这类问题的时候,可以适当进行利用。比如 HTTP 的长短连接,可参考文后资料了解详情[4]。b) 通过TCP Reset强制释放端口。TCP Reset可以由任何一方发出,无论是发送方还是接收方,在看到TCP Reset之后会立刻将对应TCP Endpoint拆除。

这里,可设置 socket 的 SO_LINGER选项,比如配置Nginx,可参考文后官方文档了解详情[6]。

 


图2:Nginx Lingering配置参考说明

针对压测工具本身,官方网站上也有类似 ABRUPT 选项,可参考文后官方文档了解详情[7]。

 


图3:LoadRunner ABRUPT配置选项说明

作者:陈鸽

原文链接

本文为阿里云原创内容,未经允许不得转载

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

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

相关文章

DataX在数据迁移中的应用

简介: DataX在数据迁移中的应用 1. DataX定义 首先简单介绍下datax是什么。 DataX是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS…

华为发布《绿色5G白皮书》,定义绿色5G网络八大技术方向

全球“碳达峰、碳中和”已成主流趋势,为了助力全球运营商绿色网络“双碳”行动计划的达成,在华为首届无线媒体沙龙上,华为无线网络SRAN产品线总裁马洪波发表了“绿色5G,E2四化八大方向,共赢双碳未来”主题演讲&#xf…

判断是否包含大写字符_Python最常用的数据类型中字符串基础函数使用知识点讲解...

字符串是 pthon 中最常用的数据类型。我们可以使用单引号、双引号或者三对单双引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。Python 的字符串有什么内建函数可以使用?len()方法返回对象(字符、列表、元组等)长度或项目个数。每个字符一…

Arthas 使用的各类方式

简介: Arthas 是阿里巴巴开源的 Java 诊断工具。让我们能够在线排查项目发生的问题。除了知道它的存在之外,我们也需要知道我们如何去安装使用它,以便于提高我们日常开发解决 BUG 的效率。 方案介绍 方案一:本地直接运行 往往最…

antd autoplay按f12才会轮播_涨知识了!原来这才是电脑键盘上,F1到F12的正确用法...

在这个快节奏的时代,工作效率可以说是非常重要的,所以熟练掌握电脑就是提高效率的好方法!那如何快速的掌握电脑呢?这就不妨先了解下键盘上F1-F12的正确用法哦,每个都是提高效率的快捷键。F1:获取帮助如果你…

新型数据中心需要什么样的存储

作者:浪潮信息首席架构师 叶毓睿 智算时代的序幕已经拉开,互联的万物,一切皆计算机。智慧计算融入到千行万业的图景,正在徐徐铺开。这是一个数据成为生产要素的时代,智慧计算将劳动者由人变成了人AI,将数据…

王者荣耀服务器未响应8月5日苹果,王者荣耀:世冠小组赛8月5日前瞻预测

14:00 深圳DYG vs GOG深圳DYG在上周的比赛遭遇两连败,目前排在A组倒数第二位。队伍进行人员轮换后,Giao在比赛中的发挥可圈可点,但其他队员的状态都下滑明显。辅助位星宇从春季赛的状态就一般,到本次世冠仍然没有提升,…

多中心容灾实践:如何实现真正的异地多活?

简介: 在异地多活的实现上,数据能够在三个及以上中心间进行双向同步,才是解决真正异地多活的核心技术所在。本文基于三中心且跨海外的场景,分享一种多中心容灾架构及实现方式,介绍几种分布式ID生成算法,以及…

HBM3内存子系统传输速率惊人,带宽突破1TB/S!

记者 | 邓晓娟 8月25日,内存IP厂商Rambus推出HBM3内存接口子系统。内含完全集成的PHY和数字控制器,传输速率达8.4Gbps;可为AI/ML和高性能计算(HPC)等应用和解决方案提供1TB/s的带宽速率;采用标准的16通道设…

android 如何读取cgi_Python基础教程(十):CGI编程、MySQL数据库

Python CGI编程什么是CGICGI 目前由NCSA维护,NCSA定义CGI如下:CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。网页浏览为了更好的了解CGI是如何工作的&…

10亿+文件数压测,阿里云JindoFS轻松应对

简介: Apache Hadoop FileSystem (HDFS) 是被广为使用的大数据存储方案,其核心元数据服务 NameNode 将全部元数据存放在内存中,因此所能承载的元数据规模受限于内存,单个实例所能支撑的文件个数大约 4亿。JindoFS块模式是阿里云基…

一文简单弄懂tensorflow_在tensorflow中设置梯度衰减

我是从keras入门深度学习的,第一个用的demo是keras实现的yolov3,代码很好懂(其实也不是很好懂,第一次也搞了很久才弄懂) 然后是做的车牌识别,用了tiny-yolo来检测车牌位置,当时训练有4w张图片&a…

打破“单点防护”缺陷,山石网科发布“云网端”XDR解决方案

编辑 | 宋 慧 供稿 | 山石网科 出品 | CSDN云计算 近年来,CISO面临的安全形势可谓“内忧外患”,对内面临多样化的网络接入途径、庞大且繁杂的IT资产;对外面临攻防关系、攻防手段、网络攻击的数量等呈指数级增长等问题,给组织的…

Serverless 场景下 Pod 创建效率优化

简介: 众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域。弹性能力是 Serverless 领域的核心竞争力,本次分享将重点介绍基于 Kubernetes 的 Serverless 服务中&#xff0…

安装wordcloud_COVID19数据分析实战:WordCloud 词云分析

↑↑点击上方蓝字,回复资料,N个G的惊喜前言上一篇文章(链接)我们对COVID19_line_list数据集进行了清洗以及初步分析。本文中我们将分析如何用词云来展示文本信息的概要。比如我们从词云百度百科截取文字,制作词云。简单来说,词云就…

到达率99.9%:闲鱼消息在高速上换引擎(集大成)

简介: 记录这一年闲鱼消息的优化之路 1. 背景 在2020年年初的时候接手了闲鱼的消息,当时的消息存在各种问题,网上的舆情也是接连不断:“闲鱼消息经常丢失”、“消息用户头像乱了”、“订单状态不对”(相信现在看文章的…

1小时打造HaaS版小小蛮驴智能车

1、认识一下小小蛮驴真面目 1.1、组件部分 HaaS100核心板 HaaS100是一款物联网场景中的标准硬件,并配套嵌入到硬件中的软件驱动及功能模块,为用户提供物联网设备高效开发服务。 HaaS100核心板有着丰富的外设接口,如下所示: 智…

Spring Boot Admin 集成诊断利器 Arthas 实践

简介: Arthas 是 Alibaba 开源的 Java 诊断工具,具有实时查看系统的运行状况;查看函数调用参数、返回值和异常;在线热更新代码;秒解决类冲突问题;定位类加载路径;生成热点;通过网页诊…

设计方案,拿来吧你!

作者:零一来源:前端印象前言大家好,我是零一,今天要跟大家聊聊开发流程中不起眼的环节——设计方案。你们可能没听过,也可能只是简单得走过过场,别划走,这非常重要!在字节&#xff0…

借力阿里云存储产品 延锋彼欧加速数字化重塑

简介: 延锋彼欧作为汽车外饰件生产的领航企业,通过基于业务和数据驱动的数字化管理,释放工业设备数据潜能提升产能。依托阿里云“稳定、安全、可靠、易用”的存储服务,延锋彼欧的发展步伐将更为稳健。 “一日骋千里,无…