多くの小さなファイルと少数の大きなファイルを含むディレクトリツリーがあります。ファイルの平均サイズは約1キロバイトです。ツリーには210158個のファイルとディレクトリがあります(この数はfind | wc -l
を実行して取得されました)。
ごく一部のファイルが週に数回追加/削除/書き換えされます。これは、小さなファイルだけでなく、(少数の)大きなファイルにも当てはまります。
私が試したファイルシステム(ext4、btrfs)は、ディスク上のファイルの配置にいくつかの問題があります。長い時間をかけて、ディスク上のファイルの物理的な位置(ソリッドステートディスクではなく回転するメディア)がよりランダムに分散されています。このランダムな分布のマイナスの結果は、ファイルシステムの速度が遅くなることです(たとえば、新しいファイルシステムの4倍遅い)。
このパフォーマンス低下の影響を受けず、回転メディアで安定したパフォーマンスプロファイルを維持できるLinuxファイルシステム(またはファイルシステムメンテナンスの方法)はありますか?ファイルシステムはFuseで実行できますが、信頼できる必要があります。
小さなベンチマーク( source )を書いて、何十万もの小さなファイルでどのファイルシステムが最もよく機能するかを調べました。
すべてのファイルを削除
すべてのステップの後にキャッシュを同期およびドロップする
結果(秒単位の平均時間、短い=良い):
Using Linux Kernel version 3.1.7
Btrfs:
create: 53 s
rewrite: 6 s
read sq: 4 s
read rn: 312 s
delete: 373 s
ext4:
create: 46 s
rewrite: 18 s
read sq: 29 s
read rn: 272 s
delete: 12 s
ReiserFS:
create: 62 s
rewrite: 321 s
read sq: 6 s
read rn: 246 s
delete: 41 s
XFS:
create: 68 s
rewrite: 430 s
read sq: 37 s
read rn: 367 s
delete: 36 s
結果:
Ext4の全体的なパフォーマンスは良好でしたが、ReiserFSはシーケンシャルファイルの読み取りが非常に高速でした。 XFSは多くの小さなファイルで低速であることが判明しました-この使用例では使用しないでください
ファイルシステムがドライブにファイルを配布するのを防ぐ唯一の方法は、パーティションを本当に必要なだけ大きくすることですが、ファイル内の断片化を防ぐためにパーティションを小さくしすぎないように注意してください。 [〜#〜] lvm [〜#〜] を使用すると非常に役立ちます。
Arch Wikiには、ファイルシステムのパフォーマンスに関する優れた記事がいくつかあります。
https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types
https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices
私はこのタスクにReiserFSを使用しています。これは、多くの小さなファイルを処理するために特に作られています。 funtoo wikiには簡単に それについてのテキストを読む があります。
ReiserFSには、特に小さなファイルのパフォーマンスを向上させることを目的とした多数の機能もあります。 ext2とは異なり、ReiserFSは固定の1 kまたは4 kブロックにストレージスペースを割り当てません。代わりに、必要な正確なサイズを割り当てることができます。
Ext4のパフォーマンスは、ディレクトリ内のファイルが100万から200万個になると低下します。このページを参照 http://genomewiki.ucsc.edu/index.php/File_system_performance UCSCでHiram Clawsonによって作成
XFSは、このような状況で非常によく機能することで知られています。これは、メールストア(1つのディレクトリに数十万のファイルを格納できる)の仕事で使用する理由の一部です。 ReiserFSよりもフォールトトレランスが優れており、幅広く使用されており、一般に非常に成熟したファイルシステムです。
さらに、XFSはオンラインでの最適化をサポートしています。ただし、遅延割り当て技術を使用しているため、そもそも断片化(他のファイルシステムと比べて)が少なくなっています。