java.net.SocketException:Too many open files 解決方案
問題說明
近期現場環境中,有一個跑在Tomcat容器里的服務報錯“java.net.SocketException:Too many open files”,導致整個平台訪問很慢很卡。
報錯截圖如下:

原因分析
Linux對打開文件的數量有限制,使用如下命令查看到的最大文件數量是1024,命令如下:
ulimit -a | grep open
或者
ulimit -n
解決方案
調整可以打開的最大文件數。
方式1(臨時方案):
使用命令修改可以打開的最大文件數,但是機器重啟后,就會失效。
ulimit -n 65535
方式2(根本方案):
修改配置文件
在 /etc/security/limits.conf 文件的最后增加如下內容,重啟機器即可。
# End of file root soft nofile 65535 root hard nofile 65535 * soft nofile 65535 * hard nofile 65535
PS:
往往這種問題,根源可能是由於多次打開某個文件或者創建了很多連接,沒有及時關閉導致的。可以通過如下命令查看某個進程打開的連接數:
lsof -p PID | wc -l
其中,PID 是服務對應的進程ID。
此時,需要仔細審核自己寫的代碼,檢查是不是有多次打開文件或者多次創建了連接,沒有及時關閉的情況。
