Encontrar / ls cache

10

Parece que a primeira vez que corro findou lsem 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?

Richard
fonte
1
É de fato armazenado em cache. O Linux usa memória não utilizada como cache e buffers (esse é um motivo para você sempre ter alguma troca, mesmo com RAM "suficiente"). O comando livre mostra quanto está disponível. Não sei se há muito sentido em fazer cache entre as reinicializações, muito pode mudar entre as inicializações. Que tal fazer um cron-job ser executado com a menor prioridade a cada 10,30 minutos, para simplesmente passar por todos os seus arquivos? Deve manter o cache relativamente atualizado o tempo todo. Também pense que existe uma maneira (para o kernel) de detectar alterações no arquivo.
Baard Kopperud

Respostas:

8

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.localarquivo 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 -tsinalizador em vez dos -ldsinalizadores.

Para obter mais informações sobre o cache da página, consulte aqui , aqui e na wikipedia .

Comunidade
fonte
Esse comando não parece disponível no Ubuntu - existe uma alternativa que eu possa tentar?
Richard
@ Richard É muito fácil compilar o vmtouch: instale o build-essentialpacote. Download vmtouch.c. Execute gcc -O2 -o vmtouch vmtouch.cor make vmtouche você obtém o binário vmtouchque você pode copiar, por exemplo, /usr/local/binou chamar ./vmotouch.
Jofel
@ Richard Eu não uso o Ubuntu, então não testei isso e não me responsabilizo, mas pesquisando no Google Ubuntu mvtouch trouxe esse ppa .
terdon
@ jofel, sim, foi fácil o suficiente para compilar - obrigado. Eu apenas prefiro usar pacotes quando possível.
Richard
@Evan, corrija-me se estiver errado, mas não usaria vmtouchcomo 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.
Richard
2

"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-cachee coloque o seguinte:

@reboot root /usr/bin/nice -n 19 /usr/bin/ionice -c 3 -t /usr/bin/find / >/dev/null 2>&1

Isso usa nicee ionice(que deve ser instalado por padrão e definitivamente estar disponível através do gerenciador de pacotes; o Debian os coloca coreutilse util-linux, respectivamente) para diminuir a prioridade do findprocesso 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. findele mesmo passará e stat()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.

um CVn
fonte
1
Se você estiver indo para reinventar a roda, assim como você pode usar locate, que vem com updatedbatualizar um banco de dados localizar: en.wikipedia.org/wiki/Locate_(Unix)
laebshade
@laebshade Eu não uso locatenada, mas uso lsmuito. E ocasionalmente find. (Além disso, find e ls são os comandos específicos sobre os quais o OP pergunta.) O objetivo de usar findaqui é 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.
um CVn