有人可以帮我理解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);
}
答案 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)
...为什么你一下子需要这么多打开的文件呢?