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 maior parte da RAM para armazenamento em 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é que eu realmente abra um arquivo.

Aqui estão os detalhes:

Eu tenho um servidor de arquivos caseiro. Ele tem 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 arquivos, a maior parte da RAM é usada para armazenamento em cache. ("Livre" relata 3.4G de 3.9G usado para cache.)

O servidor mora no meu quarto, e se todos os discos estão girando, faz barulho suficiente para ser chato quando está quieto. (Não me refiro a procurar ruído, apenas a girar ruído. 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.) Então eu configurei o servidor para girar os discos a maior parte do tempo.

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

Eu suspeito que o Linux preencha seu cache com conteúdo de arquivo, e possivelmente com dados pré-buscados. O cache não é muito útil além de alguns MB para garantir uma reprodução suave. se eu 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 4GB deve ser suficiente 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 eles estão dormindo.

Ainda haverá um atraso ao abrir o arquivo, mas tudo bem. Compare “clique; espera ; clique; espera ; clique; espera ; Toque; assista ”com“ clique; clique; clique; Toque; espera ; ver". O primeiro é incrivelmente frustrante; o último é quase esperado.

Notas:

  1. Se isso importa, o kernel é 3.2, o SO é Debian, o volume é lvm2 e o FS é ext4.

  2. A única razão para o spin down é o ruído durante a noite; o servidor está sendo executado continuamente. (Eu fiz isso tão baixo quanto razoável.) O atraso de spin-down é variado dependendo da hora do dia.

  3. Os discos rígidos são apenas para mídia. O sistema operacional está em uma unidade flash separada (pequena). (O que significa que qualquer atraso no desenvolvimento vem dos dados, não apenas porque precisava de algo em /usr ou qualquer outra coisa. Eu poderia poupar alguns GB se isso ajudasse no meu problema de alguma forma.

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

por bogdanb 23.05.2013 / 00:06

1 resposta

10

Para controlar como o Linux armazena as coisas, consulte este link

Em particular, olhe para vfs_cache_pressure, você provavelmente quer um valor realmente baixo ou talvez até zero (1 soa 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 swappiness para nunca trocar dados ou fazer com que isso aconteça apenas em casos extremos.

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

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

Para aplicá-las, eu colocaria as configurações que você deseja alterar em /etc/sysctl.conf ou qualquer que seja seu sistema operacional para restaurá-las na inicialização.

    
por 23.05.2013 / 02:04