• 环境:使用jmeter做压力测试的时候,我使用单机测试并且和服务器是在同一台机器上面压测。

  • 现象:脚本运行时报错Cannot assign requested address (Address not available)

  • 情况一、在网上百度都是说端口不够用,我使用netstat -tunlp命令查询发现并没有占用多少端口,几经辗转,最后发现是ip的问题,我的jmeter脚本里面写的是服务器的固定ip,由于在同一台机器上需要改成localhost才行,我尝试127.0.0.1也是不可以的。
    在这里插入图片描述

  • 情况二、端口不够用,这种情况使用网上说的修改端口的配置

    1. 在压测时查看服务器和客户机等待的端口数量
      netstat -na|grep TIME_WAIT | wc -l
    2. 查看开发的端口范围
      cat /proc/sys/net/ipv4/ip_local_port_range
      如果范围很小,则进行修改
      echo “1024 65535” > /proc/sys/net/ipv4/ip_local_port_range
    3. 调低端口释放后的等待时间, 默认为60s, 修改为15~30s
      echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
    4. 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0, 修改为1, 释放TIME_WAIT端口给新连接使用。
      echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
    5. 修改tcp/ip协议配置,快速回收socket资源, 默认为0, 修改为1.
      echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
      执行:sysctl -p ,使设置立即生效。
  • 情况三、我们压测的时候发送的请求特别多,而我们的端口数最大是65535,如果每个请求都单独占用一个端口那肯定是不够用的,
    通过命令查看 netstat -na|grep TIME_WAIT | wc -l 每次都很大,这时候看一下jmeter脚本的keepAlive是否勾选,我们需要勾选这个框就可以解决上述问题,原因参考yygr的文章—JMeter基础 – Keep-Alive在性能压测中的影响

      jmeter在发送http请求时,默认带有keep-alive,但我们通过查看jmeter配置文件发现并没有相关有效的连接时长配置,可以认定:jmeter中的请求都是无等待请求,response time约等于零,一旦连接数据接收完毕,或者接口处于空闲状态,连接便会断开
      
      所以在不修改jmeter默认配置情况下,每个线程都是独立的、全新的,无论是否勾选keep-alive,请求都不受影响(服务端强制要求短连接除外)
      
      在详细了解TCP连接的状态和关闭方式后,我们会发现TIME_WAIT状态是一个坑爹的存在!主动关闭连接的一方在发送最后一个ACK包后,无论对方是否收到都会进入TIME_WAIT状态,等待2MSL的时间,然后才能释放网络资源。MSL就是Maximum Segment Lifetime(数据包的最大生命周期),是一个数据包能在互联网上生存的最长时间,若超过这个时间则该数据包将会消失在网络中。操作系统通常会将2MSL设为4分钟,最低不少于30秒,因而TIME_WAIT状态一般维持在30秒至4分钟;
      对于Client而言,每个连接都需要占用一个端口,而系统允许的可用端口数不足65000个(这也是在TCP参数优化后才能达到)。因此,如果Client发起过多的连接且连接未关闭,就会有大量的连接处于TIME_WAIT状态,等待2MSL的时间后才能释放端口,于是Client会由于缺少可用端口而无法新建连接。
    

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐