如何 vmtouch 目录(而不是它包含的文件)?

如何 vmtouch 目录(而不是它包含的文件)?

虚拟触摸(8)工具允许锁定内存中的一个或多个文件。它具有递归模式,但目录仅用于发现文件并且不会自行锁定。

如何锁定内存中的目录,以便 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暂时关注一下,如果文件系统具有该dir_index功能,您可以 chattr +I dir在目录上将目录标记为 htree 索引(如果设置了文件系统功能,非常小的目录也会使用该缓存)

相关内容