Too many open files 问题的解决

今天发现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 读取数据没关闭
系统级解决方法:

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值