[Node.js] Error: ENFILE: file table overflow, open xxx の解決方法

Node.js で Error: ENFILE: file table overflow, open xxx が発生したときの解決方法をご紹介します。

Node.js

ファイルディスクリプタ数の上限変更

Error: ENFILE: file table overflow, open xxx はファイルディスクリプタ数の上限を超えたときに発生するエラーです。

なので、解決方法はファイルディスクリプタ数の上限を増やすだけでよいです。

今回は MacOS でエラーが発生したので、Macのファイルディスクリプタ上限を上げる – 橋本商会 を参考にして対応しました。

File descriptors の確認

$ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                256

plist ファイル追加・更新

/Library/LaunchDaemons/ に以下の2ファイルを追加・更新します。

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>524288</string>
      <string>524288</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>2048</string>
        <string>2048</string>
      </array>
    <key>RunAtLoad</key>
      <true />
    <key>ServiceIPC</key>
      <false />
  </dict>
</plist>

追加した plist の所有権を root にする。

sudo chown root /Library/LaunchDaemons/limit.max*.plist

plist の設定を有効にする。

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
sudo launchctl load -w /Library/LaunchDaemons/limit.maxproc.plist

ここで、OS を再起動します。

変更後 File descriptors の確認

ulimit -a  
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       2048
-n: file descriptors                524288

以上、突然の Error: ENFILE: file table overflow, open xxx に悩まされた現場からお送りしました。