プログラムからファイルを操作する際、操作対象のファイルを識別・同定するために割り当てられる番号。OSにアクセスを依頼する際にファイルを指定するのに用いられる整数値である。
Runner上でコンテナを起動しSASTツールを利用した時、「Too many open files」のエラーが発生するのは、開いたファイルの数がこの上限数を超えたためです。
ファイルディスクリプタ(以下はFDと言う)はOSとしての上限だけではなく、プロセスごとにも存在します。
以下のイメージに合わせて①~④をそれぞれ説明します。
①:Linux OSの合計FD数の上限値の変更
OSのFD上限値 ≧ 各プロセスが開いたファイル数合計の必要があります。
上限値は cat /proc/sys/fs/file-maxで確認でき、root user で echo xxxxxxxx > /proc/sys/fs/file-max を実行すると一時的に変更することができます。OS再起動後も設定が有効にするためには、上記の echo 文を起動シェル(/etc/rc.d/rc.local など)に追加すればよい。
②:プロセスのファイルディスクリプタの変更
ulimit -Sn と ulimit -Hn でsoftとhardの設定値が確認できます。ulimit -Sn xxxxxx と ulimit -Hn xxxxxx でそれぞれの値を一時的に変更することができ、/etc/security/limits.confに以下を追加すると、ログインするたびに設定する手間が省けます。
* soft nofile xxxxxx
* hard nofile xxxxxx
※SoftLimitはHardLimit以下の範囲内で一般ユーザが変更可能ですが、HardLimitはrootでしか変更できません。
ulimitを実行したシェルおよび、そのシェルから起動される子プロセスに対して一時的に設定を変えることが出来ます。
③:コンテナのファイルディスクリプタの変更
稼働中コンテナのFD設定値です。コンテナに入って、ulimit -nで確認することができます。稼働中コンテナのFDを変更するのは出来ません。設定するには、起動する時に引数指定とデフォルト設定を変更すると2つの方法があります。起動時引数の指定方法は以下となります。
Docker Engine : docker(podman) run --ulimit nofile=soft:hard --rm ….
※softとhardのところは具体的な数値を指定する、--ulimit nofile=hostの書き方も可能
④:コンテナのデフォルト値の変更
DockerとPodmanによってコンテナを利用する場合、デフォルト値の設定方法はそれぞれ違います。
Docker:以下のコマンドで現在の設定は確認できます。設定値を変更するには、nofile=sofr:hardの部分を変更すればよいです。(変更後コンテナを起動しても反映されない場合、docker daemonを再起動してみてください)
cat /etc/sysconfig/docker
前略~
# Additional startup options for the Docker daemon, for example:
# OPTIONS="--ip-forward=true --iptables=true"
# By default we limit the number of open files per container
OPTIONS="--default-ulimit nofile=32768:65536"
~後略
/etc/sysconfig/dockerが存在しない場合、以下のコマンドで探してみてください。
sudo systemctl show docker | grep EnvironmentFile
Podman:以下のコマンドで現在の設定は確認できます。設定値を変更するには、nofile=sofr:hardの部分を変更すればよいです。
cat /etc/containers/containers.conf
前略~
# A list of ulimits to be set in containers by default, specified as
# "<ulimit name>=<soft limit>:<hard limit>", for example:
# "nofile=1024:2048"
# See setrlimit(2) for a list of resource names.
# Any limit not specified here will be inherited from the process launching the
# container engine.
# Ulimits has limits for non privileged container engines.
#
default_ulimits = [
"nofile=1280:2560",
]
~後略
コンテナで静的解析ツール実行時に開いたファイルの数がFD上限を超えてエラーになった場合、コンテナ起動時のデフォルト値を変更するか、コンテナ起動時に–ulimit nofile=soft:hardオプションを指定するかで問題解決できます。
Runner上で直接静的解析ツールを動かす場合、プロセス(user)のデフォルト値を変更することによって、問題解決できます。