2014-03-02 120 views
0

我使用Apache的JMeter來測試我們的應用程序,但突然間大部分錯誤是顯示的JMeter是I/O異常(java.net.SocketException異常):打開的文件太多

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) 

當我在互聯網上搜索大多數關於這個錯誤的評論是因爲機器的開放限制,然後有一個答案,說實體應該被消耗,當我試圖消耗實體時,錯誤的數量是減少但不是那麼多。有沒有其他方法來處理這種錯誤?

回答

0

最可能的原因是您創建了很多Socket s,但沒有正確地.close()

你不顯示代碼,所以沒有人可以爲你解決這個問題;無論如何,在處理Socket s或確實任何類別實施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。打開的文件和或Linux計算機上的插座

+0

對不起,我是不允許張貼的工作守則的一部分,所以我剛剛張貼的錯誤消息,反正是它適用於HttpClient的? – anathema

+0

那麼,如果'HttpClient'實現'Closeable',是的它是 – fge

+0

我試圖關閉它,並以某種方式它沒有工作,我發現了一個片段,如httpClient。getConnectionManager()shutdown()方法。 。它是否與Closeable類似? – anathema

1

默認最大數量爲1024

如果測試超過它雖然不應該,你需要檢查你的測試和檢測並修復泄漏。

如果它是預期的並且你只是增加對文件/套接字的限制,應該可以將它們增加到合理的更高的值。請參閱ulimit命令參考和有關limits.conf文件的信息。或者,您可以嘗試以root用戶身份運行JMeter。

要得到允許打開文件的最大數執行

ulimit -n 
在終端

參考

希望這有助於

相關問題