プロセスが最大オープンファイル制限を超えました。

プロセスが最大オープンファイル制限を超えました。

プロセス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 -l1000が与えられた場合。その後、パーセンテージは次のとおりです。 - 1000/4096*100=約25%

時々私が得る比率は220です。

これでシナリオを再現できます。この状況はサーバーで発生し、 /proc/pid/fd/29プロセスに5000個のログファイルが開いていることを発見しました。

これは、プロセスpidが最大オープンファイル制限(4096)を超えたことを意味します。

答え1

この制限は、現在開いているファイルまたはファイルディスクリプタの数ではなく、新しく生成されたファイルディスクリプタ値に対するものです(open()/などは、設定された制限より大きい数値をsocket()返さず、失敗するため)。pipe()n-1ndup2(1, n or n+1...)

有効にすると、制限が設定された瞬間からプロセスが複数のファイルを開くことができなくなりますが、制限がn下がる前に上記のファイル記述子が作成された場合、nプロセスは複数のファイルを開くことができます。nn

例:

$ 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以上を作成できます。

関連情報