これによると 紙 FacebookのHaystackで:
"NASアプライアンスがディレクトリメタデータを管理する方法のため、ディレクトリのブロックマップが大きすぎて効果的にキャッシュできないため、ディレクトリに数千のファイルを配置することは非常に非効率的でしたその結果、1つのイメージを取得するために10を超えるディスク操作が発生するのが一般的でした。ディレクトリサイズをディレクトリあたり数百のイメージに縮小した後でも、結果のシステムは通常、イメージをフェッチするために3つのディスク操作を実行します。ディレクトリメタデータをメモリに、2番目にinodeをメモリにロードし、3番目にファイルの内容を読み取ります。 "
ファイルシステムディレクトリのメタデータとiノードは常にOSによってRAMにキャッシュされ、ファイルの読み取りには通常1つのディスクIOが必要であると想定していました。
その論文で概説されているこの「複数のディスクIOが単一のファイルを読み取る」問題はNASアプライアンスに固有のものですか、それともLinuxにも同じ問題がありますか?
画像を提供するためにLinuxサーバーを実行することを計画しています。いずれにせよ、ディスクの数を最小限に抑えることができますIO-理想的には、OSがすべてのディレクトリとiノードデータをRAMにキャッシュし、各ファイルの読み取りに必要なのはディスクIOは1つだけですか?
これは、使用されているファイルシステムによって異なります。一部のファイルシステムは、他のファイルシステムよりも大規模ディレクトリの問題に優れており、はい、キャッシュは使用法に影響を与えます。
古いバージョンのEXT3には、何千ものファイルが含まれるディレクトリの処理に非常に悪い問題がありました。これは、dir_indexesが導入されたときに修正されました。 dir_indexを使用しない場合、数千のファイルがあるディレクトリからファイルを取得すると、非常にコストがかかる可能性があります。詳細を知らなくても、それが記事のNASデバイスが使用していたものだと思います。
最新のファイルシステム(最新のext3、ext4、xfs)は、大規模なディレクトリの問題を昔よりもはるかにうまく処理します。一部のiノードは大きくなる可能性がありますが、ディレクトリのインデックス作成に一般的に使用されているBツリーは、非常に高速なfopen
回になります。
ファイルシステムディレクトリのメタデータとiノードは常にRAMにキャッシュされると思っていました
はい、しかしあなたは正しく読むことを学びませんでした。あなた自身が引用した段落では、それは明確に述べています:
NASアプライアンスがディレクトリメタデータを管理する方法のため、ディレクトリのブロックマップが大きすぎてアプライアンスで効果的にキャッシュできないため、ディレクトリに数千のファイルを配置することは非常に非効率的でした。
アプライアンスはローエンドのハードウェアです。メタデータが多すぎる+少なすぎるRAM=キャッシュする方法がありません。
大規模なファイルサーバーを実行している場合は、ローエンドのアプライアンスではなく、ファイルサーバーを入手してください。
ファイルとディレクトリへのアクセス時間を更新せずに生きることができる場合、「noatime」オプションを使用してファイルシステムをマウントすると、多くのI/O要求を節約できます。
それは注意深い測定についてです。あなたが主な目的が画像を提供することであるならば、あなたのネットワークトラフィックはそれらによって支配されると思います。さらに、キャッシュを行わない場合、ディスクレートはネットワークレートに近いはずです。最後に、完全なキャッシュを実行している場合、ネットワークレートは同じままで、ディスクレートは0になります。
言い換えれば、それをすべて測定してください!世界最大のクラスターのいくつかのユーザーの多くがそうであるように、私はこれのためだけにcollectlを使用します。
ダウンロード/インストールして起動するだけです。それはあなたが再生したりプロットしたりすることができるたくさんのものを記録します。次に、数値を見て、キャッシュがどの程度効率的に機能しているかを把握します。
-マーク
これは、Linuxではデフォルトで実行されます。十分な量のRAMがある場合は、適切なキャッシュが得られます。