プロセスpid:- cmd1:-に基づいて現在開いているファイルを計算しています。
ls /proc/$pid/fd/* | wc -l
次に、最大オープンファイル制限を取得し、パーセンテージを計算しました。 cmd2:-
$ cat /proc/$pid/limits
Limit Soft Limit Hard Limit Units
Max resident set unlimited unlimited bytes
Max processes 30425 30425 processes
Max open files 4096 4096 files
Max locked memory 65536 65536 bytes
出力の一部のみを貼り付けます。
私はパーセントを計算しています:-
cmd1/cmd2*100
つまり、ls /proc/$pid/fd/* | wc -l
1000が与えられた場合。その後、パーセンテージは次のとおりです。 - 1000/4096*100=約25%
時々私が得る比率は220です。
これでシナリオを再現できます。この状況はサーバーで発生し、
/proc/pid/fd/29
プロセスに5000個のログファイルが開いていることを発見しました。
これは、プロセスpidが最大オープンファイル制限(4096)を超えたことを意味します。
答え1
この制限は、現在開いているファイルまたはファイルディスクリプタの数ではなく、新しく生成されたファイルディスクリプタ値に対するものです(open()
/などは、設定された制限より大きい数値をsocket()
返さず、失敗するため)。pipe()
n-1
n
dup2(1, n or n+1...)
有効にすると、制限が設定された瞬間からプロセスが複数のファイルを開くことができなくなりますが、制限がn
下がる前に上記のファイル記述子が作成された場合、n
プロセスは複数のファイルを開くことができます。n
n
例:
$ limit descriptors 10000 # ulimit -n 10000 in bash
$ perl -MBSD::Resource -MPOSIX -e '
dup2(1,$_) for (2000..4000);
setrlimit(RLIMIT_NOFILE, 1024, 1024);
exec zsh'
zsh$ ls /proc/$$/fd | wc -w
2009
zsh$ readlink /proc/$$/fd/3000
/dev/pts/1
zsh$ repeat 100 exec {a}>&1
zsh$ ls /proc/$$/fd | wc -w
2109
zsh$ grep files /proc/$$/limits
Max open files 1024 1024 files
実行時にzsh
プロセスの.fds 2000から4000まで開いていました/dev/pts/1
。しかし、fd制限は1024です。
すでに2009 fdがありますが、まだ100以上を作成できます。