1

Отказ от ответственности. Во-первых, я не 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 ответ1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .