Есть ли исправление ошибки «Слишком много открытых файлов в системе» в OS X 10.7.1?

191

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

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

Джон Вилунд
источник
4
Вы хотите объяснить больше о том, когда это произойдет? При каких обстоятельствах?
Slhck
1
@slhck - у меня та же проблема. Обстоятельства в основном "наугад". Я разработчик, поэтому я довольно интенсивно использую свой Mac: запускаю одну или несколько баз данных, веб-сервер, инструменты тестирования, один или несколько браузеров и музыкальный проигрыватель одновременно. Похоже, Google Chrome - это одна из программ, в которой открыто много файлов.
Натан Лонг
На самом деле, мое «интенсивное использование» не было проблемой; мои настройки для максимального количества открытых файлов для ядра и каждого процесса были намного ниже, чем должны быть значения по умолчанию.
Натан Лонг
2
Если вы прочитали комментарий Натана и поинтересовались, почему он не включил никаких подробностей о значениях по умолчанию, это потому, что он изложил все это в своем ответе ниже. (Хороший ответ! :)
Оли
Я нахожусь в той же ситуации, что и Натан Лонг, и обнаружил, что перезапуск Apache был единственным шагом, который «решил» проблему. Я применил все приведенные ниже ограничения, но они не помогли сразу. Я запускаю тесты phpUnit командной строки> сервер селен> firefox> apache> php> mysql все на одном MacBook. Раньше работал нормально, пока я не перешел на Маверикс. Я получаю ошибку в тестируемом веб-приложении, то есть в php / apache заканчиваются файлы, поэтому, вероятно, не контролируется настройками оболочки.
скипилот

Ответы:

225

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

По умолчанию максимальное количество файлов, которые может открыть 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.conflike, limit maxfilesи они будут переопределять все, что вы здесь указали.

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

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

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

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

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

Натан Лонг
источник
1
какое ограничение применяется к процессам, запускаемым нажатием на значки в области запуска? И как изменить это ограничение? Когда вы говорите «оболочка», я предполагаю, что вы имеете в виду интерактивную терминальную оболочку.
Cheeso
@Cheeso - я думаю, что общий системный предел (sysctl) или предел запуска, в зависимости от того, что ниже, контролирует это.
Натан Лонг
1
создание /etc/launchd.conf с ограничением содержимого maxfiles 1000000 1000000 отлично работает для меня! (OSX 10.8.2 здесь)
Zugwalt
1
Я положил kern.maxfiles=65000 kern.maxfilesperproc=65000в /etc/sysctl.conf и перезагрузился. kern.maxfiles был проигнорирован и остался по умолчанию, но kern.maxfilesperproc был установлен на 65000. У меня нет /etc/launchd.conf, так что с этим?
pferrel
2
Если у кого-то есть проблемы с не прилипающими файлами max, это потому, что после строки maxfiles есть пробел, который необходимо удалить.
Джатман
62

Кажется, что существует совершенно другой метод для изменения лимита открытых файлов для каждой версии 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
источник
сработало отлично, спасибо! В моем случае ошибка проявлялась в процессе Java с сообщениемIO Error: Bad file descriptor (Write failed)
agradl
1
Также работает на El Capitan 10.11.6
Трой Дэниелс
все еще не может изменить ulimit для оболочки. Максимум остается 1024, что бы я ни делал
DataGreed
На шаге 2 запустите: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Хай Нгуен,
33

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

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

launchctl limit maxfiles

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

Адам С
источник
1
256? Для меня это 2560 файловых дескрипторов, и я никогда не менял их. Предел составляет 266 процессов (ср. ulimit -a).
slhck
2
То же самое для меня, 256 файлов на MacOS X Maverick
Climbatize
4
256 на OS X Yosemite , а также
Александр
2
256 на Эль Капитане тоже.
TMN
1
256 в Йосемити.
Jaec
31

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

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
sanmai
источник
Полезно! Но сортировка в OS X (10.11) не требует -h. (Может быть -g?)
Роберт Калхун
У меня хорошо работало просто без -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop
Так и быть без-h
sanmai
Это единственный ответ, который помог мне
понять
1
Используйте lsof -n +c 0для предотвращения усечения имени процесса.
вон
10

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

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

Clustermagnet
источник
3

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

Дмитрий Хубин
источник
Как ты придумал номер 524288? Мои предыдущие значения были 256 и не ограничены.
Чип Роберсон
1

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

lsof -n

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

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

или же

sysctl -w kern.maxfiles=20480

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

SaintKnight
источник
3
Пожалуйста, объясните, чем этот ответ отличается от уже предоставленного.
Стивен Раух
1

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

Урос Величкович
источник
0

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

# for each directory
find . -type d -exec chmod 755 {} \;
Майкл
источник
1
Хотя это может быть обходной путь, на самом деле он не отвечает на вопрос. Возможно, объяснение того, что вы не можете избавиться от сообщения, а затем предложение этого как одного из способов сделать его менее важным, улучшило бы ваш ответ.
music2myear
0

Аналогично https://superuser.com/a/1171028/367819

Чтобы проверить текущие ограничения в вашей системе Mac OS X, запустите:

launchctl limit maxfiles

Последние два столбца - это мягкие и жесткие ограничения соответственно.

Чтобы настроить ограничения открытых файлов в масштабе всей системы в Mac OS X Yosemite, необходимо создать два файла конфигурации. Первым является файл списка свойств (он же plist) в /Library/LaunchDaemons/limit.maxfiles.plist, который содержит следующую конфигурацию XML:

<?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>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

Это установит лимит открытых файлов в 200000. Второй файл конфигурации plist должен храниться в /Library/LaunchDaemons/limit.maxproc.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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Оба файла plist должны принадлежать пользователю root: wheel и иметь права доступа -rw-r - r--. Эти разрешения должны быть включены по умолчанию, но вы можете убедиться в их наличии, запустив sudo chmod 644. Несмотря на то, что описанные выше шаги приведут к тому, что лимиты на общесистемные открытые файлы будут правильно установлены при перезапуске, вы можете применить их вручную, запустив launchctl limit.

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

ulimit -n 200000
ulimit -u 2048

Как и файлы plist, ваш bashrc или аналогичный файл должен иметь права доступа -rw-r - r--. На этом этапе вы можете перезагрузить компьютер и ввести ulimit -n в свой терминал. Если ваша система настроена правильно, вы должны увидеть, что для maxfiles установлено значение 200000.


Вы можете следовать этой статье для более подробной информации.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Не забудьте перезагрузить Mac, чтобы значения вступили в силу.

angelokh
источник
Либо сообщение следует пометить как дубликат, если ответ уже есть, в противном случае, пожалуйста, опубликуйте соответствующую информацию по ссылке, так как ссылка может быть недействительной вечно.
Зиман