今天发现tomcat报异常,java.lang.RuntimeException: java.io.FileNotFoundException: /usr/local/apache-tomcat-6.0.32/webapps/jrtSubChannel/WEB-INF/classes/jrtSubChannel.properties (Too many open files)
检查程序发现,properties 读取数据没关闭
系统级解决方法:
具体查看命令:
已得到实验:
另外的解释
检查程序发现,properties 读取数据没关闭
系统级解决方法:
lsof -p 12349 查看链接数,12349是tomcat的进程
lsof -P 12349|wc -l
ulimit -u 查看open files设置
ulimit -a 查看所有设置
ulimit -u 65535(新的open files 值)修改设置
ulimit -n 65536 设置用户可以同时打开的最大文件数(max open files)
如果本参数设置过小,对于并发访问量大的网站,可能会出现too many open files的错误
使用lsof -p pid [httpd进程的 pid、java的pid]来查看系统中apache进程和java运行时进程当前打开的文件资源,发现两者之和已经接近1024,大于了默认的设置。
修改配置:
修改/etc/security/limits.conf,在文件末加上
* soft nofile 65536
* hard nofile 65536
系统级文件描述符极限还可以通过将以下三行添加到 /etc/rc.d/rc.local 启动脚本中来设置:
# Increase system-wide file descriptor limit.
echo 65536 > /proc/sys/fs/file-max
echo 65536 > /proc/sys/fs/inode-max
具体查看命令:
lsof |wc -l
ps -ef|grep tomcat
lsof -p 18962|wc -l
lsof -p 18962
lsof -p 18962
ps -ef|grep tomcat
lsof -p 15518
linux下, 单个进程默认打开的最多socket是1021个, 其实是1024, 其它三个分别被: stderr, stdin, stdout占用.
要突破1024的限制, 需要改如下三个文件:
1. /etc/init.d/ssh
添加: ulimit -HSn 65536
2. /etc/init.d/cron
添加: ulimit -HSn 65536
3. /etc/security/limits.conf
添加: * hard nofile 65536
查看方法:
ulimit -a , 看 open files数目是不是已经修改成65536
需要重连ssh。
已得到实验:
修改/etc/security/limits.conf,在文件末加上
* soft nofile 65536
* hard nofile 65536
重新启动即可
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_conntrack_max = 65536
这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,以节省对内核内存的占用。
/sbin/sysctl -p
发现错误 发现错误出现:
error: "net.ipv4.ip_conntrack_max" is an unknown key
解决方法:modprobe ip_conntrack
或者
vi /etc/rc.d/rc.local
/sbin/modprobe ip_conntrack
或 echo "modprobe ip_conntrack" >> /etc/rc.local
另外的解释
inux下面增加打开文件数的限制:fs.file-max
在linux下面如果报告:too many file opened,就需要增加系统允许打开的文件数。通常默认的是1024(可以通过ulimit查看),要增加这个限制数,需要修改如下的文件:
1 /etc/sysctl.conf,增加:
fs.file-max=65536
2 /etc/security/limits.conf,增加:
* soft nofile 32768
* hard nofile 65536
即file-max是设置 系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。
也就是说,这项参数是系统级别的。
echo 6553560 > /proc/sys/fs/file-max
或修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重启生效
2. ulimit的
Provides control over the resources available to the shell and to processes started by it, on systems that allow such control.
即设置当前shell以及由它启动的进程的资源限制。
显然,对服务器来说,file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题,为了让机器在重启之后仍然有效,强烈建立作以下配置,以确保file-max, ulimit的值正确无误:
1. 修改/etc/sysctl.conf, 加入
fs.file-max = 6553560
2.系统默认的ulimit对文件打开数量的限制是1024,修改/etc/security/limits.conf并加入以下配置,永久生效
* soft nofile 65535
* hard nofile 65535