
(フェリスエステル・アルゾラによる探偵、カレン・ラスタッド・テルヴァによるオリジナルデザイン)
FindLargedirは、単一のフラット構造に100kを超えるエントリを持つファイルシステムで「ブラックホール」ディレクトリをすばやく識別するのに役立つために特別に書かれたツールです。ディレクトリに多くのエントリ(ディレクトリまたはファイル)がある場合、ディレクトリリストの取得が遅くなり、より遅くなり、ディレクトリリストを取得しようとするすべてのプロセスのパフォーマンスに影響を与えます(たとえば、一部のファイルを削除したり、特定のファイルを見つけたりするため)。大規模なディレクトリの象牙を読むプロセスは、そうしている間に凍結され、途切れやすい睡眠(「d」状態)に長期にわたって長期にわたって終わります。ファイルシステムに応じて、これは100kのエントリで見えるようになり始め、1M+エントリで非常に顕著なパフォーマンスの影響になり始めます。
このようなディレクトリは、ほとんどのLinuxおよびUN*Xファイルシステムがディレクトリイノードの縮小をサポートしていないという事実のためにコンテンツがクリーンアップされたとしても、ほとんど縮小することはできません(たとえば非常に一般的なExt3/Ext4)。これは、忘れられたWeb Sessionsディレクトリ(GC間隔が数日間構成されたPHP Sessionsフォルダー)、さまざまなキャッシュフォルダー(CMSコンパイルされたテンプレートとキャッシュ)、POSIXファイルシステムをエミュレートするオブジェクトストレージなどでよく発生します。
プログラムは、任意の数のイベントを特定し、キャリブレーションに基づいてそれらについて報告しようとします。各ファイルシステムの各ディレクトリイノードに想定されるディレクトリエントリがいくつか詰まっています。そうしている間、ディレクトリイノードの成長率をエントリ/イノデの数に決定し、その比率を使用してファイルシステムをすばやくスキャンし、高価な/遅いディレクトリの検索を回避します。ファイルシステムをスキャンする多くのツール( find 、 du 、 ncduなど)がありますが、それらは完全に正確になるように設計されているため、高価な検索を避けるためにヒューリスティックを使用しません。
プログラムはSymlinksに従うことはなく、ディレクトリを調整してディレクトリのイノードサイズをエントリ数に計算し、実際にカウントせずにディレクトリ内の多数のエントリを推定できるようにディレクトリを調整するためのR /Wアクセス許可が必要です。この方法は、ディレクトリ内の実際のエントリの数の近似にすぎませんが、ディレクトリを違反するためにすばやくスキャンするのに十分です。

-a )は、過度のI/Oと過度のメモリ使用を引き起こす可能性があります。必要に応じてのみ使用してくださいUsage: findlargedir [OPTIONS] < PATH > ...
Arguments:
< PATH > ... Paths to check for large directories
Options:
-a, --accurate < ACCURATE >
Perform accurate directory entry counting [default: false] [possible values: true, false]
-o, --one-filesystem < ONE_FILESYSTEM >
Do not cross mount points [default: true] [possible values: true, false]
-c, --calibration-count < CALIBRATION_COUNT >
Calibration directory file count [default: 100000]
-A, --alert-threshold < ALERT_THRESHOLD >
Alert threshold count (print the estimate) [default: 10000]
-B, --blacklist-threshold < BLACKLIST_THRESHOLD >
Blacklist threshold count (print the estimate and stop deeper scan) [default: 100000]
-x, --threads < THREADS >
Number of threads to use when calibrating and scanning [default: 24]
-p, --updates < UPDATES >
Seconds between status updates, set to 0 to disable [default: 20]
-i, --size-inode-ratio < SIZE_INODE_RATIO >
Skip calibration and provide directory entry to inode size ratio (typically ~ 21-32) [default: 0]
-t, --calibration-path < CALIBRATION_PATH >
Custom calibration directory path
-s, --skip-path < SKIP_PATH >
Directories to exclude from scanning
-h, --help
Print help information
-V, --version
Print version information正確なモード( -aパラメーター)を使用する場合、大きなディレクトリルックアップが長時間プロセスを完全に停止することに注意してください。このモードが行うことは、基本的に、エントリの正確な数を計算する可能性のあるディレクトリの可能性のある二次的な完全な正確なパスです。
マウントされたファイルシステムへの降順を避けるため(検索-XDEVオプションのように)、パラメーター1-ファイルシステムモード( -oパラメーター)はデフォルトで切り替えられますが、必要に応じて無効にすることができます。
ディレクトリのイノードサイズを-iパラメーターでエントリ比数に手動で提供することにより、キャリブレーションフェーズを完全にスキップすることができます。これは、以前の実行などの比率をすでに知っている場合にのみ理にかなっています。
-pパラメーターを0に設定すると、プログラムが時折ステータスの更新を提供しません。
ハードウェア:4ドライブSATA RAID-10を搭載した8コアXeon E5-1630
ベンチマークのセットアップ:
$ cat bench1.sh
#! /bin/dash
exec /usr/bin/find / -xdev -type d -size +200000c
$ cat bench2.sh
#! /bin/dash
exec /usr/local/sbin/findlargedir /Hyperfineで測定された実際の結果:
$ hyperfine --prepare ' echo 3 | tee /proc/sys/vm/drop_caches '
./bench1.sh ./bench2.sh
Benchmark 1: ./bench1.sh
Time (mean ± σ): 357.040 s ± 7.176 s [User: 2.324 s, System: 13.881 s]
Range (min … max): 349.639 s … 367.636 s 10 runs
Benchmark 2: ./bench2.sh
Time (mean ± σ): 199.751 s ± 4.431 s [User: 75.163 s, System: 141.271 s]
Range (min … max): 190.136 s … 203.432 s 10 runs
Summary
' ./bench2.sh ' ran
1.79 ± 0.05 times faster than ' ./bench1.sh ' ハードウェア:48コアXeon Silver 4214、7-drive SM883 SATA HW RAID-5アレイ、2TBコンテンツ(小さなファイルを備えたコンテナの数十)
同じベンチマークセットアップ。結果:
$ hyperfine --prepare ' echo 3 | tee /proc/sys/vm/drop_caches '
./bench1.sh ./bench2.sh
Benchmark 1: ./bench1.sh
Time (mean ± σ): 392.433 s ± 1.952 s [User: 16.056 s, System: 81.994 s]
Range (min … max): 390.284 s … 395.732 s 10 runs
Benchmark 2: ./bench2.sh
Time (mean ± σ): 34.650 s ± 0.469 s [User: 79.441 s, System: 528.939 s]
Range (min … max): 34.049 s … 35.388 s 10 runs
Summary
' ./bench2.sh ' ran
11.33 ± 0.16 times faster than ' ./bench1.sh '