/srv/data
私は、多数(20,000,000)の小さなファイル(4-40KB)を含むディレクトリ()を持っています。これらのファイルは、/srv/data
サブディレクトリ名とファイル名を関連付けてUUIDを形成するサブディレクトリにあります。たとえば、UUIDはパス833ac041-28c4-4ea4-9bac-81fe781732b4
にマップされます/srv/data/83/3a/c0/41-28c4-4ea4-9bac-81fe781732b4
。各サブディレクトリレベルに2つの16進数を使用すると、ファンアウトは255です。たとえば、には255のディレクトリがあり、各/srv/data
ディレクトリには最大255のサブディレクトリがあり、各ディレクトリには最大255のサブディレクトリがあります。
これらのファイルまたはこれらのファイルのサブセットのキャッシュ設定を提供するようにカーネルに指示できますか?
たとえば、「こんにちはLinux、できるだけ多くのファイルをキャッシュしてください/srv/data
。すべてのファイルをメモリに保存できない場合は、できるだけキャッシュし、このディレクトリ外のファイルについては心配しないでください。可能であればメモリにすべて入れてから、残りを自由に使用して、このディレクトリ外のファイルをキャッシュします。」
答え1
sysctl vm.vfs_cache_pressure=10
役に立つかもしれません。何千もの小さなファイル処理を高速化するには、ファイルの内容よりも多くのディレクトリエントリとinodeをキャッシュに保存します。最大のオーバーヘッドは、ハードドライブ上の小さなファイルを見つけることです。これは、正確な場所で数キロバイトを読むよりも多くの読み取り操作(より多くの時間)を必要とします。カーネルがキャッシュに保存されている物理的な場所を既に知っている場合、ファイル管理ははるかに高速になります。