ディレクトリをvmtouchする方法(含まれるファイルは除く)

ディレクトリをvmtouchする方法(含まれるファイルは除く)

これ仮想タッチ(8)ツールを使用すると、メモリ内の1つ以上のファイルをロックできます。再帰モードがありますが、ディレクトリはファイルの検索にのみ使用され、それ自体はロックされません。

ロックを解除するまでreaddirが常に高速に保たれるように、メモリ内のディレクトリをロックする方法は?

答え1

vmtouchこの問題に対する解決策はまったくありません。実行するように指示したファイルに対して&タスクをvmtouch実行します。open(2)mmap(2)

カーネルキャッシュを許可しても、readdir(2)まだ線形操作です。それでも多くの場合、ディスクに影響を与えます。:

現在のVFS readdir操作では、ディレクトリ全体がキャッシュ内にあっても常に低レベルのファイルシステムが呼び出されます。

(2017/08/07 18:40 UTCへのフォローアップ):

ls -l実行されている作業は、とにかくすでに役に立たないディレクトリのラッパーではありませんreaddir。オプションを使用すると、そのオプション内の各項目も表示されます。readdir(2)readdir(3)(f)statgetdents-llslstat

getdents.iterate_sharedそれ自体は、与えられたファイルシステムが&ポインタのディレクトリファイル構造を操作するために提供するすべてのもののラッパーです。.iterateこの場合はext4終了しますext4_readdir

一部のファイルシステムはこの層でキャッシュを実装していますが(NFSは非常に明確な例です)、他のファイルシステムはまだディスクにアクセスできます。

元の問題の原因については、特定のディレクトリgetdentsで繰り返し実行されるいくつかのデーモンを作成できますが、そのディレクトリエントリをカーネルキャッシュに固定する方法はありません。そうしないと、カーネルは別のキャッシュスレッドからデータを完全に無視できます(ファイルシステムによって異なります)。

ext4簡単に言えば、ファイルシステムに対応する機能がある場合は、ディレクトリをディレクトリにインデックス付けされたhtreeとして表示dir_indexできます(ファイルシステム機能が設定されている場合、非常に小さいディレクトリもそのキャッシュを使用します)。chattr +I dir

関連情報