Too many open files
ファイルディスクリプタの上限に引っかかって上記のようなエラーが起きることがあります。
ここでは、supervisorのファイルディスクリプタの上限を変更する方法を紹介します。
supervisorから起動しているプロセスのファイルディスクリプタの上限も同時に変更されます。
前提
$ lsb_release -d
Description: Ubuntu 18.04.2 LTS
$ supervisord -v
3.3.1
$ systemd --version
systemd 237
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid
変更前
supervisorのファイルディスクリプタ
$ cat /proc/[process id]/limits | grep "Max open files"
Max open files 1024 4096 files
supervisorから起動しているプロセスのファイルディスクリプタ
$ cat /proc/[process id]/limits | grep "Max open files"
Max open files 1024 4096 files
Soft Limitが1024、Hard Limitが4096になっている。
変更手順
supervisorを起動しているのがsystemd。
systemdのsupervisor設定を変更する。
/lib/systemd/system/supervisor.service
[Service]
LimitNOFILE=16384
設定の再読み込み&supervisor再起動。
$ sudo systemctl daemon-reload
$ sudo systemctl restart supervisor
変更後
supervisorのファイルディスクリプタ
$ cat /proc/[process id]/limits | grep "Max open files"
Max open files 16384 16384 files
supervisorから起動しているプロセスのファイルディスクリプタ
$ cat /proc/[process id]/limits | grep "Max open files"
Max open files 16384 16384 files
Soft LimitとHard Limitが変更した値になっている。
プロセス内で上限を設定する例
EventMachineを使用した例
EM.set_descriptor_table_size(2048)
supervisorから起動しているプロセスのファイルディスクリプタ
$ cat /proc/[process id]/limits | grep "Max open files"
Max open files 2048 16384 files
Soft Limitが変更される。