概要
HttpdやSquidなどの頻繁にファイル入出力を発生させるプロセスは、ファイルディスクリプタ数の上限を意識していないと痛い目に遭うらしい。
ファイルディスクリプタ数を増やす方法を調べると、多くの情報が出てくるのでありがたいのだけれど、逆にどの方法でやれば良いのか迷ってしまう。
ひとまず実際に検証して、増えた(ように見える)方法を残しておくことにする。間違い指摘大歓迎。
Httpd
まずは拡張する前のファイルディスクリプタ数を調べる。
# cat /proc/`pgrep --parent 1 -f httpd`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 1024 4096 files ← 最大FD数
Max locked memory 65536 65536 bytes
...
1024がデフォルトみたい。うーん、少ないなぁ。
という事で、以下のコマンドで65535まで上げてみる。
# mkdir /etc/systemd/system/httpd.service.d
# vi /etc/systemd/system/httpd.service.d/override.conf
# systemctl daemon-reload
# systemctl restart httpd.service
[Service]
LimitNOFILE=65535
作業後にもう一回調べる。
# cat /proc/`pgrep --parent 1 -f httpd`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 65535 65535 files ← 最大FD数
Max locked memory 65536 65536 bytes
...
無事増えました。この設定はサービスやOSを再起動してもちゃんと保持されます。
Squid 方法1
Httpdとほぼ同じ方法で拡張できる。
まずは拡張する前のファイルディスクリプタ数を調べる。
# cat /proc/`pgrep --parent 1 -f squid`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 16384 16384 files ← 最大FD数
Max locked memory 65536 65536 bytes
...
16384がデフォルトみたい。Httpdよりだいぶ多い。
なんでシステムデフォルトより多いんだろう?と思って調べると次の場所に書いてあった。
# cat /etc/systemd/system/multi-user.target.wants/squid.service | grep LimitNOFILE
LimitNOFILE=16384
まぁまぁこれでもいいような気がするけど、以下のコマンドでもっと多めに100000まで上げてみる。
# mkdir /etc/systemd/system/squid.service.d
# vi /etc/systemd/system/squid.service.d/override.conf
# systemctl daemon-reload
# systemctl restart squid.service
[Service]
LimitNOFILE=100000
作業後にもう一回調べる。
# cat /proc/`pgrep --parent 1 -f squid`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 100000 100000 files ← 最大FD数
Max locked memory 65536 65536 bytes
...
無事増えました。この設定もサービスやOSの再起動でリセットされてしまうことはありません。
ちなみにSquidは、ファイルディスクリプタ数の確認を次のコマンドでも可能です。どれだけ使用中かも確認できるので便利。
プロキシポートを変えていなければ-p {ポート番号}
オプションは省略可能です。
# squidclient -p 8080 mgr:info | grep "file desc"
Maximum number of file descriptors: 180000 ← 最大FD数
Largest file desc currently in use: 11
Number of file desc currently in use: 6
Available number of file descriptors: 179994
Reserved number of file descriptors: 100
Squid 方法2
Squidは設定ファイルに記述することでも拡張することが出来る。ただし、なんだか変な挙動となる。(後述)
まずは拡張する前のファイルディスクリプタ数を調べる。
# cat /proc/`pgrep --parent 1 -f squid`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 16384 16384 files
Max locked memory 65536 65536 bytes
...
以下のコマンドで150000まで上げてみる。
# vi /etc/squid/squid.conf
# systemctl restart squid.service
# 最下行辺りに追記
max_filedescriptors 150000
作業後にもう一回調べる。
# cat /proc/`pgrep --parent 1 -f squid`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 16384 16384 files ← 最大FD数
Max locked memory 65536 65536 bytes
...
あれ...増えてない?
試しに子プロセスのプロセスIDで調べてみた。
# cat /proc/`pgrep -f squid | tail -1`/limits
Limit Soft Limit Hard Limit Units
...
Max processes 15568 15568 processes
Max open files 150000 150000 files ← 最大FD数
Max locked memory 65536 65536 bytes
...
こっちだと増えてる。どういうことなの...
不安だから方法1にて今後設定していくことにしよう。