这虚拟触摸(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)stat
getdents
-l
ls
lstat
getdents
其本身只是给定文件系统为目录文件结构操作上的.iterate_shared
&指针提供的任何内容的包装。.iterate
在这种情况下ext4
,这会结束ext4_readdir
。
一些文件系统确实在该层实现了缓存(NFS 是一个非常明显的例子),但其他文件系统可能仍然会访问磁盘。
对于原始问题的根源,您可以编写一些守护进程,getdents
在给定的目录上重复运行,但是没有办法将这些目录项固定在内核缓存中,否则内核可能完全忽略来自单独的缓存线程(取决于文件系统)。
ext4
暂时关注一下,如果文件系统具有该dir_index
功能,您可以 chattr +I dir
在目录上将目录标记为 htree 索引(如果设置了文件系统功能,非常小的目录也会使用该缓存)