ファイルディスクリプタの上限を増やす

(2016-12-08)

ファイルディスクリプタとは

プロセスの外部とやりとりするための識別子。POSIXではint型で、0がstdin、1がstdout、2がstderrといったもの。 ファイルやデバイスに対するopen()や、 ネットワーク(INETドメインソケット)やホスト内(UNIXドメインソケット)で 通信するためのソケットを生成するsocket()などのシステムコールで生成される。

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

一つのプロセスがリソースを食いつぶさないように 使えるファイルディスクリプタの上限が決まっていて、ulimit -nで確認できる。デフォルトは大体1024。

$ ulimit -n
1024

各プロセスの上限と使っているファイルディスクリプタはこれで確認できる。

$ cat /proc/<プロセスID>/limits
...
Max open files            1024                 4096                 files     
...

$ ls -l /proc/<プロセスID>/fd

webサーバーのように同時にたくさん通信したりすると上限に達してしまい、Too many open filesになってしまうので増やす必要がある。

/etc/security/limits.confで変更する

PAM認証時(ログインするときなど)に適用されるので、サーバーの起動時に立ち上がったデーモンには使えない。

$ cat /etc/pam.d/sshd
...
session    required     pam_limits.so
...

全てのユーザー(*)のプロセスが使える ファイルディスクリプタ(nofile)のsoft(ユーザーが設定できる)とhard(rootが設定できる)上限を共に64000にする。

$ echo "* hard nofile 64000" >> /etc/security/limits.conf
$ echo "* soft nofile 64000" >> /etc/security/limits.conf
$ ulimit -n
64000

ulimit -nで変更する

シェルと、起動したプロセスで有効。

$ ulimit -n 64000

dockerコンテナでは

run時にulimitオプション--ulimit nofile=11111のように指定することもできる。

$ docker run -itd --ulimit nofile=11111 ubuntu
$ docker exec -it <id> /bin/bash -c "ulimit -n"
11111

参考

/etc/security/limits.confに関するメモ | OpenGroove

ファイルディスクリプタ数の上限変更とlimits.confの罠

Linuxのファイルディスクリプタ数を変更・確認する方法: 小粋空間

ファイル記述子 - Wikipedia

調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話 - Qiita