Too many open files问题解决

问题描述:java工程,启动tomcat后发现catalina.out启动日志 报错“Too many open files”

原因:句柄数超出系统限制。

句柄含义:不单是文件,也包括打开的通讯链接(比如socket),正在监听的端口等等

解决:ulimit -a 可以查看当前系统设置的最大句柄数是多少,如下图 open files即是最大句柄数设置

查看全部进程占用句柄数总和:lsof|awk '{print $2}'|wc -l

查看某一个进程占用句柄数: ls -l /proc/pid(例如10124)/fd/ | wc -l

查看系统中进程打开文件数的一个排序:lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more

如果总和超过最大句柄数设置,则设置最大句柄数即可,命令如下

ulimit –n 65535  设置最大句柄数是65535

可以再次输入ulimit -a 查看确认是否生效,如下图

生效,解决! 

ulimit –n 2000

这个命令可以把默认的句柄数改为2000,但系统重启后会恢复默认值

这个文件在系统中的默认值配置在/etc/security/limits.conf文件中,加入以下配置:

* soft nofile 2000
* hard nofile 2000
或者

* - nofile 2000
其中hard的设置是实际的默认值,也就是上限,而soft的配置只是用来警告的,如果超过了soft的值,会有warn,而第三种用短横线– 的配置,则是hard和soft同时配置的方式。

扩展:linux句柄如何理解

在linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,在我们进行打开的时候会返回一个fd,即是文件句柄。如果频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象。在linux系统中对进程可以调用的文件句柄数进行了限制,在默认情况下每个进程可以调用的最大句柄数是1024个,如果超过了这个限制,进程将无法获取新的句柄,而从导致不能打开新的文件或者网络套接字,对于线上服务器即会出现服务被拒绝的情况。

 
原文地址:https://www.cnblogs.com/wanghongsen/p/11757634.html