问题描述: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个,如果超过了这个限制,进程将无法获取新的句柄,而从导致不能打开新的文件或者网络套接字,对于线上服务器即会出现服务被拒绝的情况。