zoukankan      html  css  js  c++  java
  • WINDOWS下JMETER压测端口占用问题

    2 压测环境配置

    压测发起设备:windows 10
    网络:局域网
    压测软件:Jmeter 5.0
    压测系统内存:Ubuntu 4核8G
    PHP 版本:php7.1.23
    Nginx 版本:nginx1.14.0
    MySQL版本:5.7.24
    Redis: 开启
    CDN:关闭

    3 报错信息描述

    压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错。

    
        JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT
    
    • 1
    • 2

    在这里插入图片描述

    4 问题排查

    开始考虑的方向是Nginx、PHP、MySQL做了相关限制导致线程被占用, 但是修改对应的配置后发现没有任何效果,该报错的还是报错。 查了一波资料,发现 windows 环境下的端口循环回收需要消耗2~4分钟。由此猜测可能是由于 windows下压测端口数有限,端口资源被占满,没有及时循环回收,导致报错。

    5 初步解决之扩大端口数量

    设置 windows下最大端口数 65534,尝试将端口资源数设置为最大,windows最大能支持65534个端口。

    步骤1

    使用 win + R 快捷键打开 cmd,输入 regedit 命令打开注册表

    步骤2  设置 MAXUSERPORT 数量

    2.1 找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters目录。

    2.2 右击 Parameters,添加一个新的 DWORD,命名为MaxUserPort

    2.3 然后双击 MaxUserPort,输入 65534,基数选择 十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作)。

    2.4 修改配置完毕后, 需要重启 windows 才会生效。

    6 初步实践

    采用上述的解决方案之后,windows 下设置 150qps/s 并发数进行压测,暂时解决了端口占用的问题。在此基础上,将压测的并发数提高至 700qps/s,两分钟内达到 66000+ 个请求,数量超过了 65534 端口数,再次出现了同一报错。

    扩大 WINDOWS 端口资源数量, 能够支持 150QPS/S 并发数的压测。 但是在高并发数(700QPS/S)的压测下,即使 WINDOWS 端口资源数量设置为最大,也会出现端口占用的问题。

    7 深入研究之提高端口使用率

    又是一波海量搜索,定位到了两个影响端口使用率的主要因素,具体如下。

    • windows下的端口 Time_Wait 导致端口无法使用

    • windows下的端口 CLOSE_WAIT 导致端口无法使用

    7.1 TIME_WAIT 解决方案

    主要思路是通过缩短 TIME_WAIT 的等待时间,提高端口的使用率。

    step1: 使用 win + R 快捷键打开 cmd,输入 regedit 命令打开注册表。

    step2: 找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters目录。

    step3: 右击 parameters,添加一个新的DWORD,命名为 TcpTimedWaitDelay,将值设置为30, 缩短 TIME_WAIT 的等待时间。

    step4: 重启windows,配置项生效。

    7.2 CLOSE_WAIT

    CLOSE_WAIT 引发问题

    Close_Wait 会占用一个连接,网络可用连接小。当数量过多时,可能会引起网络性能下降,并占用系统非换页内存。尤其是在有连接池的情况下(比如 HttpRequest),会耗尽连接池的网络连接数,导致无法建立网络连接。

    CLOSE_WAIT 产生原因
    • 一般情况下是因为 TCP 连接没有调用关闭方法,需要应用来处理网络链接关闭。

    • 如果是Web请求,经常是因为 Response 的 BodyStream 没有调用 Close。举个例子,Widnows 下使用 HttpWebRequest 一定要保证 GetRequestStream 和 GetResponse 对象关闭,否则容易造成连接处于 CLOSE_WAIT 状态。

    • TCP的 KeepLive 功能, 操作系统 默认 7200秒 (2小时) 自动清理一次 CLOSE_WAIT 的连接,满足不了高并发下的端口需求数。支持自定义配置。

    CLOSE_WAIT 解决方案

    step1: 使用 win + R 快捷键打开 cmd,输入 regedit 命令打开注册表。

    step2: 找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters目录。

    step3: 在该目录下添加新的配置项。设置合理的Keepalive参数。

    KeepAliveTime

      KeepAliveTime的值控制系统尝试验证空闲连接是否仍然完好的频率。如果该连接在一段时间内没有活动,那么系统会发送保持连接的信号,如果网络正常并且接收方是活动的,它就会响应。如果需要对丢失接收方的情况敏感,也就是说需要更快地发现是否丢失了接收方,请考虑减小该值。而如果长期不活动的空闲连接的出现次数较多,但丢失接收方的情况出现较少,那么可能需要增大该值以减少开销。

      缺省情况下,如果空闲连接在7200000毫秒(2小时)内没有活动,系统就会发送保持连接的消息。 通常建议把该值设为1800000毫秒,从而丢失的连接会在30分钟内被检测到。具体操作:

      浏览至HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters注册表子键,在Parameters子键下创建或修改名为KeepAliveTime的REG_DWORD值,为该值设置适当的毫秒数。

     KeepAliveInterval

      KeepAliveInterval的值表示未收到另一方对“保持连接”信号的响应时,系统重复发送“保持连接”信号的频率。在无任何响应的情况下,连续发送“保持连接”信号的次数超过TcpMaxDataRetransmissions(下文将介绍)的值时,将放弃该连接。如果网络环境较差,允许较长的响应时间,则考虑增大该值以减少开销;如果需要尽快验证是否已丢失接收方,则考虑减小该值或TcpMaxDataRetransmissions值。

      缺省情况下,在未收到响应而重新发送“保持连接”的信号之前,系统会等待1000毫秒(1秒),可以根据具体需求修改,具体操作:

      浏览至HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters注册表子键,在Parameters子键下创建或修改名为KeepAliveInterval的REG_DWORD值,为该值设置适当的毫秒数。

    TcpMaxDataRetransmissions

      TcpMaxDataRetransmissions的值表示TCP数据重发,系统在现有连接上对无应答的数据段进行重发的次数。如果网络环境很差,可能需要提高该值以保持有效的通信,确保接收方收到数据;如果网络环境很好,或者通常是由于丢失接收方而导致数据的丢失,那么可以减小该值以减少验证接收方是否丢失所花费的时间和开销。

      缺省情况下,系统会重新发送未返回应答的数据段5次,可以根据具体需求修改,具体操作:

      浏览至HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters注册表子键,在Parameters子键下创建或修改名为TcpMaxDataRetransmissions的REG_DWORD值,该值的范围是从0到4294967295,缺省值为5,根据实际情况进行设置。

     TcpMaxConnectRetransmisstions

      TcpMaxConnectRetransmisstions的值表示TCP连接重发,TCP退出前重发非确认连接请求(SYN)的次数。对于每次尝试,重发超时是成功重发的两倍。在Windows Server 2003中默认超时次数是2,默认超时时间为3秒(在注册表项TCPInitialRTT中)。速度较慢的WAN连接中超时时间可相应增加,不同环境中可能会有不同的最优化设置,需要在实际环境中测试确定。超时时间不要设置太大否则将不会发生网络连接超时时间。具体操作:

      浏览至HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters注册表子键,在Parameters子键下创建或修改名为TcpMaxConnectRetransmisstions的REG_DWORD值,该值的范围是从0到255,缺省值为2,根据实际情况进行设置。然后在Parameters子键下创建或修改名为TCPInitialRTT的REG_DWORD值,同样根据实际情况进行设置。

    TcpAckFrequency

      TcpAckFrequency的值表示系统发送应答消息的频率。如果值为2,那么系统将在接收到2个分段之后发送应答,或是在接收到1个分段但在200毫秒内没有接收到任何其他分段的情况下发送应答;如果值为3,那么系统将在接收到3个分段之后发送应答,或是在接收到1个或2个分段但在200毫秒内没有接收到任何其他分段的情况下发送应答,以此类推。如果要通过消除应答延迟来缩短响应时间,那么建议将该值设为1。在此情况下,系统会立即发送对每个分段的应答;如果连接主要用于传输大量数据,而200毫秒的延迟并不重要,那么可以减小该值以降低应答的开销。

      缺省情况下,系统将该值设为2,即每隔一个分段应答一次。该值的有效范围是0到255,其中0表示使用缺省值2,可以根据具体需求修改,具体操作:

      浏览至HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParametersInterfacesxx(xx由网络适配器决定)注册表子键,在xx子键下创建或修改名为TcpAckFrequency的REG_DWORD值,该值的范围是从1到13,缺省值为2,根据希望每发送几个分段返回一个应答而设置该值,建议百兆网络设为5,千兆网络设为13。

    "KeepAliveTime"=dword:006ddd00
    
    "KeepAliveInterval"=dword:000003e8
    
    "MaxDataRetries"="5"
    

      

    step4: 重启windows,配置项生效。

    学习时的痛苦是暂时的 未学到的痛苦是终生的
  • 相关阅读:
    [Python] Calculate pi With MonteCarlo
    二次函数闭区间求最小值、、
    [2013.10.30 Luogu OJ P1509]找啊找啊找GF
    IE8下绝对居中的margin:auto兼容问题解决办法
    上传文件过长中间显示省略号
    全选
    往textarea中光标所在位置插入文本
    侧栏悬浮窗
    IE火狐兼容小知识点(即时更新)
    排序、添加、删除、上移、下移功能
  • 原文地址:https://www.cnblogs.com/grimm/p/15294486.html
Copyright © 2011-2022 走看看