问题描述
Tomcat日志中报too many open files导致程序无法读取文件错误 。
报错原因
出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值 。
JAVA.IOException:打开的文件过多
经搜索,发现是由于linux默认设置的句柄数为1024,当并发量过大,就不够用了;
【Linux下tomcat报too many open files错误解决方法】原因:
操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候.因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏.
解决:
- 尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄.
- java的垃圾回收不能关闭网络连接打开的文件句柄,如果没有执行close()(例如:java.net.Socket.close())则文件句柄将一直存在,而不能被关闭.你也可以考虑设置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
推荐阅读
- 一文看懂Linux系统中的lsmod、lsof、lspci、lsscsi命令
- 柚子挑选硬的还是软的 柚子下面凹进去是好还是不好
- linux系统ncat命令详解
- 梦见飞机掉下来人没事着火了 梦见飞机掉下来人没事然后又飞走了
- 梦见天有异象天灾降临马下来 梦见天有异象天灾降临小火球掉落
- Python3 基础语法
- 坐月子吃什么能下奶?
- 汽车内的这些英文按键完全看不懂?这几个你需要了解一下
- 经济“内循环”下房地产还能撑多久,未来房子真的会是白菜价吗?
- 北京市职工2020年7月最新社保、公积金缴费基数上下限
