これ仮想タッチ(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)stat
getdents
-l
ls
lstat
getdents
.iterate_shared
それ自体は、与えられたファイルシステムが&ポインタのディレクトリファイル構造を操作するために提供するすべてのもののラッパーです。.iterate
この場合はext4
終了しますext4_readdir
。
一部のファイルシステムはこの層でキャッシュを実装していますが(NFSは非常に明確な例です)、他のファイルシステムはまだディスクにアクセスできます。
元の問題の原因については、特定のディレクトリgetdents
で繰り返し実行されるいくつかのデーモンを作成できますが、そのディレクトリエントリをカーネルキャッシュに固定する方法はありません。そうしないと、カーネルは別のキャッシュスレッドからデータを完全に無視できます(ファイルシステムによって異なります)。
ext4
簡単に言えば、ファイルシステムに対応する機能がある場合は、ディレクトリをディレクトリにインデックス付けされたhtreeとして表示dir_index
できます(ファイルシステム機能が設定されている場合、非常に小さいディレクトリもそのキャッシュを使用します)。chattr +I dir