EDIT: теперь у меня есть решение, но я бы очень оценил краткое описание того, что представляют собой различные ограничения, то есть те, которые установлены FD_SIZE, файлы ограничения запуска, 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
.
Однако мое приложение, похоже, может открыть файлы 10k перед сбоем, о чем сообщает lsof
, например:
$ lsof -p 87599 | wc
10279 92505 1418903
(он падает где-то между 10279 и 10305 открытыми файлами, надежно)
Таким образом, в игре есть разные пределы. Я также видел разговор (по приведенной выше ссылке) FD_SETSIZE
.
Может кто-нибудь объяснить мне, что такое разные лимиты, и как они установлены?
В случае, если это актуально, я работаю над оберткой библиотеки 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/)
EDIT: я написал небольшую программу для проверки этого (на основе Как увеличить лимит "максимальных открытых файлов" в 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);
}