Como configurar o Linux para armazenar em cache os metadados do arquivo em preferência ao conteúdo?

14

Eu gostaria de configurar o sistema para usar a maioria da RAM para o cache de metadados do sistema de arquivos, mas apenas uma quantidade razoavelmente pequena para arquivos de cache de leitura / gravação e pré-busca. Idealmente, eu gostaria de poder navegar no sistema de arquivos (tanto quanto ele se encaixa na RAM) sem girar os discos até abrir um arquivo.

Aqui estão os detalhes:

Eu tenho um servidor de arquivos caseiro. Possui cinco discos em um volume LVM em torno de 9 TB, mas apenas 4 GB de RAM. Como o servidor não faz muito mais do que servir os arquivos, a maior parte da RAM é usada para armazenamento em cache. ("Gratuito" relata 3,4G de 3,9G usados ​​para cache.)

O servidor mora no meu quarto e, se todos os discos estiverem girando, haverá ruído suficiente para ser irritante quando estiver silencioso. (Não estou falando de procurar ruído, apenas girar. Os discos são de várias marcas e modelos, e acho que pequenas diferenças nas velocidades de rotação causam interferência. Nenhum disco é barulhento por si só, mas se alguns deles estão girando juntos, há um ligeiro ruído com um período sub-Hertz.) Por isso, configurei o servidor para reduzir os discos na maior parte do tempo.

Obviamente, se os discos forem girados para baixo quando eu abrir uma pasta no meu gerenciador de arquivos, haverá um atraso enquanto o disco que tiver essa pasta girar. Só isso não é grande coisa. Mas, dependendo de onde eu olho, isso pode acontecer várias vezes seguidas, se o LVM espalhar os metadados de cada subpasta nos diferentes discos.

Eu suspeito que o Linux preencha principalmente o cache com o conteúdo do arquivo e, possivelmente, com os dados pré-buscados. O cache não é muito útil além de alguns MB para garantir uma reprodução suave; se eu apenas assisti a um filme, provavelmente não voltarei a vê-lo tão cedo. A pré-busca, se acontecer, também é completamente inútil no meu caso , depois de mais de alguns MB.

Mas alguém poderia pensar que 4 GB devem ser suficientes para armazenar em cache a maioria dos metadados do sistema de arquivos, pelo menos as partes que já foram visitadas, para que eu possa navegar pelos arquivos sem precisar girar os discos, se forem dormindo.

Ainda haveria um atraso ao abrir o arquivo, mas tudo bem. Compare “clique; espera ; clique; espera ; clique; espera ; jogar; assistir "com" clique; clique; clique; jogar; espera ; Assistir". O primeiro é incrivelmente frustrante; o último é quase esperado.

Notas:

  1. Caso isso importe, o kernel é 3.2, o sistema operacional é o Debian, o volume é lvm2 e o FS é ext4.

  2. A única razão para a queda é o barulho durante a noite; caso contrário, o servidor está executando continuamente. (Eu consegui a energia mais baixa possível.) O atraso da rotação varia de acordo com a hora do dia.

  3. Os discos rígidos são apenas para mídia. O sistema operacional está em uma unidade flash (pequena) separada. (O que significa que qualquer atraso de spin-up vem dos dados, não apenas porque eles precisam de algo /usrou o que seja. Eu poderia poupar alguns GB nele se isso ajudasse de alguma forma com o meu problema.

  4. Um impacto razoável no desempenho não é grande coisa. Os discos são mais rápidos que minha rede de qualquer maneira.

bogdanb
fonte

Respostas:

10

Para controlar como o Linux armazena em cache as coisas, consulte este https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Em particular, observe vfs_cache_pressure, você provavelmente deseja um valor realmente baixo ou talvez zero (1 parece um pouco mais seguro para mim):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Além disso, você pode querer modificar swappinesspara nunca trocar dados ou fazê-los para que isso ocorra apenas em casos extremos.

A drop_cachesopção pode ser útil para descartar explicitamente os dados que você não deseja mais que sejam armazenados em cache.

Tenho certeza de que provavelmente existem outras opções que podem ajudar, portanto revise a documentação do kernel.

Para aplicá-los, eu colocaria as configurações que você deseja alterar /etc/sysctl.confou o que seu sistema operacional tiver para restaurá-las na inicialização.

Kyle
fonte
3
Bom post, mas você gostaria de trocar o máximo possível, considerando o objetivo do OP. A troca apenas atinge a memória do usuário, aumentando a tendência de troca para o disco e deixando mais memória física para os caches. Aumentar swappiness libera memória, mas pode retardar aplicações se for aumentado muito longe (que determina o ponto doce é basicamente guestimation iterativo)
Bratchley
Olá Kyle, obrigado pela ideia. vfs_cache_pressure meio que funciona, mas não é o suficiente. Aqui está o que eu fiz:
bogdanb
Quando defino vcp como 0, se eu fizer a find / -ls > /dev/null, gire os discos e, em seguida, findtodos os arquivos novamente, os discos não girarão. freemostra buffers subindo para cerca de 202 MB ao fazer isso. Mas, se eu fizer o find, então cat /file/bigger/than/ram > /dev/null, os freeshows cachedaparecerão para preencher o espaço vazio e, por algum motivo buffers, cairão para cerca de 195MB. Então, se eu spin down dos discos e fazer as findnovamente os discos ainda girar :-(
bogdanb
Sobre swappiness: está definido como padrão 60, mas a máquina não possui nenhuma partição de troca, portanto, não tenho certeza se faz muito. Acho que poderia colocar um arquivo de troca na unidade flash, mas não tenho idéia de como isso ajudaria ou como dimensioná-lo.
Bogdanb
1
O Linux está tentando ser esperto em relação ao cache. Não tenho certeza de que a configuração de vfs = 0 funcione da maneira que você espera. Eu acho que tentaria recuperar essas outras entradas quando a pressão dos aplicativos (ou seja, malloc ()) solicitar mais memória. Quanto a uma maneira de dizer ao linux para não usar mais de 2 GB para caches, não conheço isso. Seria desperdiçar RAM na maioria dos casos. Outra coisa que você pode querer considerar é o "modo laptop", que tenta fazer as coisas de maneira diferente para manter os discos girados para laptops. Eu ainda não o usei, então não sei muito sobre isso.
26613 Kyle