Увеличить максимальное количество открытых файловых дескрипторов в Snow Leopard?
Я пытаюсь сделать что-то, что требует большого количества файловых дескрипторов
sudo ulimit -n 12288
так высоко, как снежный барс хочет идти; помимо этого приводит к
/ usr / bin / ulimit: строка 4: ulimit: открыть файлы: невозможно изменить ограничение: неверный аргумент.
Я хочу поднять число намного выше, скажем, 100000. Возможно ли это?
7 ответов
С помощью ulimit
Команда только изменяет ограничения ресурса для текущей оболочки и ее дочерних элементов и sudo ulimit
создает корневую оболочку, настраивает ее пределы и затем завершает работу (таким образом, насколько я вижу, реального эффекта нет).
Чтобы превысить 12288, вам нужно настроить ядро kern.maxfiles
а также kern.maxfilesperproc
параметры, а также (по крайней мере, в соответствии с этой записью в блоге, которая является кратким описанием этого обсуждения) предел запуска. Ты можешь использовать launchctl limit
настроить все это сразу:
sudo launchctl limit maxfiles 1000000 1000000
Чтобы сделать это постоянным (т.е. не сбрасывать при перезагрузке), создайте /etc/launchd.conf
содержащий:
limit maxfiles 1000000 1000000
Тогда вы можете использовать ulimit
(но без sudo
) чтобы настроить лимит вашего процесса.
Если этого не произойдет, возможно, вы работаете с ограничениями размера в ядре. Если ваша модель поддерживает это, может помочь загрузка ядра в 64-битном режиме.
Следующее должно решить большинство решений (и перечислены в порядке их иерархии):
echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile
Заметки:
- Вам нужно будет перезапустить, чтобы эти изменения вступили в силу.
- AFAIK, вы больше не можете устанавливать ограничения на "безлимитный" под OS X
- Максимальные файлы launchctl ограничены максимальными файлами sysctl и поэтому не могут превышать их
- sysctl, кажется, наследует kern.maxfilesperproc от запуска ctfl maxfiles
- ulimit, по-видимому, наследует значение "открытых файлов" от launchctl по умолчанию
- вы можете установить пользовательский ulimit в / etc / profile или ~/.profile; пока это не требуется, я привел пример
- Будьте осторожны при установке любого из этих значений на очень большое число по сравнению с их значениями по умолчанию - существуют функции стабильности / безопасности. Я взял эти цифры примера, которые я считаю разумными, написанные на других сайтах.
Кажется, что существует совершенно другой метод для изменения лимита открытых файлов для каждой версии OS X!
Для OS X Sierra (10.12.X) вам необходимо:
1. В Library/LaunchDaemons
создать файл с именем limit.maxfiles.plist
и вставьте следующее (не стесняйтесь менять два числа (мягкие и жесткие ограничения соответственно):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>64000</string>
<string>524288</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
2. Измените владельца вашего нового файла:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
3. Загрузите эти новые настройки:
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
4. Наконец, проверьте правильность лимитов:
launchctl limit maxfiles
Похоже, что OS X Lion не допустит "неограниченное" в качестве значения:
% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.
Предоставление числовых значений для мягкого и жесткого предела делает работу:
% sudo launchctl limit maxfiles 4096 8192
На Маверикс все просто. Как обычный пользователь:
ulimit -n 8192
Вы можете проверить обновленные настройки через
ulimit -a
На моей машине:
ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kbytes) unlimited
-l: locked-in-memory size (kbytes) unlimited
-u: processes 709
-n: file descriptors 8192
На OS X 10.13.6 это работает для меня:
$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
Некоторые ограничения не могут быть изменены ulimit
потому что они применяются только к текущей оболочке, поэтому launchctl
команда должна использоваться для изменения ограничений в глобальном масштабе, например
sudo launchctl limit maxfiles 100000 unlimited
Обратите внимание, что применение этих ограничений в /etc/launchd.conf
(как предлагается в других ответах) больше не поддерживается в последних выпусках macOS. Хотя все еще можно использовать launchd.plist
(увидеть: man launchd.plist
) такие как для пользователя или всей системы plist
конфигурационные файлы, как предложено здесь, там и там.
Чтобы сделать эти ограничения постоянными, вы можете использовать /etc/sysctl.conf
файл и добавить, например:
kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000
Чтобы изменения вступили в силу, требуется перезагрузка.
Чтобы увидеть текущие ограничения, запустите: launchctl limit
или же sysctl -a | grep ^kern.max
,
Смотрите также: Как сохранить настройки ulimit в macOS?