Подтвердить что ты не робот

Максимальное количество открытых дескрипторов файлов для каждого процесса в OSX (и как увеличить)

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);
}
4b9b3361

Ответ 2

Чтобы проверить ограничения на запуск системы: 'limitctl limit'. Чтобы изменить максимальную количество открытых файлов: "launchctl limit maxfiles 400000 unlimited '. к измените настройку, которая постоянно добавляется к файл: '/etc/launchd.conf' следующая строка:

limit maxfiles 400000
неограниченный

(источник)

... и почему вам нужно столько открытых файлов одновременно?