CPUを集中的に使用しないlsofの代替?


12

Apache Cassandraクラスターを実行し、各ホストで常に数十万のファイルを開いています。

定期的に開いているファイルの数を取得し、この数をグラファイトに入力できるようにしたいと考えていますが、実行lsofするとcollectd、完了するまでに数分かかり、その間に異常な量のCPUを噛みます。

lsofが提供するのと同じデータを取得するための代替のより友好的な方法があるのか​​、それともlsofを実行してCPUに著しく食い込まない方法があるのか​​疑問に思っています。(この後者の方法は、現在よりもはるかに時間がかかると思われますが、理想的ではありません)。

おそらくカーネルは、開いているファイルの数を含む変数をどこかに保持していますか?希望的観測?

更新:

回答の1つに応じて、すでに-band -nフラグを使用しています。以下に実行中の完全なコマンドを示しますcollectd

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

回答:


12

おそらく、ソケットのネットワークアドレスを解決する必要はないので、少なくとも-nスイッチを使用してください。次に、でブロック操作をスキップすることもできます-b

これらの2つの最初のスイッチにより、本当に高速になります。

そして、-lUIDの解決を避けるため。また-L、リンクのカウントを避けるため。その他man lsofを参照してください。

あるいは、Linuxでは、次の/proc/<PID>/fdようなリンクを単純にカウントするスクリプトを作成できます。

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


常に取得/proc/{{number}}/fd/5': No such file or directory find: -find :/ proc / {{number}} / fdinfo / 5 ':そのようなファイルまたはディレクトリはありません-Q @Benoîtどうすればそれを回避できますか?
BGブルーノ

2
@BrunoBG:試してください:echo /proc/*/fd/* | wc -w
オリビエデュラック

Thx @OlivierDulacそれは明らかなものでした:-)
BGブルーノ

良い提案が、すでに-nと-bオプションを使用している....私はより多くの提案を必要とする
マイケル・マルティネス

1
fdが非常に多い場合、@ OlivierDulacは機能しない可能性があります。
ブノワ

5

あなたはそれを間違っています。

から man proc

   /proc/sys/fs/file-nr

この(読み取り専用)ファイルには3つの数字が含まれています。割り当てられたファイルハンドルの数(つまり、現在開いているファイルの数)。空きファイルハンドルの数。ファイルハンドルの最大数(つまり、/ proc / sys / fs / file-maxと同じ値)。割り当てられたファイルハンドルの数が最大に近い場合、最大値を増やすことを検討する必要があります。Linux 2.6以前では、カーネルはファイルハンドルを動的に割り当てましたが、それらを再び解放しませんでした。代わりに、空きファイルハンドルは再割り当て用のリストに保持されていました。「空きファイルハンドル」の値は、そのリストのサイズを示しています。多数の空きファイルハンドルは、開いているファイルハンドルの使用に過去のピークがあったことを示します。Linux 2.6以降、カーネルは解放されたファイルハンドルの割り当てを解除し、

猫が現れた後にあなたが何であるかを正確に与える最初の値。

記録についてはlsof、多少の混乱があっても出力を一致させることはできませんでしたが、それでも、カーネルがあなたがlsofとにかく取得するリストよりも権威があると言っていることを収集します。


1
これが私のlsof出力です[root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065。file-nrが言うことは次のとおりです[root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428。大きな不一致(1,000,000+対2784)はlsof、ファイル記述子が関連付けられていないすべてのもの(ライブラリファイル、実行可能ファイルなど)が含まれているためです。したがって、ファイル記述子のみに関心がある場合は、file-nr行く方法です。それ以外の場合は、lsofまたは同等のものが必要です。
マイケルマルティネス

inode-nr代わりに同じ場所で試してください。
マシューイフェ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.