LinuxCentOSサーバーにEXT3フォーマットのドライブがあります。これはWebアプリのデータドライブであり、すべてのユーザーアカウントのディレクトリが含まれています(25,000人のユーザーがいます)。各フォルダには、そのユーザーがアップロードしたファイルが含まれています。全体として、このドライブには約250GBのデータがあります。
これらすべてのディレクトリでドライブを構成すると、ドライブの読み取り/書き込みパフォーマンスに影響しますか?それは私が気付いていない他のパフォーマンスの側面に影響を与えますか?
このように構造化することで本質的に悪いことや悪いことはありますか?おそらく、ファイルシステムの選択が間違っているだけでしょうか。
最近、2つのデータドライブをマージしようとしましたが、EXT3が32,000のサブディレクトリに制限されていることに気付きました。これは、なぜだろうと思いました。各ファイルに対応する一意のIDがあることを考えると、この方法で構築したのはばかげているようです。データベース内のID。ああ...
これは、オプションを自分でテストするのは簡単です。環境内そして結果を比較します。はい、ディレクトリの数が増えると、パフォーマンスに悪影響があります。はい、他のファイルシステムは、これらの障壁を回避したり、影響を軽減したりするのに役立ちます。
XFSファイルシステム は、このタイプのディレクトリ構造に適しています。 ext4は、おそらく最近は問題ありません。サブディレクトリとファイルの数が増えると、ディレクトリへのアクセスと操作が単純に遅くなります。これはvery ext3で発音され、XFSではそれほど発音されません。
答えは、ファイルシステムの選択ほど単純ではありません。正気のファイルシステムはずっと前にディレクトリの線形リストの使用をやめました。つまり、ディレクトリ内のエントリの数はファイルアクセス時間に影響しません。
そうする場合を除いて。
実際、エントリの数に関係なく、各操作は高速で効率的ですが、一部のタスクでは操作の数が増えています。明らかに、単純なls
を実行するには長い時間がかかり、すべてのiノードが読み取られてソートされるまで何も表示されません。 ls -U
(未分類)は、死んでいないことがわかるので少し役立ちますが、知覚的には時間を短縮しません。あまり明白ではありませんが、ワイルドカード展開ではすべてのファイル名をチェックする必要があり、ほとんどの場合、iノード全体も読み取る必要があるようです。
つまり、アプリケーション(シェルアクセスを含む)がワイルドを使用しないことを確実に確信できる場合は、後悔することなく巨大なディレクトリを取得できます。ただし、コードにワイルドカードが潜んでいる可能性がある場合は、ディレクトリをそれぞれ1,000エントリ未満に保つことをお勧めします。
編集:
最新のファイルシステムはすべて、大きなディレクトリに適切なデータ構造を使用しているため、特定のファイルのiノードを見つける必要がある単一の操作は、巨大なディレクトリでも非常に高速です。
ただし、ほとんどのアプリケーションは単一の操作だけを実行するわけではありません。それらのほとんどは、完全なディレクトリまたはワイルドカードマッチングのいずれかを実行します。それらはすべてのエントリを読み取る必要があるため、何があっても低速です。
例:「foo-000000.txt」から「foo-999999.txt」までの100万個のファイルと1つの「natalieportman.jpeg」を含むディレクトリがあるとします。これらは高速になります:
ls -l foo-123456.txt
open "foo-123456.txt"
delete "foo-123456.txt"
create "bar-000000.txt"
open "natalieportman.jpeg"
create "big_report.pdf"
これらは失敗しますが、すぐに失敗します。
ls -l bar-654321.txt
open bar-654321.txt
delete bar-654321.txt
結果がほとんど返らない場合でも、これらは遅くなります。失敗したものでも、すべてのエントリをスキャンした後に失敗します。
ls
ls foo-1234*.txt
delete *.jpeg
move natalie* /home/emptydir/
move *.tiff /home/seriousphotos/
まず、ext3パーティションにdir_index
フラグが設定されていることを確認します。
Sudo dumpe2fs /dev/sdaX |grep --color dir_index
欠落している場合は、有効にすることができます。ファイルシステムをアンマウントしてから、以下を実行する必要があります。
Sudo tune2fs -O dir_index /dev/sdaX
Sudo e2fsck -Df /dev/sdaX
次に、ファイルシステムをマウントします。
私は最近、数千万のファイルと数十万のディレクトリを作成する必要のあるストレージサーバーを開発しました。 XFSをext4およびreiserfsと比較しました。私の場合、ext4はXFSよりもわずかに高速であることがわかりました。ライザーは面白かったのですが、制限があったので削除されました。また、ext4はext3よりも大幅に高速であることがわかりました。
ディレクトリごとに大量のファイルを取得すると、ファイルのオープン時間が長くなり始めます。ファイルI/Oはそうではありません。ファイルの削除時間も低下します。ただし、ext4ではそれほど遅くはありません。ただし、ext3ではかなり目立ちます。 XFSとext4はこれに関して非常に高速です。
最後にXFSを調べて、ext4よりもXFSを使用することの長所と短所を比較検討していたとき、XFSでのデータ損失の報告を見つけました。これがまだ問題であるかどうかはわかりませんが、それが問題であったかどうかはわかりませんが、それは私を十分に緊張させて明確に操縦しました。 ext4はUbuntuのデフォルトのfsであるため、XFSよりも簡単に勝ちました。
したがって、管理の観点から役立つtylerlの提案に加えて、ext4にアップグレードできることをお勧めします。ディレクトリごとの制限は、ext4で64000エントリです
もう1つの利点は、fsck時間が大幅に短縮されることです。破損の問題は一度もありません。
Ext4の良いところは、ext3ボリュームをext4にマウントして試すことができることです。参照: ライブシステムをext3からext4ファイルシステムに移行する
そのリンクからの引用:
Ext3の制限の影響を受けず、リスクを冒そうとしないのであれば、それだけの価値はないかもしれません。一方、移行手順が正常に完了すると、システムの実行速度が向上し、ファイルシステムのチェックが短縮され、悪影響を与えることなく信頼性が向上する可能性があります。
だから、先に進んでそれを試してみてください。最初にバックアップすることをお勧めします。
ディレクトリ制限ごとにext332,000の名前に達するまで、違いはありません。 ext4にアップグレードすると、ext4のその他の利点と同様に、それを回避できます。
単一のディレクトリ内にあるエントリ(ファイルとディレクトリ)が多いほど、アクセスが遅くなります。これはすべてのファイルシステムに当てはまりますが、他のファイルシステムよりも悪いものもあります。
より良い解決策は、次のようなディレクトリ階層を作成することです。
/users/a/aaron/
/users/a/andrew/
/users/b/betty/
/users/b/brian/
さらに優れたパフォーマンスが必要な場合は、複数のレベルを拡張できます。
/users/a/a/aaron
/users/a/n/anna
/users/a/n/andrew
ほとんどのメールシステムは、メールキューファイルでこのトリックを使用します。
また、一部のファイルシステムでは、過去にディレクトリに多数のエントリがあっただけで、そのディレクトリへのアクセスが遅くなることがわかりました。 ls -ld
ディレクトリ上で、ディレクトリエントリ自体のサイズを確認します。数MB以上で、ディレクトリが比較的空の場合は、パフォーマンスが低下している可能性があります。邪魔にならないようにディレクトリの名前を変更し、同じ名前、アクセス許可、所有権を持つ新しいディレクトリを作成してから、古いディレクトリの内容を新しいディレクトリに移動します。私はこのトリックを何度も使用して、ファイルシステムによって速度が低下したメールサーバーを大幅に高速化しました。
これを行うと、間違いなくいくつかの結果が生じるでしょう。主なものはIO読み取り/書き込みです。それを超えて、それはそのタイプのデータを(その規模で)処理する非常に恐ろしい方法です。
過去に、私はXFSを使用してExt3の限界を回避して成功しました。
ファイルシステムの内容の最初のリストは、システムがすべてのディレクトリ/ファイル情報を読み取るまでしばらく時間がかかります。カーネルに情報がキャッシュされるようになったため、補足操作が高速になります。
管理者が定期的にcronで「find/somepath 2>&1>/dev/null」を実行してキャッシュをアクティブに保ち、パフォーマンスを向上させているのを見てきました。
私はいくつかの質問といくつかの考えられるボトルネックの発見があります。
まず、これはCentOS 5または6システムですか? 6には、この種の状況での影響を測定するのに理想的なblktraceと呼ばれる素晴らしいツールがあるためです。
https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s03.html
次に、bttを使用して出力を解析し、ボトルネックがどこにあるか、アプリケーション、ファイルシステム、スケジューラー、ストレージを取得できます。どのコンポーネントでIOがほとんどの時間を費やしています。
さて、理論的にはあなたの質問になりますが、それは明らかにiノードの数を増やし、ディレクトリ内の新しいまたは既存のファイルまたはディレクトリを作成またはアクセスし続けると、アクセス時間が長くなります。カーネルはより広大なファイルシステム階層をトラバースする必要があるため、間違いなくオーバーヘッドになります。
注意すべきもう1つのポイントは、ディレクトリの数を増やすと、iノードとdentryのキャッシュ使用量が増加し、RAMの消費量が増えることです。これはスラブメモリの下にあるため、サーバーのメモリが不足している場合は、別の考え方になります。
実際の例について言えば、最近、高度にネストされたext3 fsで、サブディレクトリを初めて作成するのに約20秒かかるのに対し、ext4では約4秒かかることがわかりました。これは、ブロック割り当てがさまざまなファイルシステムでどのように構成されているかによるものです。 XFSまたはext4を使用する場合、パフォーマンスがいくらか向上することは言うまでもありませんが、最小限であってもかまいません。
したがって、ファイルシステムの正しい選択を求めているだけの場合、ext3は少し時代遅れです。それ以上のデータとベンチマークなしで私が提供できるのはそれだけです。
これはCentOS5のオプションではなく、CentOS 6のオプションの量もわかりませんが、BツリーまたはB *ツリーベースのソリューション、つまりBTRFSは、特定のパフォーマンスが大幅に向上するとは言わないまでも、一貫性を提供すると直感しています。シナリオ、明確な良心を持って自分の貴重なデータを1人だけに任せることができれば(私はまだそうしません)。
しかし、余裕があれば、それをテストすることができます。