zoukankan      html  css  js  c++  java
  • Jmeter接口压力测试,Java.net.BindException: Address already in use: connect

    Java.net.BindException: Address already in use: connect

    问题原因:

    操作系统会为TCP/IP服务预留临时端口,Jmeter在跑并发测试的时候每开启一个线程(new socket操作)就会占用一个临时端口,若TCP/IP端口被占完了,而且没有及时释放(socket.close()操作不能立即释放绑定的端口,而是把端口设置为TIME_WAIT状态,过段时间才会真正释放,默认是240s),就会出现Java.net.BindException: Address already in use: connect这种情况。

    解决方案:

    从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。

    1.增加预留给TCP/IP服务的端口数量。

    1.1 如果Jmeter的运行平台在Windows端。

    在 Microsoft Windows XP 或 Windows Server 2003 中,由 Windows 套接字分配给应用程序的临时 TCP 或 UDP 端口号的最大值是由注册表设置 MaxUserPort 控制的,该参数的默认值为 5000。临时端口从端口号 1025 开始编号。因此,默认情况下,Windows XP 或 Windows Server 2003 会为执行通配绑定的应用程序分配一个范围从 1025 到 5000 的号码。

    要在运行 Windows XP 或 Windows Server 2003 的计算机上更改临时端口的最大值,请执行以下操作:

    1.

    单击开始,再单击运行,键入 regedit.exe,然后单击确定

    2.

    找到而后单击以下注册表子项:

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

    3.

    编辑菜单上,指向新建,然后单击双字节值

    4.

    键入 MaxUserPort,然后按 ENTER。

    5.

    双击 MaxUserPort 值,然后以十进制或十六进制键入最大值。

    键入的数值必须在 5000¨C65534(十进制)之间。如果此参数设置的值超出有效范围,则使用最接近的有效值(5000 或 65534)。

    6.

    单击确定

    7.

    退出注册表编辑器。

    警告 如果错误使用注册表编辑器,可能会导致严重问题以至于需要您重新安装操作系统。Microsoft 无法保证您能够解决由于错误使用注册表编辑器而引起的问题。您必须自行承担使用注册表编辑器所带来的风险。

     

    必须重新启动计算机,方可使 MaxUserPort 注册表设置更改生效。

    如果应用程序使用通配绑定同时打开大量连接,可能只需更改这个值,而且需确保应用程序不会用尽可用的临时端口。例如,一个使用文件传输协议 (FTP) 传输大量小文件的数据备份应用程序就可能用尽临时端口。

    (具体操作见博客:https://www.cnblogs.com/zhengah/p/5102403.html)

    1.2 调高你的web服务器的最大连接线程数,调到1024或者2048,以resin为例,修改resin.conf中的thread-pool.thread_max,如果你采用apache连resin的架构,别忘了再调整apache;

    2. 加快被占用端口的释放速度

    在red hat上,查看有关的选项,
    [xxx@xxx~]$ /sbin/sysctl -a|grep net.ipv4.tcp_tw
    net.ipv4.tcp_tw_reuse = 0
    net.ipv4.tcp_tw_recycle = 0
    [xxx@xxx~]$vi /etc/sysctl,修改
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    [xxx@xxx~]$sysctl -p,使内核参数生效

    3.补充(测试几天以后)

    我使用Windows平台的Jmeter,通过修改注册表的方式开放了更多的Tcp/ip临时端口(见1.1),刚开始效果很明显,但是过了两三天,又变成原样了。这是实际测试结果,原因未知。

    然后我把Jmeter部署到了Centos7操作系统上,修改配置文件sysctl(见2),就很少出现这个问题了。

    (转载请标明出处)

  • 相关阅读:
    关于java.lang.reflect.InvocationTargetException
    Java并发编程(三)后台线程(Daemon Thread)
    Lab 7-2
    Lab 7-1
    Lab 6-3
    Lab 6-2
    Lab 6-1
    Lab 5-1
    Lab 3-4
    Lab 3-3
  • 原文地址:https://www.cnblogs.com/mungerz/p/10393279.html
Copyright © 2011-2022 走看看