Linuxでディレクトリの総容量を確認する方法とその応用の実務上の結論は「directoryの使用量はdu -sh、logical totalは–apparent-size、mount境界を越えない調査は-xを使います。permission errorとfilesystem全体のdfを別に確認します。」です。directory集計のduとfilesystem全体のdfは母集団が違います。root path、mount境界、logicalかallocatedか、走査開始時刻を固定し、差があること自体をerrorにしません。
du・df・apparent sizeを分ける
duはdirectory treeから見えるentryの使用量を集計し、dfはfilesystem全体のallocationを示します。du –apparent-sizeはlogical size、通常duはallocated block寄りで、同じmetricではありません。mount、hard link、sparse、compression、reflink、snapshot、deleted-open fileを考慮し、du -shの一値を物理disk消費と断定しません。
du -shは合計の目視、du –max-depth=1は直下比較、-xは別filesystemを越えない集計です。正確な閾値には-B1等の整数単位を使い、-hは表示用にします。findmntで対象mountとFSTYPEを確認し、network/overlay/snapshotを含めるか決めます。除外patternとreadできないsubdirectoryを作業記録へ残します。
duのroot・mount境界・測定metricを固定する
- allocated usageかapparent sizeかを決める
- 検索rootとmount境界を確認する
- permission errorと除外条件を記録する
- hard link、snapshot、compressionの影響を確認する
本番でrecursive scanを始める前にI/O上限と-xの要否を決めます。snapshotが取れず更新量が大きいdirectory、またはsearch permissionが不足するrootでは停止し、owner承認後の低負荷windowへ戻します。
合計・直下内訳・apparent size・dfを比べる
directory合計を表示
du -sh -- ./project
human-readable値は概要用で、閾値判定にはbyte/block値を使います。
直下項目を比較
du -h --max-depth=1 -- ./project | sort -h
GNU optionのavailabilityをdu –versionとhelpで確認します。
filesystem境界を越えない
du -shx -- ./project
別mountを含めない調査に使い、除外された範囲を記録します。
apparent sizeを確認
du -sh --apparent-size -- ./project
sparseやcompressionでは通常duとの差が広がります。
filesystem空き容量も表示
df -h -- ./project
duのdirectory合計とdfのfilesystem使用量を同じmetricとして差し引きません。
再帰scanの境界と負荷
duはtree内entryのdisk usageを集計しますが、filesystemが報告するblock、hard linkの重複抑制、sparse、compression、reflink、permissionに左右されます。dfはfilesystem全体のallocation、duは見えるtreeの集計で、deleted-open fileやreserved blocks等により一致しません。
dfがduより大きい場合、削除済みだがprocessがopen中のfile、reserved block、filesystem metadata、snapshotなどが候補です。duが期待と違う場合はhard linkの数え方、sparse、permission error、mount境界を確認します。container overlayやthin provisioningではguestから見えるallocationとbackend物理消費がさらに異なります。
Permission deniedを0 byteとして合計すると結果は不完全な下限値です。走査中にfileが増減すると同じrootでも値が変わり、network mountの遅延や切断でpartial resultになる場合があります。duのstderr、終了status、未計測path数、実行時間を保存し、human-readable値の丸め差を異常と誤認しないようにします。
permission未計測・open削除file・snapshotを分ける
- duとdfが必ず一致すると考える
- permission deniedを無視して完全値とする
- apparent sizeを実disk消費とする
- network mountまで意図せず走査する
- snapshotやdeleted-open fileを見落とす
duのwarningがあれば表示合計を完全値として採用しません。open済み削除fileはduに見えずdfへ残るためprocess側を確認し、mountやsnapshot差が疑われる時は同じtargetでfindmntを採って再集計します。
recursive scanのI/O上限を先に置く
production rootで頻繁なrecursive duを行うとI/O負荷が高まります。対象を小さくし、-x、priority、実行時間帯を検討します。permissionを緩めて全entryを読むのではなく、error件数と未計測範囲を明記します。
容量確認の最中にcache、log、snapshotを削除しません。大規模treeへのduはI/O負荷を生むため、対象限定、-x、maintenance時間、nice/ionice利用可否を管理者と決めます。権限不足をchmod -Rやroot常用で解決せず、未計測範囲を報告します。誤ってremote mount全体を走査しないことを最初に確認します。
容量差を説明できる検証
sample treeは1 KiBのregular file、holeを持つsparse file、同一inodeへのhard link、検索不可subdirectory、別mountで構成します。du -B1、–apparent-size、-x、dfの期待値を表にし、warning fixtureでは合計を不完全として扱います。
再現性の確認では走査前後のdevice・inodeと取得時刻を保存し、cold cacheと再走査の所要時間を別々に測ります。treeが途中更新されたrunは比較対象から外し、open済み削除fileのscenarioだけはprocess側の観測結果と照合します。
走査statusと未計測pathを容量値へ添える
監視はfilesystem使用率、inode使用率、directory別usageを別metricにし、sourceと収集methodを明記します。du全走査へtimeoutと対象上限を設け、errorを前回値や0で埋めません。閾値超過時はtop directoryの増分とownerを通知し、自動削除ではなくretention確認へ接続します。巨大storageではinventoryやquota APIを優先します。
一時確認はdu -sh、内訳比較はdepth制限、filesystem逼迫はdf -h/-i、backend容量はstorage側metricを使います。deleted-open fileはprocess調査、snapshotはstorage管理、quotaはowner policyへ分岐します。数値の取得から削除判断までを一手順にせず、容量増加の種類ごとに担当と復旧方法を決めます。
合格は空directory、別mount、読取不可subdirectoryを含むfixtureで合計と未計測pathが説明できることです。走査中更新またはI/O上限超過のrunは中断し、snapshotからやり直します。

コメント