vmtouch
definitivamente NÃO irá gerenciar isso. vmtouch
faz open(2)
& mmap(2)
nos arquivos que você instrui.
Mesmo que você obtenha o kernel para armazenar em cache readdir(2)
, ainda é uma operação linear e ainda atinge o disco em muitos casos :
In the current VFS readdir operation, the low-level file system is always called, even if the entire directory is in cache.
(2017/08/07 18:40 UTC followup):
ls -l
faz muito mais do que apenas readdir
. readdir(2)
está obsoleto mesmo assim, readdir(3)
é um wrapper para (f)stat
no diretório & getdents
no diretório. A opção -l
de ls
também causa um lstat
em cada entrada.
getdents
em si é apenas um wrapper para qualquer sistema de arquivos fornecido para o .iterate_shared
& .iterate
ponteiros nas operações da estrutura do arquivo de diretório. No caso de ext4
, isso acaba em ext4_readdir
.
Alguns sistemas de arquivos implementam o cache nessa camada (o NFS é um exemplo muito claro), mas outros podem atingir o disco ainda.
Para a raiz da sua pergunta original, você poderia escrever algum daemon que repetidamente continua executando getdents
em um determinado diretório, mas não há como fixar esses itens no cache do kernel, e é possível que o kernel seja completamente ignora esse cache de um thread separado (depende do sistema de arquivos).
Focando em ext4
por um momento, se o sistema de arquivos tiver o recurso dir_index
, você pode fazer chattr +I dir
em um diretório para marcar um diretório como sendo indexado pela htree (diretórios muito pequenos usam esse cache também o recurso do sistema de arquivos está definido)