170

Мне нужно избавиться от надоедливого ограничения "Слишком много открытых файлов в системе" в OS X 10.7.1. 

Есть ли способ?

9 ответов9

215

Согласно этой полезной статье (которую я рекомендую прочитать):

По умолчанию максимальное количество файлов, которые может открыть Mac OS X, равно 12 288, а максимальное количество файлов, которое может открыть данный процесс, составляет 10 240.

Вы можете проверить это с:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Вы можете увеличить лимиты (на свой страх и риск) с помощью:

  • sysctl -w kern.maxfiles=20480 (или любой другой номер, который вы выберете)
  • sysctl -w kern.maxfilesperproc=18000 (или любой другой номер, который вы выберете)

Чтобы сделать изменение постоянным, используйте sudo чтобы поместить ваши настройки в /etc/sysctl.conf (который вам, возможно, придется создать), например так:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Примечание. В OS X 10.10 или ниже вы можете добавить параметр в /etc/launchd.conf например, limit maxfiles и он будет переопределять все, что вы здесь указали .

Опять же из статьи:

После того, как вы это сделаете, само ядро будет иметь максимальное количество файлов, но оболочка может этого не делать. А так как большинство процессов, которые будут обрабатывать такое количество файлов, будут инициироваться оболочкой, вы захотите увеличить их.

Команда для этого:

ulimit -S -n 2048 # or whatever number you choose

Это изменение также временно; это длится только для текущего сеанса оболочки. Вы можете добавить его в свой файл конфигурации оболочки (.bashrc , .zshrc или любой другой), если хотите, чтобы он запускался каждый раз, когда вы открываете оболочку.

58

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

Вам нужно будет увеличить настройки ulimit - в наши дни это довольно мало для OS X - по умолчанию 256. Добавьте ulimit -n 4096 или аналогичный вашему ~/.profile или эквивалентному, и это решит эту проблему в вашей локальной среде. Запустите ulimit -a чтобы проверить ваш текущий уровень

Чтобы увидеть системные настройки, запустите это:

launchctl limit maxfiles

В Lion (10240) он установлен немного выше для каждого процесса, чем раньше. Но если вы все еще нажимаете на него, вы можете установить его выше, используя ту же команду с желаемыми уровнями. Чтобы сделать изменения постоянными /etc/launchd.conf, вам нужно добавить соответствующие строки.

24

Другой вариант может найти виновника:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Для последнего вы можете увидеть, какие файлы открыты:

sudo lsof -n | grep socketfil

И убить процесс, если так хочется

kill $pid

Из комментариев:

Для чего это стоит, вы также можете получить список идентификаторов процессов с наиболее открытыми файлами, используя

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
9

Народ, на Маверикс 10.9.4

ulimit -n 2048 работает нормально. Возможно, вам потребуется запустить новый сеанс входа в систему.

1

После всех изменений выше моего java не сделал больше чем 10000 файлов. Решением был этот флаг jvm -XX:-MaxFDLimit

1

Вы можете запустить

lsof -n

какой процесс открыть слишком много файлов.

тогда убей это.

или же

sysctl -w kern.maxfiles=20480

измените его на больший.

0

Для последних версий macOS (на момент написания: 10.14.1) вы можете использовать sudo launchctl limit maxfiles 64000 524288 (по умолчанию это 256), но это работает только в текущем сеансе. Используйте задание launchctl от @ninjaPixel (https://superuser.com/a/1171028/760235) для постоянного решения.

0

Я столкнулся с этим во время выполнения команды chmod -R, поэтому я справился с этим, сделав небольшие шаги, например

# for each directory
find . -type d -exec chmod 755 {} \;

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