jmeter 如何解决java.net中出现的错误,打开的文件太多

mqxuamgl  于 2022-11-09  发布在  Java
关注(0)|答案(2)|浏览(344)

我一直在使用JMeter对我的REST API进行负载测试。
当遇到1000个并发用户时,出现以下错误:

Too many open files. Stacktrace follows:
java.net.SocketException: Too many open files
    at java.net.Socket.createImpl(Socket.java:397)
    at java.net.Socket.getImpl(Socket.java:460)
    at java.net.Socket.setSoTimeout(Socket.java:1017)
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:126)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:476)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:441)
    at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:390)

我的服务器尝试访问另一个REST API来获取数据并进行处理,最后返回一个JSON响应。
如何增加Linux中打开文件的数量?
以下是我正在对另一个服务器进行的调用

Map getResponse(Map data, String url){
    HTTPBuilder httpBuilder = new HTTPBuilder(url);
    httpBuilder.request(Method.POST, JSON) {
        headers.'Authorization' = AppConfig.config.appKey;
        headers.'Content-type' = 'application/json'
        body = data
        response.success = { resp, reader ->
            return reader as Map;
        }
        response.failure = { response, reader ->
            return null
        }
    }
}
tmb3ates

tmb3ates1#

您确实打开了最大数量的文件/套接字。在Linux机器上打开的文件或套接字的最大数量默认为1024。您需要更改它。您可以参考此java.net.SocketException Too many open files
您可以使用下面的查询从您的终端检查,以获得允许打开的文件的最大数量

ulimit -n

here开始:
现在的情况是底层套接字没有关闭,最终JVM会遇到系统对打开文件描述符的每个进程的限制。
正确的解决方案是在正确的时间关闭套接字(我猜是在服务器关闭连接端的时候或之后不久)。这对HttpURLConnection来说似乎很难做到。这一切都很混乱:

  • disconnect()似乎只是立即关闭它--或者不关闭; Javadoc故意对它实际执行的操作含糊其辞,尤其是在执行操作时。
  • close()可能是正确的选择。Java bug #4147525的评估部分指出:“...在输入和/或输出流上调用close()。这将正确地导致在您不执行keepalive连接时关闭基础套接字,并将正确地缓存和重用keepalive连接(这些连接将在短时间后超时并自行关闭)。”
  • 但也许不是。错误#4142971说:“调用close()方法对底层HTTP连接是否持久没有任何影响.”

如果没有明确的答案,也许可以将HttpURLConnection对象添加到一个列表中,并在测试运行结束时立即断开所有连接。这仍然会限制运行的总大小,但至少丢失的描述符不会在运行之间累积。

也许真实的的答案是给予HttpURLConnection,而使用Jakarta Commons的HTTP客户端。有人建议,在连接到另一个问题(bug #4143518)。

whitzsjs

whitzsjs2#

**“java.net.套接字异常:任何Java服务器应用程序(如Tomcat、Weblogic、WebSphere等)都可以看到“打开了太多文件”,客户端频繁连接和断开连接。

You can find out how to solve**"java.net.SocketException: Too many files open"**here

相关问题