【发布时间】: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);
}
【问题讨论】: