最新のファイルシステムで何百万ものファイルのパフォーマンスにどのような影響がありますか?


30

ext4(dir_indexを有効にした)を使用して約3Mファイル(平均750KBサイズ)をホストし、使用するフォルダースキームを決定する必要があるとしましょう。

最初のソリューションは、我々はファイルにハッシュ関数を適用し、(最初のレベルのための1つの文字と第二のレベルに2つの文字である)フォルダ二つのレベルを使用しますので、というfilex.forハッシュに等しいabcde1234、我々は上/パスに保存します/ a / bc /abcde1234-filex.for。

第二の溶液、我々はファイルにハッシュ関数を適用し、(最初のレベルのために2つの文字及び第レベルに2つの文字である)フォルダ二つのレベルを使用します。したがって、あるfilex.forハッシュに等しいabcde1234を、我々はそれを保存します/パス/ ab / de /abcde1234-filex.for。

最初のソリューションでは、フォルダー(ファイルが存在する最後のフォルダー)あたり平均732ファイルの次のスキーム/path/[16 folders]/[256 folders]使用します

2番目のソリューションでは/path/[256 folders]/[256 folders]フォルダーごとに平均45個のファイルがあります

このスキーム(基本的にはnginxキャッシングシステム)からファイルの書き込み/リンク解除/読み取り(ただしほとんどは読み取り)を行うことを考えると、いずれかのソリューションを選択した場合、パフォーマンスの意味で重要ですか?

また、この設定を確認/テストするために使用できるツールは何ですか?


7
明らかに、ベンチマークが役立ちます。しかし、ext4はこのための間違ったファイルシステムである可能性があります。私はXFSを見ています。
ewwhite

4
XFS だけを見るのではなく、それ以上苦労せずにすぐに使用します。B + treeは毎回ハッシュテーブルを破ります。
マイケルハンプトン

ヒントのおかげで、ベンチマークは少し難しいですが、試しましhdparm -Tt /dev/hdXたが、最も適切なツールではないかもしれません。
leandro moreira

2
いいえhdparmは正しいツールではありません。ブロックデバイスの生のパフォーマンスのチェックであり、ファイルシステムのテストではありません。
-HBruijn

回答:


28

この種のディレクトリ構造を作成する理由は、ファイルシステムがディレクトリ内のファイルを見つける必要があり、ディレクトリが大きいほど、その処理が遅くなるためです。

どれだけ遅くなるかは、ファイルシステムの設計に依存します。

ext4ファイルシステムは、Bツリーを使用しディレクトリエントリを格納します。このテーブルのルックアップにはO(log n)時間がかかると予想されます。ほとんどの時間は、ext3と以前のファイルシステムが使用した素朴な線形テーブルよりも短いです(そうでない場合、ディレクトリが小さすぎます本当に重要)。

XFSファイルシステムは代わりにBツリーを使用します。ハッシュテーブルまたはBツリーに対するこの利点は、任意のノードに複数の子bがあり、XFS bが 254(またはルートノードの場合は19)、これらの数値が古くなる可能性があることです。 )。これにより、O(log b n)の時間の複雑さが大幅に改善されます。

これらのファイルシステムはどちらも単一のディレクトリで数万のファイルを処理でき、XFSは同じ数のiノードを持つディレクトリでext4よりもはるかに高速です。ただし、Bツリーを使用しても検索に時間がかかることがあるため、3Mのiノードを持つ単一のディレクトリは必要ないでしょう。これが、そもそもこの方法でディレクトリを作成することになった理由です。

提案された構造に関して、最初に指定したオプションは、nginxの例に示されているとおりです。どちらのファイルシステムでもうまく機能しますが、XFSにはまだ少し利点があります。2番目のオプションのパフォーマンスはわずかに優れているかわずかに劣るかもしれませんが、ベンチマークでもかなり近いでしょう。


また、XFSまたはext4の場合、ファイルシステムを配置したハードウェアはパフォーマンスに大きな影響を与えます。遅い5400-rpm SATAドライブは約50のランダムIO操作/秒を実行でき、優れた15,000-rpm SASドライブは数百を実行でき、SSDはおそらく帯域幅が制限され、数百万のランダムIO操作/秒を取得する可能性がありますそうでない場合。
アンドリューヘンレ

1
厳密に言えば、固定$ b $の$ O(\ log_b n)$は$ O(\ log n)$と同じ複雑さです。しかし、OPにとっては、実際の定数が重要になります。
ハーゲンフォンアイゼン

私のファイルシステムに何か問題がない限り、ext4は1つのディレクトリで10,000個のファイルを処理できません。ls -lディレクトリがiノードキャッシュから削除された場合、単純な操作には1分かかります。また、キャッシュされると、1秒以上かかります。これは、かなりトラフィックの少ないWebサーバーに大量のRAMを搭載したSSDとXeonを使用する場合です。
アブヒベッカート

@AbhiBeckert ext3からアップグレードされましたか?その場合は、新しいディレクトリを作成して、そこにファイルを移動してみてください。
マイケルハンプトン

@Hamptonいいえ。最近のハードウェアで(かなり)最近セットアップされたサーバーです。私はsysadmin / data centerでこの問題に数ヶ月取り組んでいます。サーバーをリースするために毎月数千ドルを支払っていますが、サーバーから許容できるパフォーマンスを得ることができません。唯一のオプションは、新しいディレクトリ構造に移動することです-ファイル名に日付の代わりにハッシュを使用して、ファイルをより均等に広げることが考えられます。
Abhi Beckertの

5

私の経験では、スケーリング係数の1つは、ハッシュ名分割戦略を与えられたiノードのサイズです。

提案されたオプションは両方とも、作成されたファイルごとに最大3つのiノードエントリを作成します。また、732個のファイルは、通常の16KBよりも小さいiノードを作成します。私にとって、これはどちらのオプションでも同じことを意味します。

あなたの短いハッシュであなたに拍手を送ります。私が取り組んできた以前のシステムは、与えられたファイルのsha1sumと、その文字列に基づいて接続されたディレクトリを取得しており、これははるかに難しい問題でした。


1
SHA1の合計(およびその他の長いハッシュの合計)を「はるかに難しい問題」とする理由は何ですか?はい、人間のユーザーには扱いにくいですが、OS、ファイルシステム、および他のプログラムと同じです。
kbolino

4

確かに、どちらのオプションでも、ディレクトリ内のファイルの数を、xfsまたはext4または任意のファイルシステムにとって妥当と思われるものに減らすことができます。どちらが優れているかは明らかではないので、テストする必要があります。

実際のワークロードのようなものをシミュレートするアプリケーションのベンチマークが理想的です。それ以外の場合は、多くの小さなファイルを具体的にシミュレートするものを考え出します。そういえば、ここにsmallfileと呼ばれるオープンソースのものがあります。そのドキュメントは他のいくつかのツールを参照しています。

hdparm持続的なI / Oを行うことはそれほど有用ではありません。非常に多くのファイルに関連付けられた多くの小さなI / Oまたは巨大なディレクトリエントリは表示されません。


1

問題の1つは、フォルダーをスキャンする方法です。

フォルダでスキャンを実行するJavaメソッドを想像してください。

大量のメモリを割り当て、短時間で割り当てを解除する必要がありますが、これはJVMにとっては非常に重いことです。

最良の方法は、各ファイルが専用フォルダーにあるようにフォルダー構造を整理することです(年/月/日など)。

フルスキャンが行われる方法は、各フォルダーに対して関数が1回実行されるため、JVMは関数を終了し、RAMの割り当てを解除して、別のフォルダーで再度実行します。

これは単なる例ですが、とにかくそのような巨大なフォルダーを持っていることは意味がありません。


2
Javaを想定し、フォルダーをスキャンしています。質問にはどちらも記載されていません。Javaでフォルダーを処理する方法は、スキャン以外にもあります。
user207421

1

私は同じ問題を抱えています。ext4のUbuntuサーバーに数百万のファイルを保存しようとしています。独自のベンチマークの実行を終了しました。フラットディレクトリの方がパフォーマンスが優れている一方で、使用方法が簡単であることがわかりました。

基準

記事を書きました。


それは間違いなく期待される結果ではありません。これを使用するか推奨する前に、この予期しない結果が得られた理由を詳しく調べる必要があります。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.