Despejos de cache do Linux

8

Observando como o cache VFS em minha máquina Linux se comporta, posso ver que, mesmo quando efetivamente ocioso (a maioria dos outros daemons interrompidos faz interface com a interface desativada), a quantidade de memória livre aumenta gradualmente, implicando que itens estão sendo despejados do cache.

Eu pesquisei bastante no Google, mas não consigo encontrar nenhuma referência sobre como isso é controlado (a menos que seja um efeito colateral do vm_swappiness). Alguém pode me colocar no caminho certo para entender por que os itens estão sendo despejados do cache quando não há demanda por nova alocação de memória?

symcbean
fonte
«Implicando que itens estão sendo despejados do cache» - bem, nesse caso vmstat, mostraria um aumento no tamanho dos caches - são realmente?
poige
diminuindo com certeza. Sim, eles são (decrescente)
symcbean
Então, você diz que o aumento de memória livre e o tamanho do cache / buf estão diminuindo ao mesmo tempo, certo?
poige

Respostas:

1

a troca afeta apenas se a memória do aplicativo alocada é trocada para liberar espaço para o cache. vfs_cache_pressure é o sysctl que controla o que você está vendo.

Bratchley
fonte
1
Nenhuma - controlos vfs_cache_pressure a proporção de metadados vs retenção pagecache (pelo menos de acordo com os documentos que li e as experiências eu correr)
symcbean
1
Justo. Pesquisei um pouco mais e, pelo que vejo, tudo está ordenado em uma lista de pedidos da LRU e só foi analisado quando algum limite (artificial ou físico) é atingido ou ultrapassado. Dado isso, eu assumiria que algo ainda está acontecendo (como um thread do kernel acordando ou algo assim). Se é super importante para você descobrir isso, parece que existe um script pré-escrito do systemtap chamado "mmreclaim.stp" que rastreia as recuperações do gerenciador de memória. Eu também tinha certeza de que não seria realmente trocado usando "sar -A".
Bratchley #
1

O Linux libera os dados do cache da página usando um processo chamado pdflush

O pdflush é controlado pelos parâmetros de / proc / sys / vm

#/proc/sys/vm/dirty_expire_centisecs
The hundredth of the second after which data will be considered to be expired from the page cache and will be written at the next opportunity.

#/proc/sys/vm/dirty_writeback_centisecs`    
The hundredth of a second after which the pdflush wakes up to write data to disk.

#/proc/sys/vm/vfs_cache_pressure`    
This will reclaim dentries and inodes which are also part of the cache.

Você pode conferir os seguintes tópicos para obter mais informações:

O daemon pdflush
Teoria de operação e ajuste para cargas pesadas de gravação
Linux Cache Memory

Joe
fonte
Obrigado Joe, no entanto, as 2 primeiras opções estão especificamente relacionadas a dados que precisam ser gravados no sistema de arquivos (ou seja, o buffer de gravação) e não dados que foram lidos e não foram alterados (o buffer de leitura). O vfs_cache_pressure controla a preferência de remoção de metadados do arquivo em relação ao conteúdo do arquivo.
symcbean
@symcbean Você está correto. A resposta fala mais sobre cache de gravação. O cache de leitura é limpo com base no LRU. No entanto, o Linux usa uma estratégia de duas listas com base na qual o cache de leitura está sendo limpo. Você pode ler mais sobre o Two-List Stragety e como o linux limpa o cache de leitura aqui . Deixe-me saber se isso faz sentido. No seu caso eu supor que, após todos os processos estão parados, estes caches de leitura entrar em lista de inativos e são apagadas
Joe
obrigado, bom artigo. Alguma idéia de que livro é o capítulo? No entanto, embora explique como uma página específica é priorizada para remoção, ela realmente não explica por que as páginas são removidas quando não há demanda aparente por memória. O que controla o processo "para reduzir o cache e disponibilizar mais RAM para outros usos"? O que é substituí-los por?
symcbean
@symcbean O despejo de cache funciona imediatamente quando há demanda por memória. No entanto, não faz sentido tê-lo em cache quando ninguém o estiver usando ativamente. Lá, as páginas ativas se tornam páginas inativas e, eventualmente, são despejadas. Suponho que sua pergunta se origine do ponto em que o despejo deve ocorrer somente quando houver demanda por memória. O linux limparia todas as páginas inativas como e quando estiverem disponíveis. Como [observado no artigo] [ jothirams.com/linux-cached-memory/] se tudo estiver ativo, você ficará sem memória e o OOM será chamado.
18714 Joe