一、产生原因
too many open files是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:
ulimit -a
open files那一行就代表系统目前允许单个进程打开的最大句柄数,这里是1024
我们随机找一个java的程序,看看打开的句柄数是多少。lsof -p 进程id | wc -l
[root@ahhryy_app ~]# lsof -p 24652 | wc -l
157
可以看到下面这个java程序打开的句柄数是157. 有时候并发上来了,可能会超过系统设定的1024,特别是Ngnix程序,并发稍微大一点就会出现超过1024。
二、解决方法
下面我们来修改这个默认的1024大小。
- 增大允许打开的文件数——修改系统配置文件
vim /etc/security/limits.conf 在文件末尾添加
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
最前的 * 表示所有用户,可根据需要设置某一用户,上面都root和其他用户都设置好了。
- reboot 重启后生效,再去查看
ulimit -a
如果生产环境不允许重启,可以使用命令临时修改,不过配置文件也要跟着改哦,防止下次重启服务器失效
ulimit -u 65535 -n 65535
小提示:如果是云服务器(腾讯云、阿里云),系统初始化镜像的时候就给我们设置好了。