96

Я пытаюсь сделать что-то, что требует большого количества файловых дескрипторов

sudo ulimit -n 12288 настолько высоко, насколько снежный барс хочет пойти; помимо этого приводит к

/usr/bin/ulimit: строка 4: ulimit: открыть файлы: невозможно изменить ограничение: неверный аргумент.

Я хочу поднять число намного выше, скажем, 100000. Является ли это возможным?

7 ответов7

91

Использование команды 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-битном режиме .

40

Следующее должно решить большинство решений (и перечислены в порядке их иерархии):

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 от launchctl maxfiles
  5. ulimit, по-видимому, по умолчанию наследует значение 'open files' из launchctl
  6. вы можете установить пользовательский ulimit в /etc /profile или ~ /.profile; пока это не требуется, я привел пример
  7. Будьте осторожны при установке любого из этих значений на очень большое число по сравнению с их значениями по умолчанию - существуют функции стабильности /безопасности. Я взял эти примеры, которые я считаю разумными, написанные на других сайтах.
31

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

Похоже, что 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
8

На Маверикс все просто. Как обычный пользователь:

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
1

На 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
0

Некоторые ограничения не могут быть изменены с помощью 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?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .