Мне нужно избавиться от надоедливого ограничения "Слишком много открытых файлов в системе" в 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
Примечание: в OS X 10.10 или ниже, вы можете добавить настройки в /etc/launchd.conf
like, 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!
Для 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
IO Error: Bad file descriptor (Write failed)
Вам нужно будет увеличить настройки ulimit - в наши дни это довольно мало для OS X - по умолчанию 256. Добавить ulimit -n 4096
или похожий на ваш ~ / .profile или эквивалент , и что будет решить в вашей местной среде. Запустите, ulimit -a
чтобы проверить свои текущие уровни
Чтобы увидеть системные настройки, запустите это:
launchctl limit maxfiles
В Lion (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, необходимо создать два файла конфигурации. Первым является файл списка свойств (он же 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, чтобы значения вступили в силу.