如何解决java.net.SocketException错误:打开文件太多

时间:2015-05-13 06:34:31

标签: grails jmeter

我一直在使用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
        }
    }
}

2 个答案:

答案 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