今天在對項目進行性能壓力測試時,設置並發量為1000,發現Tomcat控制報錯:
java.IOException:打開的文件過多
經搜索,發現是由於Linux默認設置的句柄數為1024,當並發量過大,就不夠用了;
原因:
操作系統的中打開文件的最大句柄數受限所致,常常發生在很多個並發用戶訪問服務器的時候.因為為了執行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏.
解決:
- 盡量把類打成jar包,因為一個jar包只消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄.
- java的垃圾回收不能關閉網絡連接打開的文件句柄,如果沒有執行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關閉.你也可以考慮設置socket的最大打開數來控制這個問題.
- 對操作系統做相關的設置,增加最大文件句柄數量。
采用增大句柄數的方法解決;
- 查看當前設置句柄數:ulimit -a
可以看到,open files 為1024, 而且提示了參數為 -n,下面我們修改該值: ulimit -n 65536
再次查看:ulimit -a
open files 已經變成我們需要的 65536
不過上述修改方法只是當前生效,如果要永久生效,還是要修改配置文件
在/etc/security/limits.conf 添加 (* 代表所有用戶有效,你也可以配置具體的用戶名)
* soft nofile 65536
* hard nofile 65536
可復制運行此段:
echo -ne "
* soft nofile 65534
* hard nofile 65534
" >>/etc/security/limits.conf
- 修改完退出重新登錄就生效了,可重新用ulimit -a查看是否生效。
參考鏈接:https://jameswxx.iteye.com/blog/2096461
http://www.360doc.com/content/12/1116/13/834950_248186612.shtml