ファイルディスクリプタ数を拡張する方法


概要

HttpdやSquidなどの頻繁にファイル入出力を発生させるプロセスは、ファイルディスクリプタ数の上限を意識していないと痛い目に遭うらしい。
ファイルディスクリプタ数を増やす方法を調べると、多くの情報が出てくるのでありがたいのだけれど、逆にどの方法でやれば良いのか迷ってしまう。
ひとまず実際に検証して、増えた(ように見える)方法を残しておくことにする。間違い指摘大歓迎。

Httpd

まずは拡張する前のファイルディスクリプタ数を調べる。

現在の最大FD数チェック
# 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
override.conf
[Service]
LimitNOFILE=65535

作業後にもう一回調べる。

現在の最大FD数チェック
# 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とほぼ同じ方法で拡張できる。
まずは拡張する前のファイルディスクリプタ数を調べる。

現在の最大FD数チェック
# 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よりだいぶ多い。
なんでシステムデフォルトより多いんだろう?と思って調べると次の場所に書いてあった。

SquidのデフォルトFD設定箇所
# 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
override.conf
[Service]
LimitNOFILE=100000

作業後にもう一回調べる。

現在の最大FD数チェック
# 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 {ポート番号}オプションは省略可能です。

現在の最大FD数チェック
# 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は設定ファイルに記述することでも拡張することが出来る。ただし、なんだか変な挙動となる。(後述)
まずは拡張する前のファイルディスクリプタ数を調べる。

現在の最大FD数チェック
# 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
squid.conf
# 最下行辺りに追記
max_filedescriptors 150000

作業後にもう一回調べる。

現在の最大FD数チェック
# 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で調べてみた。

現在の最大FD数チェック
# 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にて今後設定していくことにしよう。

参考