前几天突然测试环境的项目突然不能用了,打开tomcat的log查看报错:
too many file open
人话就是句柄不够用了,一般原因有两个:1.打开的应用过多超出了服务器限制 2.代码中有未关闭的连接,流之类的导致的socket泄露,需要排查。不过要程序能先跑起来,可以先增大句柄(file)数。
1.运行命令 ulimit -a可以看到
[root@centos-7 ~]# 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