皇冠体育寻求亚洲战略合作伙伴,皇冠代理招募中,皇冠平台开放会员注册、充值、提现、电脑版下载、APP下载。

首页快讯正文

usdt无需实名交易(www.caibao.it):压测场景下的 TIME_WAIT 处置

admin2021-05-0392

USDT自动充值接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

原题目:压测场景下的 TIME_WAIT 处置

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

某专有云项目具备压测场景,在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. 观点澄清

迎接讨论

几个可能对照模糊的地方,明确如下:

该情形在逻辑上是确立的,可参考文后资料领会详情[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地址转换场景下,容易发生毗邻异常问题。

,

Usdt第三方支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

可参考文后资料领会详情[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)

注:

新毗邻请求的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种方案。
  5. 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设置选项说明

作者:陈鸽

网友评论

1条评论
  • 2021-05-03 00:00:23

    Allbet欧博官网欢迎进入allbet欧博官网。allbet欧博官网开放ALLBET欧博真人客户端、Allbet代理网页版、Allbet会员网页版、Allbet会员注册、Allbet代理开户、Allbet电脑客户端下载、Allbet手机版下载等业务。全班都看了