在liunx下經常出現java.net.SocketException: Too many open files錯誤是什麼原因
釋出在Tomcat+linux伺服器上的專案經常報”java.net.SocketException: Too many open files"的錯誤,根據錯誤分析如下 :
Linux 系統預設的open files的設定是1024
通過 ulimit -a進行檢視。
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16127
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
訪問應用時,作業系統new Socket去連線檔案,當連線數超過系統的設定時候,這時候就報了這類錯誤。
解決方法 :
1、設定Linux的允許的open files的個數,設定方法 ulimit -n 連線數
2、將classes目錄下的class檔案打包成jar的方式,減少new Socket的數量。
ulimit -n 4096
把開啟檔案數的上限設為了4096,這下好了,專案又穩定了,嘻嘻,正為這事高興了,
沒想到過兩天後又重新出這個錯誤了,鬱悶,兩個小時報一次,報之後就掛掉了,什麼原因了,
在重新用ulimit -a檢視,這下傻了,發現open files (-n) 1024 又變回了1024了,想到原因了,
報這個錯誤就在我那次登陸更新之後又報的,原來ulimit -n 4096 命令只能臨時的改變open files 的值,當
重新登陸後又會恢復,所以需要永久設定open files 的值才行啊,至於永久修改的方法大家可以google一下啊,
呵呵,這次永久修改後程式就再沒那個問題了,一直穩定執行。
另外遇到這個問題這後還需要檢查我們的程式對於操作io的流是否在操作完之後關閉,這才是從最更本上的解決。
以上就是我解決這個問題的過程,希望對大家有些幫助。
用ulimit -n 修改open files 總是不能保持。所以用下面一個簡單的辦法更好些。
修改/etc/security/limits.conf 新增如下一行:
* - nofile 1006154
修改/etc/pam.d/login新增如下一行
session required /lib/security/pam_limits.so