Чи є виправлення помилки «Забагато відкритих файлів у системі» на ОС X 10.7.1?


190

Мені потрібно позбутися від набридливого обмеження "Забагато відкритих файлів у системі" на OS X 10.7.1. 

Чи є спосіб?


4
Ви хочете більше пояснити, коли це відбувається? За яких обставин?
slhck

1
@slhck - у мене така ж проблема. Обставини в основному "навмання". Я розробник, тому досить широко використовую свій Mac: запуск однієї або декількох баз даних, веб-сервер, інструменти тестування, один або кілька браузерів та музичний плеєр одночасно. Google Chrome, здається, є однією програмою, у якій відкрито багато файлів.
Натан Лонг

Власне, моє "важке використання" не було проблемою; мої налаштування максимальної кількості відкритих файлів для ядра та кожного процесу були значно нижчими, ніж повинні бути типовими.
Натан Лонг

2
Якщо ви читали коментар Натана і цікавились, чому він не містив жодних деталей про за замовчуванням, це тому, що він все це прописав у своїй відповіді нижче. (Приємна відповідь! :)
Олі,

Я за тією ж обставиною використання, що і Натан Лонг, і виявив, що перезапуск Apache був єдиним кроком, який "вирішив" проблему. Я застосував усі нижчі обмеження, але вони допомогли не відразу. Я запускаю тести командного рядка phpUnit> сервер селену> firefox> apache> php> mysql - все на тій же macbook. Раніше чудово працював, поки я не перейшов на маверики. Помилка, яку я отримую, полягає у тестуванні webapp, тобто файлів 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

Примітка. В ОС X 10.10 або пізнішої версії ви можете додати налаштування у вигляді, /etc/launchd.confяк limit maxfilesце, і це перекриє все, що ви поставите тут.

Знову із статті:

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

Команда для цього:

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

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


1
яка межа застосовується до процесів, запущених клацанням піктограм у зоні запуску? І як змінити цю межу? Коли ви говорите "оболонка", я припускаю, що ви маєте на увазі інтерактивну оболонку терміналу.
Cheeso

@Cheeso - Я думаю, що загальний системний ліміт (sysctl) або ліміт запуску, залежно від того, що нижче, контролює це.
Натан Лонг

1
створення /etc/launchd.conf з максимальним обмеженням вмісту 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 є пробіл, який потрібно видалити.
jjathman

62

Схоже, існує абсолютно інший метод зміни ліміту відкритих файлів для кожної версії OS X!

Для ОС 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
Troy Daniels

все ще не може змінити обмеження для оболонки. Максимум залишається на 1024, що я роблю
DataGreed

На кроці 2 запустіть: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Хай Нгуен

32

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

Щоб переглянути налаштування системи, запустіть це:

launchctl limit maxfiles

Він встановлений на Леві (10240) за процесом, дещо вище, ніж раніше. Але якщо ви все одно натискаєте на нього, ви можете встановити його вище, використовуючи ту ж команду з потрібними рівнями. Щоб зміни були постійними /etc/launchd.conf - це те, де потрібно додати відповідні рядки.


1
256? Це для мене дескриптори файлів 2560, і я ніколи його не змінював. Межа - 266 процесів (cf 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

Це єдина відповідь, яка допомогла мені вирішити проблему .. дякую :)
SgtPooki

1
Використовуйте lsof -n +c 0для запобігання обрізання імені процесу.
воган

9

Люди, на Мавериках 10.9.4

ulimit -n 2048працює чудово. Можливо, вам доведеться запустити новий сеанс входу.


2

Для останнього 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, потрібно створити два файли конфігурації. Перший - файл списку властивостей (aka 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. Другий файл конфігурації плістів повинен зберігатися в /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>

Обидва файли плістів повинні належати root: wheel та мати дозволи -rw-r - r--. Ці дозволи повинні мати місце за замовчуванням, але ви можете переконатися, що вони є на місці, запустивши sudo chmod 644. Незважаючи на те, що описані вище кроки призведуть до правильного встановлення системних обмежень для відкритих файлів при перезапуску, ви можете застосувати їх вручну, запустивши ліміт startctl.

На додаток до встановлення цих обмежень на системному рівні, ми рекомендуємо встановити на рівні сеансу також, додавши наступні рядки до файлу 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.