Увеличить максимальное количество открытых файловых дескрипторов в Snow Leopard?

101

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

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

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

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

Крис Пул
источник
4
Ответы на этот вопрос больше не работают в OSX Mavericks.
Говард
2
Запуск echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confи перезапуск работает для меня в Mavericks.
Lri

Ответы:

95

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

Гордон Дэвиссон
источник
1
sudo launchctl limit maxfiles 1000000 unlimitedНи жесткий, ни мягкий предел для «maxfiles» не может быть неограниченным. Пожалуйста, используйте числовой параметр для обоих.
Томас Хантер
2
Будьте осторожны при добавлении этой строки в launchd.conf. Я думаю, что если число слишком мало, это может сделать ваш компьютер непригодным для использования. Например, я использовал, limit maxfiles 1024 1024и мне было очень трудно изменить его обратно.
Шон
1
Увы: «Файл /etc/launchd.conf больше не используется для подкоманд, запускаемых во время ранней загрузки; эта функциональность была удалена из соображений безопасности».
Алиса Перселл,
Это не работает, мой номер fd не может превышать 6k, даже если я успешно установил ulimit -Sn 10240.
Цзян Вэйхан,
@JianWeihang fd числа для каждого процесса, поэтому я предполагаю, что в других процессах было открыто 4000 файлов. Вам довелось запустить Chrome? ;)
Трейказ
41

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

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. Будьте осторожны при установке любого из этих значений на очень большое число по сравнению с их значениями по умолчанию - существуют функции стабильности / безопасности. Я взял эти цифры примера, которые я считаю разумными, написанные на других сайтах.
errant.info
источник
3
Увы: «Файл /etc/launchd.conf больше не используется для подкоманд, запускаемых во время ранней загрузки; эта функциональность была удалена из соображений безопасности».
Алиса Перселл,
34

Кажется, что существует совершенно другой метод для изменения лимита открытых файлов для каждой версии 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
ninjaPixel
источник
2
Этот ответ великолепен, и я нашел кое-что для добавления здесь, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Дин Рэдклифф,
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
crishoj
источник
3
Если одно из значений было неограниченным , использование в -1качестве значения приводит к 12288. Можно использовать большие числовые значения, например sudo launchctl limit maxfiles 15000 150000. Я не уверен, что эти настройки имеют эффект тогда, хотя.
Даниэль Бек
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
Clustermagnet
источник
2
Подумайте о пересмотре вашего решения. Вы устанавливаете ulimit 1024, а затем показывает дескрипторы выходного файла как 8192 (должно быть 1024). Ваш подход также пробелматичен без sudo, попробуйте изменить его несколько раз для себя.
y3sh
1
sudo не следует использовать здесь, но этот ответ неверен. Пользователи Mavericks должны использовать echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confи затем перезагрузить свой компьютер
Кайл Чадха
3

На 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
Петр Яворик
источник
1

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

kenorb
источник