Ошибка NodeJS "EMFILE, слишком много открытых файлов" в Mac OS

В какой-то момент у меня возникает следующая ошибка:

Error: EMFILE, too many open files  '/Users/blagus/Gallery/Websites/Nicsware/Pills/resources/core/auth.node.js'
    at Object.fs.openSync (fs.js:427:18)
    at Object.fs.readFileSync (fs.js:284:15)
    at Object.Module._extensions..js (module.js:473:44)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at instController  (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:79:31)
    at init (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:57:8)
    at route (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/dispatcher.node.js:268:36)

Строка кода, вызывающая вызов этого файла (mvc.node.js: 79),

    this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this );

(это каркас, который я создаю)

Как вы можете видеть, файл auth.node.js вызывается REQUIRE, поэтому данные решения с gracefullFS и аналогичными не подходят. Кроме того, эта проблема заключается только в MacOS. В Ubuntu, похоже, все работает нормально.

Любые мысли?

Ответ 2

Вы можете решить эту проблему, увеличив предел maxfiles:

launchctl limit maxfiles 16384 16384 && ulimit -n 16384

Ответ 3

У меня была эта ошибка, и ulimit и launchclt не работали для меня,

это решение от http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit работало для меня

echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536

а затем поместив

ulimit -n 65536 65536

в ~/.bashrc

веселит

Ant

Ответ 4

В вашем коде слишком много файлов. По умолчанию OS X имеет ограничение на 256 одновременно открытых файлов. Когда вашему коду требуется новый модуль, node должен открыть файл, чтобы прочитать его. Если вы уже на этом пределе, node require не может продолжаться и будет вызывать ошибку. Вы должны проверять места в своем приложении, где вы вызываете fs.open, и убедитесь, что вы правильно закрываете все эти файлы. Вы также можете столкнуться с этой проблемой, если попытаетесь сделать слишком много одновременных чтений файловой системы, так как каждое ожидающее чтение будет открытым файлом. Я также столкнулся с этой проблемой при использовании fs.watchFile, что также требует открытия дескриптора файла.

Ответ 5

Проверьте свой ulimit. Например, начальный мой ulimit на OSX был 256.

  • Запустите ulimit -n, чтобы увидеть предел.
  • После этого вы можете ulimit -n 1024 установить более высокий предел.

Ответ 6

Ни один из других ответов не работал у меня. Это сделало трюк:

launchctl limit maxfiles 16384 16384 

Также следует отметить, что это не сохраняется в разных сеансах, поэтому, если вы не хотите запускать его для каждого сеанса терминала bash, я предлагаю поставить вышеприведенную строку в ~ ~.bashrc(или ~/.zshrc, если вы используете zsh), выполнив это в командной строке:

vi ~/.bashrc

Ответ 7

ulimit отлично, если вы используете терминал, но он работает только при запуске приложения с той же вкладки терминала (или экземпляра оболочки). Launchctl замечательный, но системный. Если вы оставите максимальный максимальный лимит Launchctl, мягкий предел равен 256, а жесткий лимит неограничен.

В рабочей среде вам, вероятно, придется запускать при запуске и перезагрузке при сбое, что означает, что лучшим решением для Mac OSX является использование файла .plist для каждого из ваших приложений. Я запускаю приложение node, используя указанный файл plist (который запускается при запуске и перезагружается после сбоя)... внутри этого файла вы можете установить количество файлов для каждого приложения с помощью клавиши SoftResourcesLimit,

<key>KeepAlive</key>
<true/>

<key>RunAtLoad</key>
<true/>

<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
  <integer>16384</integer>
</dict>

Ответ 8

Максимальные файлы были сброшены до 256 в OS X 10.10.3 Yosemite. Это может привести к проблемам с установками npm. Вы можете проверить этот предел с терминала командой ulimit -n. Чтобы изменить это за пределами 256, вам нужно создать два файла конфигурации.

Первый файл списка свойств /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>65536</string>
          <string>65536</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </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>

Установите правильное право собственности и права:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
sudo chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist
sudo chmod 644 /Library/LaunchDaemons/limit.maxproc.plist

Задайте требуемые пределы для файла профиля bash (.bashrc или .bashprofile или аналогичного):

ulimit -n 65536
ulimit -u 2048

Убедитесь, что права одинаковы для профиля bash:

chmod 644 .your_bash_profile_file

Перезагрузите компьютер и проверьте с помощью файлов ulimit -n max. Это должно быть 65536, и вы должны иметь возможность изменить что-либо ниже этого.

Источник: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X

Ответ 9

айонг ответ работал у меня

ulimit -n 10480

Но только после запуска интерактивной оболочки

sudo -i

За пределами оболочки я все время получал ошибку разрешения на OSX Yosemite