Vi.*_*Vi. 7 linux directory virtual-memory
该vmtouch(8)工具允许在内存中锁定一个或多个文件。它具有递归模式,但目录仅用于发现文件,并不会自行锁定。
如何锁定内存中的目录,以便 readdir 始终快速,直到我解锁它?
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 索引(如果设置了文件系统功能,非常小的目录也会使用该缓存)
| 归档时间: |
|
| 查看次数: |
996 次 |
| 最近记录: |