Linux下tomcat报too many open files错误解决方法

问题描述

tomcat日志中报too many open files导致程序无法读取文件错误。

报错原因

出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值。

java.IOException:打开的文件过多

经搜索,发现是由于Linux默认设置的句柄数为1024,当并发量过大,就不够用了;

原因:

操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候.因为为了执行每个用户的应用服务器都要加载很多文件(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

重启系统,才能生效.

Linux下tomcat报too many open files错误解决方法

ulimit -a 查看所有设置

ulimit -u 65535(新的open files 值)修改设置

ulimit -n 65536 设置用户可以同时打开的最大文件数(max open files) 默认是2048

如果本参数设置过小,对于并发访问量大的网站,可能会出现too many open files的错误 。

Linux下tomcat报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


分享到:


相關文章: