连接到目标主机时捕获的I / O异常(java.net.SocketException):打开的文件太多

时间:2014-03-02 13:44:41

标签: java jmeter

我正在使用Apache Jmeter来测试我们的应用程序,但突然间Jmeter显示的大多数错误都是

java.net.SocketException: Too many open files at java.net.Socket.createImpl(Socket.java:447) at java.net.Socket.getImpl(Socket.java:510) at java.net.Socket.setSoTimeout(Socket.java:1101)
at org.apache.http.conn.scheme.PlainSokcetFactory.connectSocket(PlainSocketFactory.java:126)

当我在互联网上搜索关于这个错误的大部分评论是因为机器的开放限制,然后有一个答案说实体应该消耗,当我尝试消耗实体时错误的数量减少但不是那么多。有没有其他方法来处理这种错误?

2 个答案:

答案 0 :(得分:1)

Linux计算机上的默认最大打开文件和/或套接字数为1024.

如果您的测试超过了它,但您不应该检查测试并检测并修复泄漏。

如果它是预期的,你只是增加文件/套接字的限制,应该可以将它们增加到相当高的值。请参阅ulimit命令参考和limits.conf文件的信息。或者,您可以尝试以root用户身份运行JMeter。

要获得允许的最大打开文件数,请执行

ulimit -n 

在终端

参考文献:

希望这有帮助

答案 1 :(得分:0)

最可能的原因是你创建了很多Socket但没有正确地.close()

您没有显示代码,因此没有人可以为您解决此问题;无论如何,在处理Socket时,或者实际上任何实现Closeablewhich Socket does)的类都有经典习语。

使用Java 6:

final Closeable closeable = whatever(); // or Socket, or InputStream, or...
try {
    doSomethingWith(closeable);
} finally {
    closeable.close();
}

使用Java 7:

try (
    final Closeable closeable = whatever();
) {
    doSomethingWith(closeable);
}
// Automatically closed for you

注意:对于Java 7,它实际上是实现AutoCloseable的任何东西;并Closeable延长AutoCloseable

注意2:如果Java 6并且您可以负担Guava 14+,请考虑使用Closer