前幾天突然測試環境的項目突然不能用了,打開tomcat的log檢視報錯:
too many file open
人話就是句柄不夠用了,一般原因有兩個:1.打開的應用過多超出了伺服器限制 2.代碼中有未關閉的連接配接,流之類的導緻的socket洩露,需要排查。不過要程式能先跑起來,可以先增大句柄(file)數。
1.運作指令 ulimit -a可以看到
[[email protected] ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127979
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 127979
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
标紅的隻有1024,增大一下吧。
2.vi /etc/pam.d/login
在檔案中增加一行:
session required /lib/security/pam_limits.so
注:有這一行的不用增加了
3:vi /etc/security//limits.conf
檔案中增加:
root soft nofile 655360
root hard nofile 655360
* soft nofile 655360
* hard nofile 655360
注:如果檔案中有這四行,隻修改末尾的數字即可。
4.關閉連接配接重新登入:運作一下ulimit -a 即可看到完成了修改。
注:另外可以根據程序檢視是哪個程序洩露了socket:
lsof -p pid|wc -l
檢視系統總限制 指令:cat /proc/sys/fs/file-max
檢視整個系統目前使用的檔案句柄數量指令:cat /proc/sys/fs/file-nr
也可以看到某個目錄 /檔案被什麼程序占用了,顯示已打開該目錄或檔案的所有程序資訊 :lsof path/filename