发布在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