Установка maxfile в OS X/MacOS программно

Если я посмотрю на maxfiles вариант использования launchctl"s limit команда (на моей машине OS X El Cap)

$ launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        unlimited      unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     709            1064           
    maxfiles    256            unlimited

Похоже, что существует мягкий предел 256 и жесткий предел "неограничен". Я хотел бы изменить мягкий предел, чтобы быть чем-то вроде 2048и оставьте жесткий предел нетронутым. Когда я смотрю на limitаргументы

$ launchctl help limit
Usage: launchctl limit [<limit-name> [<both-limits> | <soft-limit> <hard-limit>]

Похоже, я могу либо установить оба ограничения на одну и ту же вещь, либо установить значение для мягкого и жесткого. Тем не менее, если я попытаюсь установить жесткий предел без ограничений.

$ sudo launchctl limit maxfiles 2048 unlimited

Я в конечном итоге с любопытным значением 10240

$ launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        unlimited      unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     709            1064           
    maxfiles    2048           10240          

Что тут происходит? Можно ли установить неограниченное значение? Если нет, то является ли это ограничением launchctl limit команда или что-то на системном уровне? Если позже, каковы все эти начальные значения unlimited составление отчетов? Или это Apple, это Apple?

Для бонусных баллов - кто-нибудь знает, почему этот лимит установлен таким низким во-первых?

2 ответа

Решение

Со страницы руководства для setrlimit() базовый системный вызов, launchd будет полагаться на реализацию этой функции:

setrlimit() теперь возвращается с errno установлен в EINVAL в местах, которые исторически преуспели. Больше не принимает rlim_cur = RLIM_INFINITY " за RLIM_NOFILE, Используйте " rlim_cur = min(OPEN_MAX, rlim_max) ".

Так что пока getrlimit() может (первоначально) сообщить, что жесткий предел RLIM_INFINITY это, практически, OPEN_MAX (10240), потому что это просто предел, налагаемый тем, как реализовано ядро. Если вы попытаетесь установить предел, вам нужно будет использовать последнее значение, которое затем влияет на то, что сообщается с этого момента.

Что касается того, почему мягкий предел для RLIM_NOFILE по умолчанию 256, потому что для подавляющего, подавляющего большинства процессов это не практическое ограничение. Они прекрасно ладят, не приближаясь к этому пределу. И сохранение значения "так низко" означает, что каждый процесс имеет более низкую стоимость с точки зрения памяти, и каждый fork() требуется меньше работы для дублирования файловых дескрипторов в новые дочерние процессы и т. д.

Программы, которые знают, что они могут работать со многими другими файлами, могут изменить свои собственные ограничения, используя setrlimit(),

Не размышляя о том, почему, Apple изменила их в Йосемити. Любые изменения, сделанные с помощью launchctl limit... являются временными только для вашего текущего логина. Перезапустите или перезагрузите компьютер, и они вернутся к настройкам Apple по умолчанию.

Я могу подтвердить, что они не изменили это поведение по состоянию на 10.12.4 b4.

Неполноценная усваиваемость, когда Apple - это Apple. Я глубоко погрузился в документы для разработчиков и не смог найти объяснения, почему они внесли изменения.

Другие вопросы по тегам