【发布时间】:2015-05-12 11:19:18
【问题描述】:
我已经设置了
kern.maxfiles=65536
kern.maxfilesperproc=65536
之后,我将以下命令放入我的 .zshrc 文件中
ulimit -n 30000
但是,如果我尝试从 Eclipse 运行基于 netty 的应用程序,则仅打开 10k 个套接字,然后发生 java IO 异常“打开的文件过多”。以下是堆栈跟踪。
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
at io.netty.channel.socket.nio.NioServerSocketChannel.doReadMessages(NioServerSocketChannel.java:135)
at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:68)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:510)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:467)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:381)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:834)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
我使用以下命令来检查我的服务器正在使用的打开文件/套接字的数量,当异常发生时,它总是显示一个略大于 10k 的值。
lsof -p <pid> | wc -l
【问题讨论】:
-
ulimit -a显示什么?此外,lsof -p <pid>将仅显示的句柄,您是通过其他进程打开套接字/句柄还是之前运行留下的东西? -
@ringbearer ulimit -a 显示如下 --t: cpu time (seconds) unlimited -f: file size (blocks) 65536 - d:数据段大小(kbytes)无限 -s:堆栈大小(kbytes)8192 -c:核心文件大小(块)0 - u:进程 709 -n:文件描述符 65536 不,我的应用程序本身正在打开所有套接字。我已经检查过了。没有留下任何其他流程。
标签: java sockets netty ulimit launchctl