ファイルディスクリプタ―は、ある程度の負荷があるWebサイトを運用すると遭遇する問題です。
エラーログなどに「Too many open files」と記録されて、正常に動作しない状態に遭遇するのがLinuxのファイルディスクリプタ―です。
これに対応しようと思って、googleで検索すると、いろいろ記事が出てくるけど、知りたいことズバリと答えてくれる記事がなかなかヒットしない。
ulimit や /etc/security/limits.conf について案内されているけど、反映されないケースがあって、/etc/init.d/の起動スクリプトにも書けetcなどと。
結論
nginx や mysql などのミドルウェアであれば、それぞれのconfigファイル内で定義することで設定をきかせることが可能。
nginx
worker_rlimit_nofileで設定する。ワーカプロセスが開くファイル数の最大限界値(RLIMIT_NOFILE)を変更します。RLIMIT_NOFILEは、プロセスが開くことができるファイルディスクリプタ―数を指定するものです。
worker_rlimit_nofile 10240;
mysql
open_files_limitで設定する。オペレーティングシステムで mysqld が開くことを許可するファイル数。実際の open_files_limit の値は、システム起動時に指定された値 (ある場合) と、max_connections および table_open_cache の値に基づき、式を使用します。
[mysqld_safe]
open_files_limit = 8192
Linux全体
OS全体のファイルディスクリプタ―数は、「/etc/sysctl.conf」で設定する。
設定されている値の確認
cat /proc/sys/fs/file-nr
設定値
fs.file-max = 1232457