我一直在使用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
}
}
}
答案 0 :(得分:4)
您肯定会打开最大数量的打开文件/套接字。默认情况下,Linux计算机上打开的最大文件数或套接字数为1024。你需要改变它。您可以参考此java.net.SocketException Too many open files
您可以使用以下查询从终端检查以获取允许的最大打开文件数
ulimit -n
来自here:
发生的事情是底层套接字没有被关闭, 最终JVM陷入了系统的每个进程限制 打开文件描述符。
正确的解决方案是使插座靠近右侧 时间(我猜是服务器关闭的时间或之后不久) 它的连接结束)。 HttpURLConnection似乎很难。 一切都很困惑:
disconnect()似乎只是立即关闭它 - 或者不是; Javadocs故意模糊它实际上是什么 确实如此,特别是在它做的时候。
close()可能是正确的选择。评估部分 Java bug#4147525说:" ...在输入和/或上调用close() 输出流。这将正确地导致潜在的 当你不做保持活动时,套接字被关闭 连接并将正确缓存和重用keepalive 连接(并将超时并关闭自己 过了很短的时间之后)。"
但也许不是。 Bug#4142971说:"调用close() 方法对于是否有任何影响 底层HTTP连接是持久的。"
如果没有明确答案,可能是HttpURLConnection对象 添加到列表中,并在测试结束时立即断开连接 跑。这仍然限制了跑步的总大小,但至少是 丢失的描述符不会在运行之间累积。
也许真正的答案是放弃HttpURLConnection,而不是 使用Jakarta Commons的HTTP客户端。有人建议说 连接不同的问题(错误
#4143518
)。
答案 1 :(得分:0)
" java.net.SocketException:文件太多打开"可以看到任何Java Server应用程序,例如Tomcat,Weblogic,WebSphere等,客户端经常连接和断开连接。
You can find out how to solve "java.net.SocketException: Too many files open" here