Увеличить максимальное количество открытых файловых дескрипторов в 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

Заметки:

  1. Вам нужно будет перезапустить, чтобы эти изменения вступили в силу.
  2. AFAIK, вы больше не можете устанавливать ограничения на "безлимитный" под OS X
  3. Максимальные файлы launchctl ограничены максимальными файлами sysctl и поэтому не могут превышать их
  4. sysctl, кажется, наследует kern.maxfilesperproc от запуска ctfl maxfiles
  5. ulimit, по-видимому, наследует значение "открытых файлов" от launchctl по умолчанию
  6. вы можете установить пользовательский ulimit в / etc / profile или ~/.profile; пока это не требуется, я привел пример
  7. Будьте осторожны при установке любого из этих значений на очень большое число по сравнению с их значениями по умолчанию - существуют функции стабильности / безопасности. Я взял эти цифры примера, которые я считаю разумными, написанные на других сайтах.

Кажется, что существует совершенно другой метод для изменения лимита открытых файлов для каждой версии 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?

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