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

或執行:ulimit -n 4096(本次生效,服務器重啟后恢復原配置)

將open files (-n) 1024 設置成open files (-n) 4096,這樣就增大了用戶允許打開的最大文件數

 

注意:

cron表達式需正確書寫,否則xxl-job無法識別,導致任務啟動后每秒都在調度(應該沒有幾個任務可以確保一秒執行完成)直接導致你的任務全部掛起未執行。

一秒掛一個想想上面設置的最大值65535能支撐多久,所以說cron表達式在定時任務執行中是很重要的。

 

參考博客:分布式調度中xxl-job任務調度失敗——java.io.IOException: Too many open files

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM