【问题标题】:Maximum number of open filehandles per process on OSX (and how to increase)OS X 上每个进程的最大打开文件句柄数(以及如何增加)
【发布时间】:2011-03-21 12:17:06
【问题描述】:

编辑:我现在有一个解决方案,但我真的很欣赏对不同限制的简明描述,即由 FD_SIZE、launchtl 限制文件、sysctl -w kern.maxfilesperproc、ulimit 等设置的限制)

谁能帮助我了解 OSX 上打开文件句柄的限制。 ulimit 给了我一个答案:

$ ulimit -a
...
open files                      (-n) 256

我无法使用ulimit 来更改此设置,但人们建议使用launchctl(例如http://usrinapto.wordpress.com/2010/03/06/mac-os-x-10-6-max-open-files-too-many-open-files/

不过,使用它不会更改 ulimit 报告的限制。

但是,正如lsof 所报告的那样,我的应用程序似乎能够在崩溃之前打开 10k 个文件,例如:

$ lsof -p 87599 | wc
10279   92505 1418903

(它在 10279 到 10305 个打开的文件之间崩溃,可靠)

因此显然存在不同的限制。我还看到了FD_SETSIZE 的谈话(在上面的链接上)。

谁能向我解释一下不同的限制是什么,以及它们是如何设置的?

如果相关,我正在使用 SWIG 包装一个 C/C++ 库以在 Java 中使用。

编辑: 我也试过:

sudo sysctl -w kern.maxfiles=20000

没有成功。还有

#define FD_SETSIZE 20000

没有效果。

编辑: 也试过了

launchctl limit maxfiles 20000 20000

没有效果。

编辑: 解决方案:

sysctl -w kern.maxfilesperproc=20000

(通过http://krypted.com/mac-os-x/maximum-files-in-mac-os-x/

编辑:我写了一个小程序来测试这个(基于How to increase the limit of "maximum open files" in C on Mac OS X),发现我可以要求的最大打开文件数是10240:

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

struct rlimit limit;
void setLimit( int l );
void getLimit();

int main( int argc, char* argv[] )
{
    getLimit();
    setLimit(10240);
    getLimit();
    return 1;
}

void setLimit( int lim )
{
    limit.rlim_cur = lim;
    limit.rlim_max = lim;
    printf( "Setting limit to %d, %d\n", limit.rlim_cur, limit.rlim_max );
    if (setrlimit(RLIMIT_NOFILE, &limit) != 0) {
    printf("setrlimit() failed with errno=%d\n", errno);
    exit(1);
    }
}

void getLimit()
{
    /* Get max number of files. */
    if (getrlimit(RLIMIT_NOFILE, &limit) != 0)
    {
        printf("getrlimit() failed with errno=%d\n", errno);
        exit(1);
    }
    printf("The soft limit is %llu\n", limit.rlim_cur);
    printf("The hard limit is %llu\n", limit.rlim_max);
}

【问题讨论】:

    标签: macos file-io


    【解决方案1】:

    发现于http://krypted.com/mac-os-x/maximum-files-in-mac-os-x/:

    sysctl -w kern.maxfilesperproc=20000
    

    【讨论】:

    • 10.7.5,似乎不起作用:sudo sysctl -w kern.maxfilesperproc=20000 打印:kern.maxfilesperproc: 20000 -&gt; 20000 - 好的,然后ulimit -S -n 在它之后打印 1024 ???
    • @yetanothercoder,来自上面链接的文章:“一旦你这样做了,内核本身将拥有最大数量的文件,但外壳可能没有。因为大多数进程会占用这个许多文件将由你想要增加它的 shell 启动。你可以使用 ulimit 命令更改 shell 限制。这样做:ulimit -S -n 2048"
    • 我已经在 OS 10.8.5 上尝试了这两个步骤,重启后 ulimit -n 仍然是 256。
    【解决方案2】:

    要检查系统的限制,请运行: 'launchctl 限制'。更改最大值 运行的打开文件数:'launchctl 限制 maxfiles 400000 无限制'。到 更改设置永久添加到 文件:'/etc/launchd.conf' 以下行:

    限制最大文件数 400000
    无限制

    (source)

    ...为什么你需要同时打开这么多文件?

    【讨论】:

    • 不幸的是,这对我不起作用 - 我不确定设置的限制是什么,但它不允许我打开更多文件。
    • 至于为什么 - 我正在整理一个图书馆,并且不得不可怕地滥用它。一旦我可以验证它的行为正确,这将被重构。
    • 基准测试工具通常需要打开数十万个文件(或者说是套接字)。例如,我正在使用大约 100000 个打开连接的小型服务器。
    • 如果 /etc/launchd.conf 文件不存在,您可能需要创建它。 limit maxfiles 20000 20000 解决了我的问题,ulimit 反映了这一点。
    • 正如@ElliotCoad 提到的,在该文件中使用数字而非无限值。我在 10.8.5 上使用 limit maxfiles 65536 65536,它工作正常。
    猜你喜欢
    • 2011-03-11
    • 2011-10-01
    • 2013-06-09
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多