xxl-job任务调度失败——java.io.IOException: Too many open files
2022/1/6 17:11:31
本文主要是介绍xxl-job任务调度失败——java.io.IOException: Too many open files,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
错误日志:
msg: com.xxl.rpc.util.XxlRpcException: java.lang.IllegalStateException: failed to create a child event loop at com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean$1.invoke(XxlRpcReferenceBean.java:227) at com.sun.proxy.$Proxy78.run(Unknown Source) at com.xxl.job.admin.core.trigger.XxlJobTrigger.runExecutor(XxlJobTrigger.java:196) at com.xxl.job.admin.core.trigger.XxlJobTrigger.processTrigger(XxlJobTrigger.java:149) at com.xxl.job.admin.core.trigger.XxlJobTrigger.trigger(XxlJobTrigger.java:74) at com.xxl.job.admin.core.thread.JobTriggerPoolHelper$3.run(JobTriggerPoolHelper.java:77) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IllegalStateException: failed to create a child event loop at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:88) at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:58) at io.netty.channel.MultithreadEventLoopGroup.(MultithreadEventLoopGroup.java:52) at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:87) at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:82) at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:63) at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:51) at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:43) at com.xxl.rpc.remoting.net.impl.netty_http.client.NettyHttpConnectClient.init(NettyHttpConnectClient.java:48) at com.xxl.rpc.remoting.net.common.ConnectClient.getPool(ConnectClient.java:110) at com.xxl.rpc.remoting.net.common.ConnectClient.asyncSend(ConnectClient.java:41) at com.xxl.rpc.remoting.net.impl.netty_http.client.NettyHttpClient.asyncSend(NettyHttpClient.java:18) at com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean$1.invoke(XxlRpcReferenceBean.java:216) ... 8 more Caused by: io.netty.channel.ChannelException: failed to open a new selector at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:169) at io.netty.channel.nio.NioEventLoop.(NioEventLoop.java:143) at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:127) at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:36) at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:84) ... 20 more Caused by: java.io.IOException: Too many open files at sun.nio.ch.IOUtil.makePipe(Native Method) at sun.nio.ch.EPollSelectorImpl.(EPollSelectorImpl.java:65) at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36) at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:167) ... 24 more
原因:
操作系统的中打开文件的最大句柄数受限所致,在多个用户并发访问服务器时,为了执行每个用户的请求,应用服务器要加载多个文件(new一个socket就需要一个文件句柄),以 CentOS 做 API 接口服务供其他终端调用时,并发量高会报错:java.io.IOException: Too many open files。
其原因是在 Linux 下默认的Socket最大连接数为 1024(可以通过 ulimit -n 查看)。超过这个数这就会导致打开文件的句柄的缺乏。
ulimit -n
解决方案:
一:把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
二: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
在文件中加入内容:
* soft nofile 65535 (注意:此处参数最大65536,如超过65536系统将会认为这儿为负数,这会导致外部ssh无法连接)
* hard nofile 65535(注意:此处参数最大65536,如超过65536系统将会认为这儿为负数,这会导致外部ssh无法连接)
* 表示修改所有用户的限制;
soft 代表软连接
hard 代表硬连接
无需重启 Linux 服务器,只需重启xxl-job的服务即可生效。
ps -ef | grep xxl-job service deploy restart xxl-job-admin-2.0.2
注意:
cron表达式需正确书写,否则xxl-job无法识别,导致任务启动后每秒都在调度(应该没有几个任务可以确保一秒执行完成)直接导致你的任务全部挂起未执行。
一秒挂一个想想上面设置的最大值65535能支撑多久,所以说cron表达式在定时任务执行中是很重要的。
参考博客:分布式调度中xxl-job任务调度失败——java.io.IOException: Too many open files
这篇关于xxl-job任务调度失败——java.io.IOException: Too many open files的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南