Caching / preloading de arquivos no Linux para a RAM

61

Eu tenho um servidor bastante antigo que tem 4GB de RAM e é praticamente servir os mesmos arquivos durante todo o dia, mas está fazendo isso a partir do disco rígido, enquanto 3GBs de RAM são "livres".

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

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

Mais especificamente, não estou procurando um 'hack' aqui. Eu quero chamadas do sistema de arquivos para servir os arquivos da RAM sem a necessidade de criar um ram-drive e copiar os arquivos lá manualmente. Ou pelo menos um script que faz isso por mim.

Possíveis aplicações aqui são:

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

Alguma idéia?

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 não está sendo usado por aplicativos e quero controlar o que deve ser armazenado em cache na memória.
por Andrioid 21.07.2009 / 09:01

18 respostas

47

vmtouch parece uma boa ferramenta para o trabalho.

Destaques:

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

manual do vmtouch

EDITAR: O uso conforme solicitado na pergunta está listado no exemplo 5 em vmtouch Hompage

Example 5

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

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

EDIT2: Como anotou nos comentários, agora há uma repositório git disponível.

    
por 01.09.2012 / 23:40
25

Isso também é possível usando o utilitário vmtouch Virtual Memory Toucher .

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
    
por 23.10.2012 / 18:50
17

Após uma leitura extensiva sobre os recursos de troca de kernel 2.6 e cache de páginas, 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 (page-cache).

(No caso de alguém achar isso interessante, estou postando isso aqui)

    
por 21.07.2009 / 10:09
16

O Linux armazenará o máximo de E / S de disco na memória que puder. Isto é o que o cache e as estatísticas da memória do buffer são. 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 os ramfs irão alocar toda a memória que você pedir, pois os tmpfs só usarão a memória que seu dispositivo de bloco está usando. Minha memória está um pouco enferrujada, mas você deve ser capaz de fazer:

 # mount -t ramfs ram /mnt/ram 

ou

 # mount -t tmpfs tmp /mnt/tmp

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

    
por 21.07.2009 / 09:17
16

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

    
por 21.07.2009 / 09:19
5

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

swappiness

diz ao kernel do Linux o quão agressivamente ele deve usar o swap. Citando o artigo da Wikipédia:

Swappiness is a property for the Linux kernel that changes the balance between swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space. The default value is 60, and for most desktop systems, setting it to 100 may affect the overall performance, whereas setting it lower (even 0) may improve interactivity (decreasing response latency.)

vfs_cache_pressure

Citações de vm.txt :

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. ...

Ao definir swappiness high (como 100), o kernel move tudo o que não precisa para trocar, liberando memória RAM para armazenar arquivos em cache. E definindo vfs_cache_pressure menor (digamos para 50, não para 0!), Ele favorecerá o armazenamento em cache dos arquivos em vez de manter os dados do aplicativo na RAM.

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

    
por 23.10.2012 / 18:17
2

Eu duvido muito que esteja servindo arquivos do disco com 3 GB de RAM livre. O cache de arquivos do Linux é muito bom.

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

    
por 21.07.2009 / 09:11
2

Se você tiver muita memória, você pode simplesmente ler os arquivos que deseja armazenar em cache com cat ou similar. O Linux, então, fará um bom trabalho em mantê-lo por perto.

    
por 21.07.2009 / 09:44
2

Você pode ter um programa que apenas mmap s seus arquivos continuem em execução.

    
por 21.07.2009 / 19:24
0

Existem vários sistemas de ramfs que você pode usar (por exemplo, ramfs, tmpfs), mas em geral se os arquivos estão sendo lidos com frequência, eles ficam no cache do seu sistema de arquivos. Se o seu conjunto de arquivos de trabalho for maior do que o seu RAM livre, os arquivos serão removidos dele - mas se o seu conjunto de trabalho for maior que o seu RAM livre, também não será possível colocá-lo em um ramdisk.

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

    
por 21.07.2009 / 09:13
0

Quanto à sua última pergunta, assegure-se de que sua RAM esteja em diferentes canais de memória para que o processador possa buscar os dados em paralelo.

    
por 21.07.2009 / 09:27
0

Acho que isso pode ser melhor resolvido no nível do aplicativo. Por exemplo, provavelmente existem servidores web especializados para isso, ou você pode considerar o mod_cache com o Apache. Se você tem uma meta específica, como veicular conteúdo da web mais rápido, pode obter melhorias desse tipo de coisa.

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

O pacote fcoretools é interessante, eu estaria interessado em quaisquer artigos sobre sua aplicação ... Este link fala sobre as chamadas reais do sistema usadas em um aplicativo.

    
por 21.07.2009 / 14:08
0

Os computadores de mesa (por exemplo, Ubuntu) já usam arquivos de pré-carregamento (pelo menos, bibliotecas compartilhadas populares) para a memória na inicialização. Ele é 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 chama-se readahead link

Há também o syscall correspondente: readahead (2) link

Existe também o projeto do daemon de pré-carregamento: link

    
por 07.02.2010 / 02:53
0

link 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 sozinho.

    
por 07.02.2010 / 06:27
0

eu apenas tentei usar o dd se = / dev / yourrootpartition de = / dev / null \ bs = 1Mcount = como você deve enviar o documento

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

    
por 03.08.2010 / 13:34
0

eu uso find / -name stringofrandomcharacter isso ajuda muito

    
por 06.08.2010 / 21:19
0

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

find 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 que a recomendação oficial de usar o dd se você quiser apenas ler alguns arquivos.

    
por 09.11.2017 / 01:32
-1

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

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

E esses arquivos são armazenados em cache

    
por 13.05.2013 / 13:44