Мені потрібно позбутися від набридливого обмеження "Забагато відкритих файлів у системі" на OS X 10.7.1.
Чи є спосіб?
Мені потрібно позбутися від набридливого обмеження "Забагато відкритих файлів у системі" на OS X 10.7.1.
Чи є спосіб?
Відповіді:
Відповідно до цієї корисної статті (яку я рекомендую прочитати):
За замовчуванням максимальна кількість файлів, які 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
або будь-який інший ) , якщо ви хочете, щоб працювати кожен раз , коли ви відкриваєте оболонку.
kern.maxfiles=65000 kern.maxfilesperproc=65000
/etc/sysctl.conf і перезавантажив. kern.maxfiles був ігнорований і залишився за замовчуванням, але для kern.maxfilesperproc встановлено 65000. У мене немає /etc/launchd.conf, і що з цим?
Схоже, існує абсолютно інший метод зміни ліміту відкритих файлів для кожної версії 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
IO Error: Bad file descriptor (Write failed)
Вам потрібно буде збільшити свої налаштування ulimit - це досить низько на OS X в наші дні - 256 за замовчуванням. Додайте ulimit -n 4096
або подібний до свого ~ / .profile або його аналог, і це вирішить його у вашому локальному середовищі. Запустіть, ulimit -a
щоб перевірити свої поточні рівні
Щоб переглянути налаштування системи, запустіть це:
launchctl limit maxfiles
Він встановлений на Леві (10240) за процесом, дещо вище, ніж раніше. Але якщо ви все одно натискаєте на нього, ви можете встановити його вище, використовуючи ту ж команду з потрібними рівнями. Щоб зміни були постійними /etc/launchd.conf - це те, де потрібно додати відповідні рядки.
ulimit -a
).
Інший варіант може бути винним:
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
-h
(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
-h
lsof -n +c 0
для запобігання обрізання імені процесу.
Люди, на Мавериках 10.9.4
ulimit -n 2048
працює чудово. Можливо, вам доведеться запустити новий сеанс входу.
Для останнього macOS (на момент написання: 10.14.1) ви можете використовувати sudo launchctl limit maxfiles 64000 524288
(за замовчуванням це було 256), але він працює лише в межах поточного сеансу. Використовуйте launchctl
роботу від @ninjaPixel ( https://superuser.com/a/1171028/760235 ) для постійного вирішення.
Можна бігати
lsof -n
які відкривають занадто багато файлів.
тоді вбийте.
або
sysctl -w kern.maxfiles=20480
змінити його на більший.
Після всіх змін над моєю Java не було більше 10000 файлів. Рішенням було це прапор jvm -XX: -MaxFDLimit
Я зіткнувся з цим під час виконання chmod -R, тому я розібрався, зробивши менші кроки, наприклад
# for each directory
find . -type d -exec chmod 755 {} \;
Подібно до 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, щоб значення були ефективними.