当前位置: 首页 > 面试题库 >

尝试进行快速的Socket创建和销毁以进行负载测试时出现“ java.net.BindException:地址已在使用中”

应志用
2023-03-14
问题内容

我正在尝试通过打开与服务器的大量套接字连接,进行身份验证,关闭连接,然后重复进行负载测试Java服务器。我的应用运行了一段时间,但最终我得到了:

java.net.BindException:地址已在使用中:connect

根据我阅读的文档,其原因是,在调用close()之后的一段时间内,关闭的套接字仍会占用分配给它们的本地地址。这取决于操作系统,但可能在几分钟左右。我尝试调用setReuseAddress(true)套接字,希望它的地址在close()被调用后可以立即重用。不幸的是,事实并非如此。

我创建套接字的代码是:

Socket socket = new Socket();
socket.setReuseAddress(true);
socket.connect(new InetSocketAddress(m_host, m_port));

但我仍然收到此错误:

java.net.BindException:地址已在使用中:过一会儿再连接。

还有其他方法可以完成我想做的事情吗?我想举个例子:打开100个套接字,将它们全部关闭,打开200个套接字,将它们全部关闭,打开300个,依此类推,最多可容纳2000个套接字。

任何帮助将不胜感激!


问题答案:

通过在两分钟的TIME_WAIT期间内打开许多出站套接字,就耗尽了出站端口的空间。您应该问自己的第一个问题是,这是否完全代表了现实的负载测试?真正的客户真的会这样做吗?如果没有,您只需要修改测试方法即可。

BTW SO_LINGER是 应用程序
在close()期间等待刷新数据的秒数。通常为零。如果这是发出关闭请求的结束时间,则该端口将在TIME_WAIT间隔内徘徊。这不是同一回事。可能会滥用SO_LINGER选项来解决此问题。但是,这也会在对等端引起异常行为,这又不是测试的目的。



 类似资料:
  • 我有一个类(A),它包含另一个类(B)的自动生成依赖项,而另一个类(B)又具有另一个类C的自动生成依赖项。 我正在尝试使用Mockito编写测试用例,并对依赖项使用spy注释。我在监视C类时遇到空指针错误。 如何从A类执行此单元测试?

  • 我试图测试一个基于Spring引导的Restendpoint。代码能够返回预期的输出,但测试失败,错误如下: 已解析[org.springframework.http.converter.HttpMessageNotWritableException:预设内容类型为“null”的[class java.util.LinkedList]没有转换器 对此有任何想法都将不胜感激! 下面是相同的代码: 控

  • 嗨,我是JMeter的新手,我知道如何使用JMeter执行负载测试。我试图弄清楚压力测试或容量测试是如何通过JMeter执行的。是不是通过逐渐增加JMeter中的线程数,我们可以确定何时出现性能问题,并获得阈值,在阈值以上运行测试。那它会做压力测试吗? 在如何执行压力测试和能力测试与Jeter工具混淆。

  • 我目前在AWS中使用Gatling加载测试我的服务。我使用HTTP做了几次负载测试,我的服务工作得很好。没有TLS握手错误。当我们移动到HTTPS时,负载测试结果显示TLS握手超时异常到处都是,最后因为未处理的请求排队而抛出OOM。 其他信息: Gatling场景如下:发送三个请求,然后使用头发送一个请求。我想模拟发送三个保持活动状态的请求,并在最后关闭它 我的服务由Kubernetes管理 我所

  • 问题内容: 我使用的是大猩猩网络套接字,我想在本地运行它,是指使用以下chrome客户端或其他推荐的工具……当我进入调试模式时,出现错误 我用 当我在Chrome或网络套接字客户端中运行以下网址时,出现错误 websocket:不是websocket握手:在“连接”标头中找不到“升级”令牌 我想运行它 并为本地模拟提供令牌,我该怎么做? 要检查它,我使用Chrome的Simple WebSocke

  • 我如何负载测试一个同时有300个用户使用jmeter的登录页面(而不是一个又一个用户。同时有300个用户登录)?线程组的设置应该是什么?