报错:
java.io.IOException: Too many open files
原因:
linux操作系统的中打开文件的最大句柄数受限所致,在多个用户并发访问服务器时,为了执行每个用户的请求,应用服务器要加载多个文件(new一个socket就需要一个文件句柄),以 CentOS 做 API 接口服务供其他终端调用时,并发量高会报错:java.io.IOException: Too many open files。
其原因是在 Linux 下默认的Socket最大连接数为 1024(可以通过 ulimit -n 查看)。超过这个数这就会导致打开文件的句柄的缺乏。
ulimit -n
解决方案:
解决思路及过程
一:把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类(xxljob 一个类)就消耗一个文件句柄。
二:java的垃圾回收不能关闭网络连接打开的文件句柄,如果没有执行close()(例如:java.net.Socket.close())则文件句柄将一直存在,而不能被关闭,也可以考虑设置socket的最大打开数来控制这个问题。
三:对操作系统做相关的设置,增加最大文件句柄数量。(推荐)
查看系统允许打开的最大文件数(句柄数)
cat /proc/sys/fs/file-max
查看每个用户允许打开的最大文件数
ulimit -a
发现系统默认的是open files (-n) 1024,问题就出现在这里。
在系统文件 /etc/security/limits.conf 中修改这个数量限制(系统文件慎重修改)
解决操作
vim /etc/security/limits.conf
在底部新增下面4行:
- soft nproc 65535
- hard nproc 65535
- soft nofile 65535
- hard nofile 65535
保存后退出。
说明:
soft nproc: 可打开的文件描述符的最大数(软限制)
hard nproc: 可打开的文件描述符的最大数(硬限制)
soft nofile:单个用户可用的最大进程数量(软限制)
hard nofile:单个用户可用的最大进程数量(硬限制)
无需重启 Linux 服务器,只需重启xxl-job的服务即可生效。
ps -ef | grep xxl-job
service deploy restart xxl-job-admin-2.0.2 // (这个看每个人具体的版本)
或执行:ulimit -n 4096(本次生效,服务器重启后恢复原配置)
它会将open files (-n) 1024 设置成open files (-n) 4096,这样就增大了用户允许打开的最大文件数