问题描述
Tomcat日志中报too many open files导致程序无法读取文件错误。
报错原因
出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值。
JAVA.IOException:打开的文件过多
经搜索,发现是由于linux默认设置的句柄数为1024,当并发量过大,就不够用了;
原因:
操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候.因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏.
解决:
增加最大文件句柄数量:
nofile(可打开的文件描述符的最大数)和nproc(单个用户可用的最大进程数量)
cp /etc/security/limits.conf /etc/security/limits.conf_bak
echo "### add by css ### " >>/etc/security/limits.conf
echo "* soft nofile 65536" >>/etc/security/limits.conf
echo "* hard nofile 65536" >>/etc/security/limits.conf
echo "* soft nproc 65536" >>/etc/security/limits.conf
echo "* hard nproc 65536" >>/etc/security/limits.conf
重启系统,才能生效.
ulimit -a 查看所有设置
ulimit -u 65535(新的open files 值)修改设置
ulimit -n 65536 设置用户可以同时打开的最大文件数(max open files) 默认是2048
如果本参数设置过小,对于并发访问量大的网站,可能会出现too many open files的错误 。
使用lsof -p pid [httpd进程的 pid、java的pid]来查看系统中Apache进程和java运行时进程当前打开的文件资源:
lsof -p `ps -ef|grep tomcat|grep -v "grep --color=auto tomcat"|awk '{print $2}'` | wc -l