Я не могу решить java.io.FileNotFoundException (слишком много открытых файлов в системе)
Отказ от ответственности. Во-первых, я не SU. Я компьютерный пользователь среднего уровня с небольшим опытом. Я могу написать базовый код, использую компьютеры более 20 лет. MSDOS, для Windows на протяжении многих лет я на OS X. Я искал все выше и ниже в течение нескольких недель и поэтому решил обратиться к большому оружию с просьбой о помощи. Я надеюсь, что вы в порядке с этим.
Во первых я на OS X 10.11.6
,
У меня возникла проблема с моим программным обеспечением для резервного копирования Crashplan, и я работал с ним вместе с сотрудниками службы поддержки. Все сводилось к ошибке:
java.io.FileNotFoundException (Too many open files in system)
Я прочитал и обнаружил, что мне нужно увеличить количество открытых файлов, разрешенных в моей системе. Я сделал это, создав и изменив значения файлов, расположенных в /Library/LaunchDaemons
,
Я создал два файла:limit.maxfiles.plist
а также limit.maxproc.plist
В 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>54000</string>
<string>54000</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
и внутри 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>4096</string>
<string>4096</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>
Я перезапустил и проверил это вступило в силу, запустив launchctl limit maxfiles
на терминале. Это показало, что это было в действительности.
Я снова запустил аварийный план, и он выдал ту же ошибку. Я проверил с крашпланом людей, и они в основном сказали жестко, вот в чем проблема, иди исправляй это (я думаю, это достаточно справедливо).
Таким образом, я продолжал увеличивать количество файлов, разрешенных для открытия, пока я не достигал 900000000). Да, в общей сложности разрешено открыть 900 миллионов файлов. Больше, чем у меня на моем общем диске. Ошибка все еще сохраняется. Проверка с launchctl limit maxfiles
это показывает, что оно действует.
Итак, это оставило меня в тупике. Затем я оглянулся и обнаружил, что могу запустить команду ulimit -S -n 900000
что даст какой-то другой части системы больше файлов для воспроизведения. Я не уверен, как это работает, но я проверил это ulimit -a
и это было в действительности. Та же проблема с Crashplan, хотя.
Так что теперь я не уверен, что делать, поэтому я пришел спросить людей, которые знают ОС лучше, чем большинство. Может кто-нибудь предложить какое-то руководство относительно того, что я могу попытаться решить эту проблему?
Спасибо.
1 ответ
Может быть, это действительно отвечает на вопрос для вас. Вставьте следующее в окно терминала:
while true; do
sudo lsof |
awk '{ files[$1]++ } END { for (key in files) { print key, files[key] } }' |
sort -n -k 2 | tail -10
sleep 60;
done
Что это собирается сделать:
- пока истина - пока вы не прервете это, например, Control-C
- lsof - выводит список всех открытых файлов в системе и имя процесса (команды), в котором эти файлы открыты
- awk - подсчитывает количество открытых файлов по процессам
- sort - сортировка списка по количеству открытых файлов
- tail - сообщает о 10 процессах с наибольшим количеством открытых файлов
- спать - подожди минутку и сделай все заново
Вы должны либо сразу увидеть виновника, либо он начнет двигаться к концу списка слишком скоро.