最近需要编写一个小工具,将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种:
- 修改操作系统限制
- 修改程序单次读取数据量
最终解决办法为修改程序单次读取数量。因为目前出现文件堆积的时候,数量可能上万、甚至几十万个文件。
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