Parece que a primeira vez que corro find
ou ls
em um diretório leva um tempo para trabalhar. Porém, a cada vez que passa, é rápido, como se uma lista do conteúdo do diretório tivesse sido armazenada em cache ou indexada em algum lugar.
Existe uma maneira de preservar esse cache nas reinicializações do computador?
Respostas:
Você pode usar o vmtouch para adicionar arquivos ao cache da página (cache do disco).
Coloque
nohup vmtouch -dl <files or directories> &
seu/etc/rc.local
arquivo para adicionar e bloquear arquivos no cache da página durante a inicialização. Se você deseja adicionar arquivos ao cache da página, mas não deseja bloqueá-los na memória, use o-t
sinalizador em vez dos-ld
sinalizadores.Para obter mais informações sobre o cache da página, consulte aqui , aqui e na wikipedia .
fonte
build-essential
pacote. Downloadvmtouch.c
. Executegcc -O2 -o vmtouch vmtouch.c
ormake vmtouch
e você obtém o bináriovmtouch
que você pode copiar, por exemplo,/usr/local/bin
ou chamar./vmotouch
.vmtouch
como um comando de inicialização retardar o trabalho inteiro? Minha esperança era preservar um cache através das botas em vez de (caro) regenerá-lo a cada vez."Preservar através de reinicializações", duvido. Mas você pode reconstruir trivialmente o cache na inicialização, o que realiza quase a mesma coisa menos um pequeno atraso.
Crie um arquivo
/etc/cron.d/rebuild-fs-cache
e coloque o seguinte:Isso usa
nice
eionice
(que deve ser instalado por padrão e definitivamente estar disponível através do gerenciador de pacotes; o Debian os colocacoreutils
eutil-linux
, respectivamente) para diminuir a prioridade dofind
processo aos níveis mais agradáveis possíveis, o que significa que não deve interferir em mais nada em execução no sistema, mas levará um pouco mais de tempo para concluir.find
ele mesmo passará estat()
tudo, o que força o kernel a carregar os dados do sistema de arquivos do disco na memória.Depois que o cache for construído, desde que não seja eliminado porque o sistema operacional precisa da memória para outra coisa, ele deve ser mantido. Eu tenho usado isso por um tempo e as listagens de diretório, mesmo em diretórios grandes, são significativamente mais rápidas do que sem o trabalho cron acima, embora eu não possa citar nenhum número exato.
fonte
locate
, que vem comupdatedb
atualizar um banco de dados localizar: en.wikipedia.org/wiki/Locate_(Unix)locate
nada, mas usols
muito. E ocasionalmentefind
. (Além disso, find e ls são os comandos específicos sobre os quais o OP pergunta.) O objetivo de usarfind
aqui é que ele itera sobre tudo no armazenamento chamando stat (), para que o kernel precise carregar os metadados na memória. Uma vez lá, é tão bom como se estivesse armazenado em uma reinicialização.