Como eu vto um diretório (não os arquivos que ele contém)?

6

A ferramenta vmtouch (8) permite bloquear um arquivo ou arquivos na memória. Ele tem modo recursivo, mas os diretórios são usados apenas para descobrir arquivos e não estão bloqueados.

Como faço para bloquear um diretório na memória, para que o readdir seja sempre rápido até que eu o desbloqueie?

    
por Vi. 10.07.2015 / 23:35

1 resposta

1

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)

    
por 07.08.2017 / 19:24