我正在创建一个小实用程序,它接收大量HTTP请求。它是用java编写的,并使用embedded-jetty通过https处理请求。
我为它提供了一个负载测试工具,但是当它运行了一段时间之后,它开始抛出异常:
java.net.BindException: Address already in use: connect(请注意,这是发件人一方,而不是我的项目)
据我所知,这意味着当另一个connect被调用时,系统中没有发现更多的空闲套接字。吞吐量是关于每秒1000请求,并且故障开始出现在20000到50000请求之后的某个地方。
然而,当我在另一个程序中使用相同的负载测试工具(一种简单的使用者,由一些同事用scala使用netty编写--它只是接收所有请求并返回空的ok响应)--套接字没有这样的问题(尽管典型的速度比1.5-2慢一倍)。
我想知道是否可以通过告诉Jetty在发送回复后立即关闭连接来解决这个问题。无论如何,每个新请求都是通过新连接发送的。我试着玩Connector#setIdleTimeout --在默认情况下它似乎是30000,但没有成功。
我能做些什么来解决这个问题--或者至少更深入地研究这个问题,找出其原因(如果我的建议是错的)?
UPD感谢您的建议,我认为我不允许发布源代码,但我想我应该研究客户机的代码(这将使我忙碌一段时间,因为它是用scala编写的)。
发布于 2015-04-30 12:11:26
我发现客户端确实有一个问题--它在头中用Connection: Keep-Alive发送请求,但是为每个请求创建新的HttpURLConnection,然后调用disconnect()方法。
为了解决服务器端的这一问题,在响应头中发送Connection: close就足够了,因为我不允许更改测试实用程序。
https://stackoverflow.com/questions/29844509
复制相似问题