OSX上每个进程的最大打开文件句柄数(以及如何增加)

时间:2011-03-21 12:17:06

标签: macos file-io

编辑:我现在有一个解决方案,但我真的很清楚对不同限制的简要描述,即由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来包装一个用于Java的C / C ++库。

编辑: 我也试过了:

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);
}

2 个答案:

答案 0 :(得分:23)

http://krypted.com/mac-os-x/maximum-files-in-mac-os-x/上找到:

sysctl -w kern.maxfilesperproc=20000

答案 1 :(得分:7)

  

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

     

限制maxfiles 400000
  无限

source

...为什么你一下子需要这么多打开的文件呢?