システムパフォーマンス入門

パフォーマンスに詳しいインフラに憧れて

ユーザ用ツール

サイト用ツール


· 最終更新: 2023/08/07 by kurihara


Linuxのファイルディスクリプタの確認・設定

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

ファイルディスクリプタ(file descriptor)とは、プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子です。

ファイルディスクリプタ枯渇の例

  • Apacheでコネクション数が多く、ファイルディスクリプタが不足する。
  • 1サーバで大量の常時接続コネクションを維持するにはlinuxのfile descriptorの上限がボトルネックになる
  • 枯渇すると、ログに「~Too many open files…」と表示されます。




ユーザが開けるファイルディスクリプタの上限

設定

/etc/security/limits.conf

user1 soft nofile 102400
user1 soft hard 102400
# *で、すべてのユーザが対象
* soft nofile 102400
* soft hard 102400

現在のログインユーザの上限確認

$ ulimit -n
102400
$ ulimit -a |grep file
core file size          (blocks, -c) 0
file size               (blocks, -f) unlimited
open files                      (-n) 102400
file locks                      (-x) unlimited




1プロセスが開けるファイルディスクリプタの上限

プロセスのファイルディスクリプタを確認

# cat /proc/プロセスID/limits
# cat /proc/プロセスID/limits |grep "open files"

今、プロセスが開いているファイル数の確認

# ls /proc/プロセスID/fd | wc -l


systemdの特定のサービスの設定でLimitNOFILEを設定する

PAM認証を介さないdaemon系のプロセスについては、systemdで設定を行います。
LimitNOFILE=60000を追加します。

/lib/systemd/system/nginx.service

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5

KillMode=mixed
LimitNOFILE=60000

[Install]
WantedBy=multi-user.target
確認
$ cat /proc/<PID>/limits |grep "Max open files"
Max open files            60000                524288 


systemdの全体設定でDefaultLimitNOFILEを設定する

サービスごとの個別設定ではなくsystemdを利用するサービス全てでデフォルト値を底上げするパターンです。

/etc/systemd/system.conf

変更前

#DefaultLimitNOFILE=1024:524288

変更後

DefaultLimitNOFILE=60000:524288




システム全体のファイルディスクリプタの上限(fs.file-max)

システム全体の上限はkernelパラメータのfs.file-max

オープン可能なファイル数の上限を確認

$ cat /proc/sys/fs/file-max
1636820
$ cat /proc/sys/fs/file-nr
1504	0	1636820

次の3つの情報を確認することが可能です。
1. 今までにオープンしたことのあるファイルの最大数
(割り当て済みのファイルハンドル数 )
2. 現在オープンしているファイルの総数
(使用中のファイルハンドル数 )
3. オープン可能なファイル数の上限
(/proc/sys/fs/file-max と同じ値)


設定

/etc/sysctl.conf

fs.file-max = 25172

# /sbin/sysctl -p設定の反映


参考


· 最終更新: 2023/08/07 by kurihara

ページ用ツール