Isso ocorre porque seu teste é falho. A execução de find .
simplesmente chama getdents () na árvore de diretórios. Um diretório, neste caso, é apenas um arquivo que contém entradas de diretório e, portanto, é armazenado no cache de páginas. Note que você não faz nada para realmente acessar os arquivos que você está tentando armazenar em cache desta maneira.
Seu teste é basicamente o armazenamento em cache de todos os diretórios na árvore do sistema de arquivos e nada mais.
Teste seu teste, o que dá find
uma tarefa mais difícil. Por exemplo, forçando-o a chamar lstat
para cada arquivo e você verá um comportamento diferente.
No meu teste, há um milhão de arquivos nesse diretório.
[root@home test]# echo 3 >/proc/sys/vm/drop_caches
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null
real 0m16.443s
user 0m2.123s
sys 0m9.320s
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null
real 0m2.704s
user 0m1.224s
sys 0m1.479s
[root@home test]# echo 1 >/proc/sys/vm/drop_caches
[root@home test]# time find ./tmp -printf "%p %c\n" >/dev/null
real 0m3.791s
user 0m1.359s
sys 0m1.756s
Note que no último teste leva um pouco mais de tempo, imagino que isso esteja diretamente relacionado a toda a leitura do diretório 'file' em si, e não porque o cache de dentry e inode não existe.