goofys を利用して S3 サーバをマウントして運用しているサーバにてある日突然エラーとなり、マウント失敗するようになった。 それに伴いシステム上からはS3上のファイルを閲覧できなくなってしまいました。
/var/log/messages
Jun 28 16:19:03 ip-10-0-0-12 /usr/local/bin/goofys[4007]: s3.ERROR code=RequestError msg=send request failed, err=Head https://s3-ap-northeast-1.amazonaws.com/pcloud/members: dial tcp: lookup s3-ap-northeast-1.amazonaws.com on 10.0.0.2:53: dial udp 10.0.0.2:53: socket: too many open files#012
Jun 28 16:19:06 ip-10-0-0-12 /usr/local/bin/goofys[4007]: s3.ERROR code=RequestError msg=send request failed, err=Get https://s3-ap-northeast-1.amazonaws.com/pcloud?delimiter=%2F&max-keys=1&prefix=hoge%2Ffuga%2Fpiyo%2FJBSM2YQ14P%2Fpdf%2F20170628%2FSKM_C364e16110812232.pdf%2F: dial tcp: lookup s3-ap-northeast-1.amazonaws.com on 10.0.0.2:53: dial udp 10.0.0.2:53: socket: too many open files#012
調べたところ
プロセスが開けるファイルディスクリプタの上限に達してしまうと発生するエラー
という事が判明しました。今回はAWSのS3との接点となっているgoofysのプロセスのファイルディスクリプタの上限値を超えてしまったものだと思われます。
システムのファイルディスクリプタ上限値を確認する
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15205
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024 ## ここがファイルディスクリプタ上限値
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
1024 が上限値のようだ。システム上からこの数値を上回るアクセスが発生したのだろうか。
制限値を上げる
/etc/security/limits.conf
# 以下ファイル末尾にでも追記
* soft nofile 65536
* hard nofile 65536
参考サイト等あわせて65536に設定。(今までの64倍)
goofysプロセスのファイルディスクリプタ上限値を確認
/proc/(goofysプロセスID)/limits
Limit Soft Limit Hard Limit Units
省略
Max open files 1024 4096 files
1024 のまま変更されていない。
limits.conf は PAM 認証のモジュールである pam_limits.so の設定ファイルで、ログインの際に読み込まれるファイルです。
という事なので goofys に適用させる為に一度S3をアンマウントしてから再度 goofys コマンドにて接続を試みみます。
アンマウント
$ sudo kill -9 (goofysプロセスID)
$ sudo umount /your/goofys/mount/dir
マウント
$ sudo /usr/local/bin/goofys hoge /your/goofys/mount/dir/ -o rw,allow_other,--uid=48,--gid=100,--dir-mode=0775
goofys プロセスのファイルディスクリプタ上限値を確認
/proc/(goofysプロセスID)/limits
Limit Soft Limit Hard Limit Units
省略
Max open files 65536 65536 files
無事に65536に変更されている事が確認できました。