Armazenamento em cache / pré-carregamento de arquivos no Linux na RAM

74

Eu tenho um servidor bastante antigo que possui 4 GB de RAM e está praticamente servindo os mesmos arquivos o dia todo, mas o faz a partir do disco rígido, enquanto 3 GB de RAM são "gratuitos".

Qualquer pessoa que já tenha tentado rodar um drive ram pode testemunhar que é impressionante em termos de velocidade. O uso de memória desse sistema geralmente nunca é superior a 1 GB / 4 GB, então quero saber se existe uma maneira de usar essa memória extra para algo bom.

  • É possível dizer ao sistema de arquivos para sempre servir determinados arquivos fora da RAM?
  • Existem outros métodos que eu possa usar para melhorar os recursos de leitura de arquivos usando a RAM?

Mais especificamente, não estou procurando um 'hack' aqui. Quero que as chamadas do sistema de arquivos sirvam os arquivos da RAM sem a necessidade de criar uma unidade ram e copiar os arquivos manualmente. Ou pelo menos um script que faça isso por mim.

As aplicações possíveis aqui são:

  • Servidores da Web com arquivos estáticos que são lidos muito
  • Servidores de aplicativos com grandes bibliotecas
  • Computadores de mesa com muita RAM

Alguma ideia?

Editar:

  • Achei isso muito informativo: O cache de páginas do Linux e o pdflush
  • Como Zan apontou, a memória não é realmente livre. O que quero dizer é que ele não está sendo usado por aplicativos e quero controlar o que deve ser armazenado em cache na memória.
Andrioide
fonte
11
Eu também estou procurando algo nesse sentido. Eu não acho que o cache geral do bloco de disco do sistema de arquivos seja a resposta. Suponha que eu queira que o bloco de disco X seja sempre armazenado em cache. Algo acessa e o kernel armazena em cache. Até aí tudo bem, mas o próximo processo quer o bloco Y, então o kernel descarta meu bloco X e armazena em cache Y. O próximo processo que deseja o X terá que esperar que ele saia do disco; é isso que eu quero evitar. O que eu gostaria (e que eu acho que o poster original é depois também) é a sobreposição de um cache write-through para um sistema de arquivos que irá garantir que os arquivos são sempre
11
Dado que o consenso parece ser que o Linux já deveria estar armazenando em cache arquivos usados ​​com freqüência para você, pergunto-me se você realmente conseguiu fazer alguma melhoria usando os conselhos encontrados aqui. Parece-me que tentar controlar manualmente o cache pode ser útil para aquecer o cache, mas que, com o padrão de uso que você descreve ("servindo os mesmos arquivos o dia todo"), não ajudaria um servidor já aquecido muito, se for o caso.
Nate CK
Você diz que não está procurando um hack, mas o Linux já faz o que você quer fazer por padrão. A seguinte equação: "servindo os mesmos arquivos o dia todo" + "diz ao sistema de arquivos para sempre servir determinados arquivos fora da RAM" é igual a "Hack" por definição. Você notou alguma melhoria no desempenho? Pela minha experiência, o cache do Linux é o bejeezus do seu sistema de arquivos.
Mike S
2
Para esclarecimento, o linux faz cache de arquivos, mas os metadados são validados para cada arquivo para cada solicitação. Em caso de ferrugem, em um servidor Web ocupado com muitos arquivos pequenos, isso ainda pode causar contenção de E / S e desgastar prematuramente as unidades. Conteúdo estático e scripts podem ser rsync em / dev / shm ou em uma montagem tmpfs personalizada na inicialização do aplicativo. Fiz isso por algumas décadas e minhas unidades não se desgastam prematuramente. Além disso, meus sites suportam uma carga muito pesada de explosões dessa maneira. Isso ajuda em qualquer coisa, do hardware corporativo mais caro ao hardware de commodities.
Aaron

Respostas:

57

O vmtouch parece ser uma boa ferramenta para o trabalho.

Luzes:

  • consultar quanto de um diretório está armazenado em cache
  • consulta quanto de um arquivo está armazenado em cache (também quais páginas, representação gráfica)
  • carregar arquivo no cache
  • remover arquivo do cache
  • bloquear arquivos no cache
  • executar como daemon

manual do vmtouch

EDIT: O uso conforme solicitado na pergunta está listado no exemplo 5 na página inicial do vmtouch

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Conforme observado nos comentários, agora existe um repositório git disponível.

buscador
fonte
5
Para futuros visualizadores, tente usar o repositório vmtouch git em vez de seguir as instruções na página vinculada. Dessa forma, você obtém um makefile e pode receber atualizações.
aleatório 04/08/15
Parece que há um limite para o tamanho do arquivo (4 GB). Há alguma outra alternativa?
Alix Axel
Ok, aqui está o meu caso de uso real: um RPi1 com um cartão SD antigo, por aí em algum lugar fazendo coisas. Antes de fazer uma viagem até lá e substituir o cartão (e possivelmente a fonte de alimentação), quero que o sistema operacional toque no cartão com moderação, de preferência nunca. O cache do FS é bom, mas está fora do meu controle; / bin e / sbin já estão no tmpfs, ficando o / home / user da mesma forma tem outras desvantagens. vmtouchse encaixa bem nesse nicho.
Piskvor 10/01
Como o vmtouch funciona de maneira diferente do tmpfs?
Edward Torvalds
26

Isto também é possível usar o vmtouch Toucher memória virtual utilidade .

A ferramenta permite controlar o cache do sistema de arquivos em um sistema Linux. Você pode forçar ou bloquear um arquivo ou diretório específico no subsistema de cache da VM ou usá-lo para verificar quais partes de um arquivo / diretório estão contidas na VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Ou...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds
ewwhite
fonte
3
esse é um ótimo utilitário e faz exatamente o que o OP solicitou. Se ele aceitasse isso como resposta.
Laebshade
Você sabe se isso funciona com o ZFS?
precisa saber é o seguinte
11
@CMCDragonkai Eu não acho que seja necessário com o ZFS ... Pense: ARC e L2ARC .
ewwhite
22

O truque de um pobre homem para colocar coisas no cache do sistema de arquivos é simplesmente classificá-lo e redirecioná-lo para / dev / null.

cagenut
fonte
11
Aceita. E se você quiser garantir determinados arquivos são armazenados em cache, fazer um trabalho cron que caté o arquivo para / dev / null periodicamente
Josh
18

O Linux armazenará em cache o máximo de E / S de disco na memória possível. É isso que são as estatísticas de cache e memória de buffer. Provavelmente fará um trabalho melhor do que você armazenará as coisas certas.

No entanto, se você insistir em armazenar seus dados na memória, poderá criar uma unidade ram usando tmpfs ou ramfs. A diferença é que o ramfs alocará toda a memória solicitada, pois o tmpfs usará apenas a memória que o seu dispositivo de bloco está usando. Minha memória está um pouco enferrujada, mas você deve conseguir:

 # mount -t ramfs ram /mnt/ram 

ou

 # mount -t tmpfs tmp /mnt/tmp

e copie seus dados para o diretório Obviamente, quando você desliga a máquina ou desmonta a partição, seus dados serão perdidos.

David Pashley
fonte
11
Obrigado pela sua resposta, mas é obviamente isso que quero evitar. Caso contrário, eu apenas o escreveria para que o computador criasse o ramdrive, copiasse os arquivos e simbolicamente vinculasse ao ramdrive. Mas então meus dados são inconsistentes. Eu esperava um sistema de arquivos em que eu possa 'marcar' certos arquivos para serem armazenados em cache na memória. Mas talvez eu esteja um pouco otimista demais.
Andrioid 21/07/2009
3
Você "marca" os arquivos a serem armazenados em cache, acessando-os.
Womble
9
Se ao menos houvesse alguma maneira de marcar automaticamente os arquivos mais usados.
David Pashley
4
Caramba, sarcasmo não viaja bem faz isso :)
David Pashley
2
Sim obrigado. Eu entendo o conceito de cache de E / S. Eu até expliquei na minha resposta. Parece que você não leu o comentário sutil de que era sarcasmo.
David Pashley
18

Após algumas leituras extensivas sobre os recursos de troca e armazenamento em cache do kernel 2.6, encontrei 'fcoretools'. Que consiste em duas ferramentas;

  • fincore: revelará quantas páginas o aplicativo armazenou na memória principal
  • fadvise: Permite manipular a memória principal (cache de página).

(Caso alguém ache isso interessante, eu estou postando aqui)

Andrioide
fonte
11
Imaginei que havia um programa para fazer isso em algum lugar. +1
Brad Gilbert
7

Existem duas configurações do kernel que podem ajudar consideravelmente, mesmo sem o uso de outras ferramentas:

swappiness

informa ao kernel do linux quão agressivamente deve usar o swap. Citando o artigo da Wikipedia:

Swappiness é uma propriedade do kernel do Linux que altera o equilíbrio entre trocar a memória de tempo de execução, em vez de eliminar as páginas do cache de páginas do sistema. A troca pode ser configurada para valores entre 0 e 100, inclusive. Um valor baixo significa que o kernel tentará evitar a troca o máximo possível, onde um valor mais alto fará com que o kernel tente agressivamente usar o espaço de troca. O valor padrão é 60 e, para a maioria dos sistemas de desktop, defini-lo como 100 pode afetar o desempenho geral, enquanto defini-lo mais baixo (até 0) pode melhorar a interatividade (diminuição da latência da resposta).

vfs_cache_pressure

Citando vm.txt :

Controla a tendência do kernel de recuperar a memória usada para armazenar em cache objetos de diretório e inode.

No valor padrão de vfs_cache_pressure = 100, o kernel tentará recuperar dentries e inodes a uma taxa "razoável" em relação à recuperação de pagecache e swapcache. Diminuir vfs_cache_pressure faz com que o kernel prefira reter caches de dentry e inode. ...


Ao definir swappinessalto (como 100), o kernel move tudo o que não precisa trocar, liberando RAM para armazenar arquivos em cache. E definindo um valor vfs_cache_pressuremais baixo (digamos 50, não 0!), Favorecerá o cache de arquivos em vez de manter os dados do aplicativo na RAM.

(Eu trabalho em um grande projeto Java e, toda vez que o executo, é preciso muita RAM e liberamos o cache do disco, então na próxima vez que compilei o projeto, tudo foi lido do disco novamente. Ao ajustar essas duas configurações, eu gerencio para manter as fontes e a saída compilada em cache na RAM, o que acelera o processo consideravelmente.)

Petr Pudlák
fonte
3

Duvido muito que ele esteja realmente servindo arquivos do disco com 3 GB de RAM livre. O cache de arquivos do Linux é muito bom.

Se você estiver vendo E / S de disco, examinarei suas configurações de log. Muitos logs são definidos como sem buffer, para garantir que as informações mais recentes estejam disponíveis no caso de uma falha. Em sistemas que precisam ser rápidos independentemente, use E / S de log em buffer ou use um servidor de log remoto.

Zan Lynx
fonte
Você está certo, eu só quero controlar o que está sendo armazenado em cache.
Andrioid 21/07/2009
3

Se você possui bastante memória, pode simplesmente ler os arquivos que deseja armazenar em cache com gato ou similar. O Linux fará um bom trabalho mantendo-o por perto.

Thorbjørn Ravn Andersen
fonte
3

Você poderá ter um programa que apenas mmapseus arquivos permanecerão em execução.

Brad Gilbert
fonte
3
Isso é basicamente o que 'fadvise' (fcoretools) faz, até onde eu sei.
Andrioid 21/07/2009
0

Existem vários sistemas ramfs que você pode usar (por exemplo, ramfs, tmpfs), mas, em geral, se os arquivos estão sendo lidos com tanta frequência, eles ficam no cache do sistema de arquivos. Se o seu conjunto de arquivos de trabalho for maior que o seu RAM grátis, os arquivos serão limpos dele - mas se o seu conjunto de trabalho for maior que o seu RAM grátis, também não há como encaixar tudo em um disco ram.

Verifique a saída do comando "free" em um shell - o valor na última coluna, em "Cache", é o quanto de sua ram livre está sendo usado para o cache do sistema de arquivos.

Daniel Lawson
fonte
0

Quanto à sua última pergunta, verifique se a RAM está em diferentes canais de memória para que o processador possa buscar os dados em paralelo.

sybreon
fonte
0

Eu acho que isso pode ser melhor resolvido no nível do aplicativo. Por exemplo, provavelmente existem servidores da Web especializados para isso, ou você pode considerar o mod_cache com o Apache. Se você tem um objetivo específico, como fornecer conteúdo da Web mais rapidamente, pode obter melhorias nesse tipo de coisa que eu acho.

Mas sua pergunta é de natureza geral, o subsistema de memória Linux foi projetado para fornecer o melhor uso geral da RAM. Se você deseja direcionar certos tipos de desempenho, considere procurar tudo em / proc / sys / vm.

O pacote fcoretools é interessante, eu estaria interessado em qualquer artigo sobre sua aplicação ... Este link fala sobre as chamadas de sistema reais usadas em uma aplicação.

Kyle Brandt
fonte
11
encontre / var / lib / mysql | xargs fadvise -willneed (sujo, mas ele deve fornecer um acesso mais rápido aos arquivos de banco de dados, como um exemplo)
Andrioid
Muito bom corte, mas tal corte não desativar um monte de espera fsyncs de mysql :( são necessários fsyncs para garantir ACID (atomicidade, consistência, isolamento, durabilidade).
osgx
0

Os computadores desktop (por exemplo, o ubuntu) já usam arquivos de pré-carregamento (pelo menos, bibliotecas compartilhadas populares) na memória durante a inicialização. É usado para acelerar o tempo de inicialização e inicialização de diferentes bloarware, como FF, OO, KDE e GNOME (com evolução bloat-mailer).

A ferramenta é chamada readahead http://packages.ubuntu.com/dapper/admin/readahead

Também há syscall correspondente: readahead (2) http://linux.die.net/man/2/readahead

Há também um projeto de daemon de pré-carregamento: http://linux.die.net/man/8/preload

osgx
fonte
0

http://www.coker.com.au/memlockd/ faz isso

embora você realmente não precise dele, o linux fará um bom trabalho de armazenar em cache os arquivos que você está usando por conta própria.

Justin
fonte
0

Eu apenas tentei dd se = / dev / sua partição raiz de = / dev / null \ bs = 1Mcount = como a memória você deseja preencher

não me dá o controle que você deseja, mas pelo menos tenta usar memória desperdiçada


fonte
0

eu uso find / -name stringofrandomcharacter ajuda muito

user50472
fonte
0

Não é exatamente o que foi solicitado, mas eu uso

encontre BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

para acionar a inicialização de arquivos em um volume da AWS criado a partir de um instantâneo. É mais focado do que a recomendação oficial do uso de dd, se você quiser apenas ler alguns arquivos.

Federico
fonte
-1

Às vezes, posso querer armazenar em cache arquivos em uma determinada pasta e suas subpastas. Eu apenas vou para esta pasta e execute o seguinte:

encontrar . -exec cp {} / dev / null \;

E esses arquivos são armazenados em cache

Highstaker
fonte