Есть ли исправление ошибки «Слишком много открытых файлов в системе» в 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

сработало отлично, спасибо! В моем случае ошибка проявлялась в процессе 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

Полезно! Но сортировка в 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работает отлично. Возможно, вам потребуется запустить новый сеанс входа в систему.


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

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


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


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, чтобы значения вступили в силу.


Либо сообщение следует пометить как дубликат, если ответ уже есть, в противном случае, пожалуйста, опубликуйте соответствующую информацию по ссылке, так как ссылка может быть недействительной вечно.
— Зиман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.