
私は使用しています京都内閣私のプロジェクトでは、キーバリューストアを使用しています。私が使用しているDBの種類はディレクトリDBこれにより、ディレクトリ内にキーと値のペアを格納するためのファイルが多数作成されます。このプロジェクトを実行しているサーバーは、ext4 ファイルシステムです。私が遭遇している問題は、ディレクトリ内のファイル数が増えるにつれて、I/O レイテンシが増加することです。また、ディレクトリ内のファイルが多すぎる場合 (たとえば、100 万ファイルを超える場合)、フォルダー全体を削除しようとすると、永遠に時間がかかります (すでに 5 時間以上経過し、まだ実行中です)。ファイル数が増えるにつれて I/O レイテンシが増加する理由と、rm がフォルダーを削除するのに永遠に時間がかかる理由を説明していただけますか?
答え1
遅延の最も単純な例は、明らかに、ディレクトリ全体を一覧表示するのにかかる時間がディレクトリの大きさによって異なることです。
次に、ファイルシステムの設定に応じて、ext4 はディレクトリ検索にリンク リストまたはハッシュ B ツリーを使用します。これら 2 つのデータ構造がどのように機能するかを調べるだけで、誤った構成によって生じる可能性のある違いをある程度把握できます。簡単に言うと、リンク リストは非常に遅く、小さなディレクトリにしか適していません。一方、ハッシュははるかに高速で、大きなディレクトリに適しています。
リンク リストを処理するということは、リスト内のすべての項目を調べることを意味します。ほとんどの場合、項目 n-1 だけが項目 n がどこにあるかを知っているため、最初に項目 n を読み取る必要があるためです。
ハッシュ ツリーの処理には、メモリ内の数値の計算と、その数値に基づいて詳細への直接ジャンプが含まれます。大きなディレクトリの場合はこれを数回実行する必要がある場合がありますが、すべてのノードを処理するよりもはるかに高速です。
とにかく、詳細を本当に理解したい場合は、すべてのドキュメントがオンラインで入手できます。たとえば、ここから始めることができます。https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#ハッシュツリーディレクトリ