РЕДАКТИРОВАТЬ: теперь у меня есть решение, но я бы очень хотел получить краткое описание различных ограничений, то есть ограничений, установленных FD_SIZE, файлов пределов launchtl, sysctl -w kern.maxfilesperproc, ulimit и т. Д.)
Может кто-нибудь помочь мне понять ограничения на открытые файловые дескрипторы на OSX. Улимит дает мне один ответ:
$ 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
.
Однако мое приложение может открывать файлы размером 10 тыс. Перед сбоем, как сообщает lsof
, например: * 10101 *.
$ lsof -p 87599 | wc
10279 92505 1418903
(он дает сбой где-то между 10279 и 10305 открытых файлов, надежно)
Таким образом, в игру вступают явно разные ограничения. Я также видел разговор (по вышеуказанной ссылке) о FD_SETSIZE
.
Может кто-нибудь объяснить мне, каковы различные ограничения и как они установлены?
Если это уместно, я работаю над созданием библиотеки C / C ++ для использования в Java с использованием SWIG.
EDIT:
Я также попробовал:
sudo sysctl -w kern.maxfiles=20000
безуспешно. Также
#define FD_SETSIZE 20000
не имеет никакого эффекта.
EDIT:
Также попробовал
launchctl limit maxfiles 20000 20000
без эффекта.
EDIT:
Решение:
sysctl -w kern.maxfilesperproc=20000
(через http://krypted.com/mac-os-x/maximum-files-in-mac-os-x/)
РЕДАКТИРОВАТЬ: я написал небольшую программу для проверки этого (на основе Как увеличить предел «максимально открытых файлов» в C на 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);
}