Я не могу решить java.io.FileNotFoundException (слишком много открытых файлов в системе)

893
robster

Отказ от ответственности. Во-первых, я не 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
Сначала нужно выяснить, что открывает столько файлов. Из того, что вы сказали, увеличение максимального количества открытых файлов - всего лишь бандит по основной причине. Как насчет того, чтобы войти в Activity Monitor и посмотреть, есть ли какое-то приложение, чье использование памяти постоянно растет? Сортировать по памяти; обратите внимание, что находится наверху и каково его использование памяти; уйти на некоторое время и посмотреть, выросла ли она. Держу пари, что это не CrashPlan. Эти вопросы и ответы могут также дать некоторые подсказки: http://stackoverflow.com/q/20974438 jwd630 7 лет назад 1
Спасибо за это. В выходные я провел несколько тестов со скриншотами монитора активности, и практически все изменения в памяти для всех открытых приложений практически отсутствуют. У меня 16 Гб оперативной памяти, и у меня постоянно было около 10 Гб свободного времени. robster 7 лет назад 0
Тогда я бы попробовал что-то более низкое. Из окна терминала `пока истина; do ts = $ (дата +% H_% M); sudo lsof> open_files _ $ ; wc -l open_files _ $ ; сон 60; done` будет захватывать процесс, в котором открыты файлы, и подсчитывать их количество раз в минуту. Если число растет, вы можете увидеть различия, разбросав результаты, например: `diff open_files_13_13 open_files_13_14` Не обманывайте себя, так как есть некоторые различия; но если один процесс выделяется последовательно, у вас может быть виновник. Это создаст новый большой файл каждую минуту, пока вы не прервете его: Control-C jwd630 7 лет назад 0

1 ответ на вопрос

1
jwd630

Может быть, это действительно отвечает на вопрос для вас. Вставьте следующее в окно терминала:

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 процессах с наибольшим количеством открытых файлов
  • спать - подожди минутку и сделай все заново

Вы должны либо сразу увидеть виновника, либо он начнет двигаться к концу списка слишком скоро.

Спасибо тебе за это. Без этой помощи я бы застрял и не имел бы резервного копирования. Ну, у меня еще нет резервной копии, но у меня есть надежда! :-) Это действительно хорошие терминальные навыки. Вот результат после первого запуска вашего скрипта. Затем загружаем интерфейс капсулы, затем оставляем на несколько минут: mdworker 158 AppleSpel 174 Resilio 177 Telegram 210 com.apple 245 Spotlight 248 UserEvent 278 CrashPlan 331 Dropbox 353 firefox 407 mdworker 151 AppleSpel 174 Resilio 177 Telegram 210 com.apple 245 Spotlight 246 UserEvent 278 Dropbox 354 Firefox 389 CrashPlan 581 robster 7 лет назад 0
затем ... mdworker 151 AppleSpel 174 Resilio 175 Telegram 210 com.apple 245 Spotlight 246 UserEvent 278 Dropbox 354 firefox 377 CrashPlan 727 mdworker 163 AppleSpel 174 Resilio 175 Telegram 210 Spotlight 250 com.apple 269 UserEvent 278 Dropbox 354 firefox 373 mworker 540dwork 535dwork AppleSpel 174 Resilio 175 Telegram 210 Spotlight 250 com.apple 265 UserEvent 278 Dropbox 354 firefox 375 CrashPlan 574 Извините за макет, когда я добавил это, он был в хорошей вертикальной компоновке, но интерфейс superuser.com изменил его, чтобы выглядеть грязно. robster 7 лет назад 0
Я также добавил сюда версию для вставки еще 3-х минут для облегчения чтения http://pastebin.com/MEpE1FKQ robster 7 лет назад 0
Как вы можете видеть, CrashPlan фактически сокращает количество открытых файлов за последние 3 минуты: начинается с 638, снижается до 580, затем до 581. Я предлагаю просто запустить этот скрипт, пока вы занимаетесь своими делами. Если / когда в CrashPlan появится ошибка, посмотрите, какие процессы на самом деле хранят много открытых файлов в этот момент. Это не необычные цифры. jwd630 7 лет назад 0
Еще раз спасибо К сожалению, у Crashplan была ошибка примерно 6 раз за 3 минуты. Так что ошибка происходила во время создания журналов. Я увеличил точность до каждых 10 секунд, и вот что я получил http://pastebin.com/S0s5DHVT Хотя это все еще не массовые цифры. Таким образом, за указанное время crashplan много раз выдавал ошибку. robster 7 лет назад 0
Боюсь, у меня почти нет предложений. Я - пользователь CrashPlan, и у меня никогда не было такой проблемы. Я работал CrashPlan в течение нескольких лет на нескольких Mac и на Linux тоже без проблем. Единственная другая идея, которая возникает: есть ли что-то еще, что создает или изменяет много файлов все время, когда CrashPlan решает, что ему необходимо выполнить резервное копирование? Может быть, те должны быть исключены. Может быть, вы сможете узнать, что CrashPlan резервировал в последнее время и происходит ли это снова и снова. jwd630 7 лет назад 0