java ftp-client 报错too many open files

最近需要编写一个小工具,将ftp中的文件转换到kafka消息队列之中.这里使用到了ftp工具包camel.

其中apache 官网:

https://camel.apache.org

 

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>2.24.1</version>
</dependency>

在开发测试,基本都有什么问题。
但是在其中一个环境中发现一个问题。

java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
at java.net.ServerSocket.accept(ServerSocket.java:421)

形成的原因:
Linux 打开的通讯链接(比如socket),正在监听的端口等等,也可以叫做句柄(handle),系统对句柄的数据量存在限制,因为一个句柄需要端口、内存,这些都是有限资源,如上的这个错误通常也可以叫做句柄数超出系统限制错误。

通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少。

排查之后解决办法可以分为2种:

  1. 修改操作系统限制
  2. 修改程序单次读取数据量

最终解决办法为修改程序单次读取数量。因为目前出现文件堆积的时候,数量可能上万、甚至几十万个文件。

linux 修改限制方法:

ulimit -n 2048

或者

vim /etc/security/limits.conf

.在文件最后加上两行:

#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student – maxlogins 4
* – nproc 102400
* – nofile 102400

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注