各プロセスで開かれたファイル数を見つける方法

各プロセスで開かれたファイル数を見つける方法

カフカサービスあり(systemctlサービスとして)

サービスで開かれたファイル数を設定しました。

例:

[Service]
LimitMEMLOCK=infinity
LimitNOFILE=1500000
Type=forking
User=root
Group=kafka

さて、サービスが起動したら、kafkaサービスが消費するファイルの数を知りたいと思います。

Googleで知った事実 -https://www.cyberciti.biz/faq/howto-linux-get-list-of-open-files/

fstatこのコマンドを使用して、開いているファイルの数をキャプチャできます。

〜のように

fstat -p {PID}

私たちは本番RHEL 7.6セキュリティサーバーを使用しているので、これがfstat私たちのサーバーにインストールできるかどうかはわかりません。

では、他のアイデアを知りたいですか?

他のアプローチを取ってくれてありがとう。

他の提案された方法は次のとおりです。ls "/proc/$pid/fd"

しかし、これは私のコンピュータの実際の例です。

ls /proc/176909/fd  |more
0
1
10
100
1000
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
1001
10010
10011
10012
.
.
.

そうすれば、長い数字のリストが得られます。

答え1

コメントで述べたように、wc次のコマンドを使用できます。

ls  "/proc/$pid/fd"|wc -l

-l行数の計算(lsコマンド結果)

答え2

(参照)LimitNOFILEの指示文は、(参照)で設定したリソース制限に対応します。一部のシェルで使用または設定できます。systemdman systemd.execRLIMIT_NOFILEsetrlimit()man setrlimitulimit -nlimit descriptors

これは、プロセスが開くことができるファイル記述子の最大数より1大きい値を指定します。この制限を超える試み(open(2)、Pipe(2)、dup(2)など)はEMFILEエラーを生成します。 (歴史的に、この制限はBSDでRLIMIT_OFILEと命名されました。)

したがって、厳密に言えば、開かれたファイル記述子の数に制限はありません(開いたファイルはもちろん)。制限があるプロセスは、設定時にその制限よりも高いfdを持つ方が良いでしょう。生成されます)、より多くの開いているファイルを持つことができます(clone()/ fork()))。オープンfdがほとんどない場合でも、制限を超えるfdを取得できません。

Linuxでは、/proc/<pid>/fdプロセスで開かれた各fdのマジックシンボリックリンクファイルを含む特別なディレクトリです。

次の数を数えることができます。

() {print $#} /proc/$pid/fd/*(NoN)

たとえばzsh(またはls "/proc/$pid/fd" | wc -lRomeoが示したように)。

最高のpid値を取得して最初の値を取得するには、数値を逆順に並べ替えます。

() {print $1} /proc/$pid/fd/*(NnOn:t)

またはGNUを使用してくださいlsls -rv "/proc/$pid/fd" | head -n1

すべてのプロセスで開いているfdの数に関するレポートを取得するには、次のようにします。

(for p (/proc/<->) () {print -r $# $p:t $(<$p/comm) $p/exe(:P)} $p/fd/*(NoN)) | sort -n

より便利には、次のことができますlsof

lsof -ad0-2147483647 -Ff -p "$pid" | grep -c '^f'

開かれたファイル記述子の数と:

lsof -ad0-2147483647 -Ff -p "$pid" | sed -n '$s/^f//p'

最高です。

関連情報