【问题标题】:Too many open files even after setting kern.maxfiles即使在设置 kern.maxfiles 之后打开的文件也太多
【发布时间】: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 &lt;pid&gt; 将仅显示 的句柄,您是通过其他进程打开套接字/句柄还是之前运行留下的东西?
  • @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


【解决方案1】:

增加你的文件描述符值来实现。您正在将值设置为“65536”,但通过添加您的 shell 仅调用 30000

请更改值,然后通过 su - 在当前会话中重新加载 bash 或打开新的终端/会话,然后重新启动您的应用程序。它必须工作

您可以通过以下链接设置 ulimit。

https://vasnlinux.wordpress.com/2015/05/01/linux-server-hardening/

【讨论】:

  • 我调用 30000 是因为我确保对于我的应用程序的当前会话,最多可以打开 20k 个套接字。所以我不需要65k。但是,我将 65k 设置为值,因为我需要对我的应用程序进行负载测试以获取高达 60k 的值。
  • 您是否在更改值后重新启动了您的应用程序,我相信您正在从 root 用户运行您的应用程序。如果不是,则需要对该用户配置文件进行更多修改。
  • 我正在从 Eclipse GUI 运行我的应用程序,是的,我已重新启动系统发布更改。
  • 您在老板池中为引导程序(EventLoopGroup 或等效项)配置了多少“线程”?对我来说,减少这个数字会减少打开文件的“虚拟”需求(似乎 Netty 为每个老板线程分配一个打开的文件)。通常接近 CPU 数量(或它的倍数)的数字是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2019-01-17
  • 2023-04-10
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多