Установка 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. Я глубоко погрузился в документы для разработчиков и не смог найти объяснения, почему они внесли изменения.