Какая команда контролирует пределы открытого файла?

19

Какая команда / файл конфигурации управляет ограничениями открытого файла в OS X? Есть ли другая команда для OS X 10.5 / 10.6 / 10.7? Варианты Я исследую ниже ulimit, sysctlиlaunchctl

«Слишком много открытых файлов», по-видимому, является распространенной ошибкой в ​​Leopard, возможно, в других версиях OS X:

Существует много (связанных?) Способов просмотра ограничений открытого файла:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

В некоторых из приведенных выше сообщений было заявлено, что они могут быть изменены с помощью следующих команд:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Однако из вышеперечисленных команд только sysctlкоманды имеют какой-либо очевидный эффект (то есть, ulimit -nи не launchctl limitпоказывают изменений после того, как вышеупомянутые команды были введены, хотя sysctl -aдействительно показывают запрошенные изменения).

Соответствующие места для изменения этих параметров для ОС:

/etc/sysctl.conf
/etc/launchd.conf

Я также обнаружил один ответ, который гласит, что ulimitконтролирует только текущую оболочку.

Как я могу увеличить максимальные / максимальные открытые файлы в MacOS?

keflavich
источник

Ответы:

9

Раньше простым ответом было то, что было несколько ограничений, и самый низкий предел, который вы достигнете в конкретном случае, приведет к вашей ошибке. Теперь 10.12 launchctl limit maxfilesтоже в миксе. За подробности реализации, этот отличный ответ получает награду и заслуживает больше голосов, чем тот, который я могу дать.

другие соответствующие темы:

ulimitУровень устанавливается на низком уровне , чтобы предотвратить один плохой сценарий оболочки от наводнения ядро с открытыми файлами.

Это kern.maxfilesperprocпозволяет оставить небольшое пространство в максимальном количестве файлов, чтобы один процесс мог использовать большую часть, но не все пространство обработчика открытого файла из ядра.

Для нормальных ситуаций kern.maxfilesпоследний ограничивающий фактор.

На Sierra - это 256 открытых файлов и неограниченный максимум, поэтому я обнаружил, что от 3 до 4 тысяч файлов, установленных для мягкого ограничения, работают практически на всех наших аппаратных средствах и по-прежнему поддерживают работу системы, когда избыточный процесс открывает слишком много файлы. Мы хотим, чтобы на наших серверах разработки было ограничение в 256, чтобы мы могли выявлять неплотное и проблемное программное обеспечение при разработке / подготовке и тестировании, а не узнавать об этом в производстве.

Я не фанат 10k файлов - может быть, с APFS и хранилищем NVMe мы увидим день, когда это немыслимо, но постараюсь придерживаться сотен или менее тысяч для ваших ограничений на количество файлов. Особенно, если ваш Mac имеет низкий лимит процессов , наличие большого количества файлов, открываемых таким количеством процессов, может быть проблематичным.

bmike
источник
9

Кажется, что есть совершенно другой метод для изменения предела открытых файлов для каждой версии 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
источник
Кажется, у меня возникают проблемы при установке maxfiles на неограниченное значение, если установить второе значение «unlimited». Есть предположения?
user200857
7

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

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
источник
0

Простыми словами:

  • Команда ulimitобеспечивает «контроль над ресурсами, доступными оболочке, и процессами, которые она создает» (см .: help ulimitиman bash ). Ресурсы, предоставляемые оболочке, ограничены пределами системных ресурсов.

  • launchctlКонтролирует максимальное потребление системных ресурсов текущего процесса (см: man setrlimitиman launchctl ). Максимальные значения ограничены пределами ядра.

  • В sysctlуправлении ядром пределов (см man sysctlи настройка ядро Limits из BSD ).

Чтобы увеличить лимиты, вы можете использовать каждую из команд, в зависимости от проблемы.

Смотрите также: Какова связь между `launchctl limit` и` ulimit`?


Для проблемы со слишком большим количеством открытых файлов это зависит от того, какой именно мягкий или жесткий предел был достигнут (будь то скрипт локальной оболочки, глобальный скрипт root, выполняемый приложением, или все процессы одновременно). Стоит увеличить все ограничения (оболочка, launchd и ограничения ядра).

Чтобы постоянно увеличивать лимиты, см .: Как постоянно контролировать максимальное потребление системных ресурсов на Mac?

kenorb
источник