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

mo-*_*eph 27 macos file-io

编辑:我现在有一个解决方案,但我真的很清楚简要描述不同的限制是什么,即由FD_SIZE,launchtl限制文件,sysctl -w kern.maxfilesperproc,ulimit等设置的限制.

有人可以帮我理解OSX上打开文件句柄的限制.ulimit给了我一个答案:

$ ulimit -a
...
open files                      (-n) 256
Run Code Online (Sandbox Code Playgroud)

我无法ulimit改变这一点,但人们建议使用launchctl(例如http://usrinapto.wordpress.com/2010/03/06/mac-os-x-10-6-max-open-files-too-many -open-files /)

但是,使用它不会改变报告的限制ulimit.

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

$ lsof -p 87599 | wc
10279   92505 1418903
Run Code Online (Sandbox Code Playgroud)

(它可靠地在10279和10305打开的文件之间崩溃)

所以有明显不同的限制.我也看过(在上面的链接上)的谈话FD_SETSIZE.

有人可以向我解释不同的限制是什么,以及它们是如何设置的?

如果它是相关的,我正在使用SWIG包装一个用于Java的C/C++库.

编辑:我也尝试过:

sudo sysctl -w kern.maxfiles=20000
Run Code Online (Sandbox Code Playgroud)

没有成功.也

#define FD_SETSIZE 20000
Run Code Online (Sandbox Code Playgroud)

没有效果.

编辑:也尝试过

launchctl limit maxfiles 20000 20000
Run Code Online (Sandbox Code Playgroud)

没有效果.

编辑:解决方案:

sysctl -w kern.maxfilesperproc=20000
Run Code Online (Sandbox Code Playgroud)

(来自http://krypted.com/mac-os-x/maximum-files-in-mac-os-x/)

编辑:我已经编写了一个小程序来测试它(基于如何在Mac OS X上增加C中"最大打开文件"的限制),并发现我可以要求的最大打开文件数是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);
}
Run Code Online (Sandbox Code Playgroud)

mo-*_*eph 23

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

sysctl -w kern.maxfilesperproc=20000
Run Code Online (Sandbox Code Playgroud)

  • 10.7.5,似乎不起作用:`sudo sysctl -w kern.maxfilesperproc = 20000`打印:`kern.maxfilesperproc:20000 - > 20000` - 好的,然后`ulimit -S -n`打印1024后呢? ? (5认同)
  • @yetanothercoder,来自上面链接的文章:"一旦你完成了这个,内核本身将拥有最大数量的文件,但shell可能没有.并且因为大多数将占用这么多文件的进程将由你想要增加它的shell.你可以使用ulimit命令更改shell限制.为此:`ulimit -S -n 2048`" (3认同)

小智 7

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

限制maxfiles 400000
无限制

(来源)

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

  • 基准测试工具通常需要打开数十万个文件(或套接字,而不是).例如,我正在用一个约100000个开放连接的小服务器. (5认同)