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

Tadashi Shigeoka ·  Tue, June 26, 2018

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

  


  
    Label
    limit.maxfiles
    ProgramArguments
    
      launchctl
      limit
      maxfiles
      524288
      524288
    
    RunAtLoad
    
    ServiceIPC
    
  

limit.maxproc.plist

  


  
    Label
      limit.maxproc
    ProgramArguments
      
        launchctl
        limit
        maxproc
        2048
        2048
      
    RunAtLoad
      
    ServiceIPC
      
  

追加した 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 に悩まされた現場からお送りしました。