Por que descartar caches no Linux?


84

Em nossos servidores, temos o hábito de remover caches à meia-noite.

sync; echo 3 > /proc/sys/vm/drop_caches

Quando executo o código, parece liberar muita RAM, mas eu realmente preciso fazer isso. A RAM livre não é um desperdício?


62
Encontre a pessoa que colocou isso e pergunte a ele por que ele fez isso. Como você adivinhou corretamente, não há uma boa razão óbvia para isso.
Michael Hampton

10
Depurando o kernel. É sobre isso. Na verdade, isso não libera nenhuma RAM; elimina caches, como o nome sugere e, portanto, reduz o desempenho.
Michael Hampton

28
@ivcode Então você deve encontrar e corrigir o problema com esse servidor, em vez de tentar evitar as condições que o causam. Se meu carro parava toda vez que eu fazia uma curva acentuada à direita, evitar uma curva acentuada à direita é uma solução ruim.
David Schwartz

7
Relacionados thedailywtf.com/Articles/Modern-Memory-Management.aspx Fortemente argumentando que é uma má idéia.
Drunix

7
Relacionado e uma descrição útil do "problema": linuxatemyram.com
Bill Weiss

Respostas:


86

Você está 100% correto. É não uma boa prática para liberar RAM. Este é provavelmente um exemplo de administração do sistema de culto à carga.


9
+1 por mencionar a Administração do sistema de culto de carga. Qualquer administrador de sistema que não conheça esse termo e o que ele significa deve ser demitido.
Tonny

8
@Tonny: Nós ficaríamos sem o departamento sysadmin :(
PlasmaHH

2
Como a maioria da humanidade, adoro afirmações impetuosas e concisas com muita aprovação, mas uma citação ou raciocínio ganharia o +1 do meu superego.
Aaron Hall

2
Explique a administração do culto à carga, bem como o acima, se você não se importa. Talvez em uma edição subsequente? Ainda estou retendo meu +1 ...: P
Aaron Hall

2
"é possível que, embora seu aplicativo não esteja usando essas RAM, o Linux esteja armazenando em cache de forma agressiva em sua memória e, mesmo que o aplicativo precise de memória, ele não liberará alguns desses cache, mas prefere começar a trocar". Não é muito específico. Na prática, o gerenciamento de memória não é perfeito e é bom ter um botão para girar quando essa imperfeição aparecer.
Dan Pritts

62

Sim, limpar o cache liberará RAM, mas faz com que o kernel procure por arquivos no disco e não no cache, o que pode causar problemas de desempenho.

Normalmente, o kernel limpa o cache quando a RAM disponível é esgotada. Ele freqüentemente grava conteúdo sujo no disco usando o pdflush.


20
+1 por explicar por que é uma má ideia.
Ogre Psalm33

35

O motivo para descartar caches como esse é para comparar o desempenho do disco e é o único motivo pelo qual ele existe.

Ao executar um benchmark com uso intensivo de E / S, você quer ter certeza de que as várias configurações que você tenta estão realmente executando E / S de disco; portanto, o Linux permite que você elimine caches em vez de fazer uma reinicialização completa.

Para citar a documentação :

Este arquivo não é um meio de controlar o crescimento dos vários caches do kernel (inodes, dentries, pagecache, etc ...) Esses objetos são recuperados automaticamente pelo kernel quando a memória é necessária em outro local do sistema.

O uso desse arquivo pode causar problemas de desempenho. Uma vez que descarta objetos em cache, pode custar uma quantidade significativa de E / S e CPU para recriar os objetos descartados, especialmente se eles estiverem sob uso intenso. Por esse motivo, o uso fora de um ambiente de teste ou depuração não é recomendado.


Obviamente, dependendo do que você está tentando fazer, mesmo uma reinicialização completa pode não limpar o cache do disco o suficiente.
um CVn

1
"esses objetos são recuperados automaticamente pelo kernel quando a memória é necessária" é o objetivo do design, mas pode não ser sempre o comportamento real.
Dan Pritts

@DanPritts O que exatamente faz você pensar que não é assim?
Joe

2
O caso óbvio é quando você deseja limpar a RAM para permitir a alocação de mais páginas enormes (não diferentes dos outros); outro caso são os erros transparentes de pausa na coleta de lixo da enorme página (veja minha resposta / comentários em outro lugar sobre esta questão). Mas meu comentário foi destinado ao caso geral. Às vezes, as pessoas que estão operando o sistema sabem melhor do que as pessoas que o projetaram / implementaram. Muitas vezes, não - é contra isso que o comentário deles está tentando se proteger. Estou feliz que o
Dan Pritts

26

A idéia básica aqui provavelmente não é tão ruim (apenas muito ingênua e enganosa): pode haver arquivos em cache, que dificilmente serão acessados ​​em um futuro próximo, por exemplo, arquivos de log. Esses ram "devoram", que mais tarde terão que ser liberados quando necessário pelo sistema operacional de uma ou de outra maneira.

Dependendo das configurações de troca, padrão de acesso a arquivos, padrão de alocação de memória e muitas outras coisas imprevisíveis, pode acontecer que, quando você não libera esses caches, eles serão forçados a serem reutilizados posteriormente, o que leva um pouco mais de tempo do que alocar memória do pool de memória não utilizada. Na pior das hipóteses, as configurações de swappiness do linux farão com que a memória do programa seja trocada, porque o linux acredita que esses arquivos podem ser mais propensos a serem usados ​​em um futuro próximo do que a memória do programa.

No meu ambiente, o linux acha que muitas vezes está errado e, no início da maioria das servidores das bolsas de valores da europa (por volta das 9h, horário local), as coisas começam a ser executadas apenas uma vez por dia, sendo necessário trocar a memória que foi trocada anteriormente por escrever arquivos de log, compactando-os, copiando-os etc. estavam enchendo o cache até o ponto em que as coisas tinham que ser trocadas.

Mas está descartando caches a solução para esse problema? definitivamente não. Qual seria a solução aqui é dizer ao linux o que ele não sabe: que esses arquivos provavelmente não serão mais usados. Isso pode ser feito pelo aplicativo de gravação usando coisas como posix_fadvise()ou usando uma ferramenta de linha cmd como vmtouch(que também pode ser usada para pesquisar coisas e também arquivos em cache).

Dessa forma, você pode remover os dados que não são mais necessários dos caches e manter os itens que devem ser armazenados em cache, porque quando você remove todos os caches, muitas coisas precisam ser relidas do disco. E isso no pior momento possível: quando é necessário; causando atrasos visíveis e muitas vezes inaceitáveis ​​no seu aplicativo.

O que você deve ter em vigor é um sistema que monitore seus padrões de uso de memória (por exemplo, se algo estiver sendo trocado) e, em seguida, analise adequadamente e aja de acordo. A solução pode ser despejar alguns arquivos grandes no final do dia usando o vtouch; pode ser também adicionar mais memória RAM, porque o pico de uso diário do servidor é exatamente isso.


Todos os aplicativos do meu servidor estão em execução nohup. Talvez nohup.out esteja sendo armazenado em cache e consumindo memória?
ivcode

@ivcode: Esse pode ser um motivo, verifique o tamanho do nohup.out. Talvez use o vmtouch para descobrir quanto é armazenado em cache.
PlasmaHH

Eu tenho um trabalho cron para a cat /dev/null > path/nohup.outcada 15 minutos, pois o nohup.out está crescendo rapidamente. Talvez linux é o cache nohup.out mesmo se eu estou limpando-a
ivcode

5
@ivcode Se você não precisa da saída nohup, redirecione-a para /dev/null. Parece que você teve alguns administradores de sistema muito inexperientes trabalhando em seus sistemas em algum momento. Veja stackoverflow.com/questions/10408816/… para saber como direcionar nohupa saída para/dev/null
David Wilkins

embora o nohup.out seja limpo em intervalos de 15 minutos, se o processo dos aplicativos for interrompido por algum motivo, o nohup.out será automaticamente copiado de outro script. Eu tentei vmtouch. é uma ferramenta muito boa, na verdade
ivcode

16

Eu vi os caches de descarte serem úteis ao iniciar várias máquinas virtuais. Ou qualquer outra coisa que use páginas grandes, como alguns servidores de banco de dados.

Páginas grandes no Linux geralmente precisam desfragmentar a RAM para encontrar 2 MB de RAM física contígua para colocar em uma página. A liberação de todo o cache de arquivos facilita esse processo.

Mas concordo com a maioria das outras respostas, pois geralmente não há um bom motivo para eliminar o cache de arquivos todas as noites.


1
Eu votei por apontar preconceito de segunda ordem: respostas a descarte de caches.
Noah Spurrier

1
Além disso, em aplicativos HPC em nós de alta memória (1 TB), a leitura de alguns arquivos grandes resulta em uma grande quantidade de memória em cache. Como muitos aplicativos HPC realizam mallocs de centenas de GB, o sistema pode parar por horas, enquanto os processos de migração movem minúsculos pedaços de memória fragmentada sem frutos através dos nós NUMA quando o sistema atinge a "borda" da memória em cache. Pior, nada que você possa fazer na terra do usuário para liberar os caches, exceto induzir o sistema a alocar todos os minúsculos blocos de 2 MB que ele pode lançar ao mesmo tempo, deixando a desfragmentação por página enorme e os aplicativos sendo executados normalmente.
user1649948

+1 O comando para criar páginas grandes ( sysctl -w vm.nr_hugepages=...) se recusa a funcionar mesmo, a menos que eu solte primeiro os caches (Arch linux).
Aleksandr Dubinsky

8

É possível que isso tenha sido instituído como uma maneira de estabilizar o sistema quando não havia ninguém com habilidades ou experiência para realmente encontrar o problema.

Liberando recursos

A eliminação de caches liberará essencialmente alguns recursos, mas isso tem um efeito colateral de fazer com que o sistema realmente trabalhe mais para fazer o que está tentando fazer. Se o sistema estiver trocando (tentando ler e gravar a partir de uma partição de troca de disco mais rapidamente do que é realmente capaz), a remoção periódica de caches pode aliviar o sintoma , mas não faz nada para curar a causa .

O que está consumindo memória?

Você deve determinar o que está causando muito consumo de memória que faz com que os caches descartados pareçam funcionar. Isso pode ser causado por qualquer número de processos de servidor mal configurados ou simplesmente mal utilizados. Por exemplo, em um servidor, eu testemunhei a utilização máxima da memória quando um site Magento atingiu um certo número de visitantes em um intervalo de 15 minutos. Isso acabou sendo causado pelo fato de o Apache ser configurado para permitir que muitos processos fossem executados simultaneamente. Processos demais, usando muita memória (Magento às vezes é uma fera) = troca.

Bottom Line

Não basta assumir que é algo que é necessário. Seja proativo em descobrir por que ele está lá, tenha a coragem de desativá-lo, se outros sugerirem que está errado, e observe o sistema - aprenda qual é o problema real e corrija-o.


4

O Linux / m68k realmente tem um bug no kernel que faz com que o kswapd enlouqueça e consuma 100% da CPU (50% se houver alguma outra tarefa vinculada à CPU, como um construtor automático de pacotes binários Debian - vulgo buildd - já em execução), que pode (a maioria do tempo; nem sempre) seja atenuado executando esse comando específico a cada poucas horas.

Dito isto… o seu servidor provavelmente não é um sistema m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ;-)

Nesse caso, a pessoa que colocou as falas seguiu alguns conselhos questionáveis ​​ou, na melhor das hipóteses, desatualizados, ou teve a idéia de como a RAM deveria ser usada incorretamente (o pensamento moderno realmente diz que “a RAM livre é desperdiçada” e sugere o armazenamento em cache) , ou "descobriu" que isso "corrige" [sic!] outro problema em outro lugar (e estava com preguiça de procurar uma correção adequada).


"um bug do kernel que faz com que o kswapd fique louco" - Que bug é esse?
Ben

@ Ben ver esta discussão (esta mensagem e um par de followups, um dos quais inclui um palpite onde ele poderia vir de)
mirabilos

1
Estou enfrentando um problema semelhante (embora seja x86_64) ea única solução neste momento é a queda caches serverfault.com/questions/740790/...
Fernando

2
@Fernando Eu tenho um cron “caches gota” na caixa de m68k bem ☹
mirabilos

3

Um motivo pode ser o site estar executando algum tipo de monitoramento, que verifica a quantidade de RAM livre e envia um aviso aos administradores quando a RAM livre cai abaixo de uma certa porcentagem. Se essa ferramenta de monitoramento for burra o suficiente para não incluir cache no cálculo da RAM livre, poderá enviar avisos falsos; esvaziar regularmente o cache pode suprimir esses avisos enquanto ainda permite que a ferramenta observe quando a RAM "real" fica baixa.

Obviamente, nesse tipo de situação, a solução real é modificar a ferramenta de monitoramento para incluir o cache no cálculo da ram livre; limpar o cache é apenas uma solução alternativa e ruim, porque o cache será recarregado rapidamente quando os processos acessarem o disco.

Portanto, mesmo que minha suposição seja verdadeira, a limpeza de cache não é algo que faça sentido, é uma solução alternativa para alguém que não é competente o suficiente para corrigir o problema principal.


3

Posso pensar em um motivo plausível para fazer isso em um trabalho noturno de cron.

Em um sistema grande, pode ser útil descartar caches periodicamente para remover a fragmentação da memória.

O suporte para enorme página transparente do kernel faz uma varredura periódica de memória para agrupar páginas pequenas em páginas enormes. Sob condições degeneradas, isso pode resultar em pausas no sistema de um ou dois minutos (minha experiência com isso foi no RHEL6; espero que melhore). A eliminação de caches pode permitir que o grande varredor de páginas tenha espaço para trabalhar.

Você pode argumentar que esse é um bom motivo para desativar grandes páginas transparentes; OTOH, você pode acreditar que vale a pena melhorar o desempenho geral de grandes páginas transparentes e pagar o preço de perder seus caches uma vez por dia.


Pensei em outro motivo pelo qual você desejaria fazê-lo, embora não em um trabalho cron. Antes de um sistema de virtualização migrar uma VM para um novo hardware, seria um momento muito bom para isso. Menos conteúdo de memória para copiar para o novo host. Eventualmente, você terá que ler a partir do armazenamento, é claro, mas eu provavelmente aceitaria essa troca.

Não sei se algum dos softwares virt faz isso.


1
Você tem alguma fonte para isso? Isso soa como algo que deve ser corrigido no kernel, se for um problema.
precisa saber é

3
Tenho experiência pessoal com as pausas com enormes páginas transparentes. RHEL6, Dell R810, 4CPUs, 64 GB de RAM. A desativação de enormes páginas transparentes (existe um arquivo / proc para isso) corrigiu imediatamente as pausas. Eu não tentei a técnica de queda de cache na época; em vez disso, reconfigurei nossos aplicativos java para usar páginas enormes não transparentes e deixei as páginas grandes transparentes desativadas. No IIRC, analisamos a situação o suficiente para perceber que não éramos as únicas pessoas afetadas e que a Red Hat conhecia o problema.
Dan Pritts

Olá Dan, constato o mesmo comportamento no meu servidor. Eu trabalho, com uma quantidade enorme de dados, e há uma queda drástica no desempenho após mais de 10 cálculos de um mesmo programa python (x2-3 do primeiro tempo de computação). Se eu der uma olhada, o tamanho do cache da memória é enorme, 100 + GB. E se eu liberar esse cache de memória e executar novamente o meu programa, voltarei ao meu tempo inicial de computação. Você tem algum documento ou informação para compartilhar sobre esse fenômeno? Obrigado.
Axel Borja

1
access.redhat.com/solutions/46111 descreve-o. Você pode desativar grandes páginas transparentes para ver se esse é o problema no seu caso.
Dan Pritts

2

Apenas para adicionar meus dois centavos: O sistema sabe muito bem que essas páginas de memória são caches e cairá o quanto for necessário quando um aplicativo solicitar memória.

Uma configuração relevante é a /proc/sys/vm/swappinessque diz ao kernel durante novas alocações de memória que prefira descartar caches de memória ou trocar páginas de memória alocadas "inativas".


1

A pergunta é de 2014, mas como o problema existe até hoje em alguns backends ocultos do centos 6.8, ainda pode ser útil para alguém.

https://github.com/zfsonlinux/zfs/issues/1548 descreve um problema com o zfs. Lá, o espaço em disco não é liberado para arquivos excluídos, porque se o nfs for usado no topo do zfs, os inodes do arquivo não serão descartados do cache de inodes do kernel.

Para citar o tópico do bug, behlendorf, 6 de janeiro de 2015 escreveu:

A especulação atual é que, por algum motivo, o servidor NFS mantém uma versão em cache do identificador de arquivo. Até que o servidor NFS descarte esse arquivo, o ZFS não poderá desvincular esse arquivo. Alguns testes de luz mostraram que a eliminação de caches no servidor fará com que essa referência seja descartada (como o identificador de arquivo NFS), quando o espaço é liberado corretamente. A pressão da memória também pode fazer com que ela caia.

ou seja, um eco noturno 3> / proc / sys / vm / drop_caches é a correção mais fácil para esse bug, se você não quiser ter um tempo de inatividade para reestruturar seus zfs.

Talvez não seja a administração do culto à carga, mas alguma boa depuração foi o motivo.


0

Isso pode fazer sentido em sistemas NUMA (acesso não uniforme à memória), onde, normalmente, cada CPU (soquete) pode acessar toda a memória de forma transparente, mas sua própria memória pode ser acessada mais rapidamente do que a memória de outros soquetes, em associação com aplicativos HPC paralelos.

Muitos aplicativos paralelos simples tendem a executar E / S de arquivo de um único processo, deixando assim uma grande fração de memória em um único nó NUMA alocado ao cache do disco, enquanto no outro nó NUMA a memória pode estar praticamente livre. Nessas situações, como o processo de recuperação de cache no kernel Linux, até onde eu sei, ainda não reconhece NUMA, os processos em execução no nó NUMA que possui memória alocada no cache são forçados a alocar memória no outro nó NUMA, contanto que haja RAM livre no outro nó, matando as performances.

No entanto, em um sistema HPC, seria mais prudente limpar o cache antes de iniciar um novo trabalho do usuário, não em um horário específico com o cron.

Para aplicativos não paralelos, é improvável que esse problema ocorra.


0

Quando o cache da página é muito grande (muito maior que o uso atual de troca) e a troca e troca ocorre alternadamente, é nesse momento que você precisa descartar os caches. Vi casos em que o uso de memória aumenta em um dos meus servidores de banco de dados MariaDB executando o Ubuntu 16.04LTS, e o Linux optou por aumentar o uso de troca em vez de remover caches de páginas não utilizados. Páginas enormes enormes já desabilitadas no meu sistema porque o TokuDB exigia que ela fosse desabilitada. Enfim, talvez não seja um bug, mas o Linux ainda está fazendo esse comportamento é bastante intrigante para mim. Várias fontes afirmaram que o Linux removeria o cache da página quando o aplicativo o solicitasse:

Mas a realidade não é assim tão simples. A solução alternativa é:

  1. Executar cache de descarte periodicamente
  2. Execute o armazenamento em cache quando necessário (monitore usando o vmstat 1 para trocar atividades)
  3. Aconselhe o linux a remover certos arquivos do cache (como arquivos de log do apache) usando utilitários como dd ou python-fadvise. Consulte https://unix.stackexchange.com/questions/36907/drop-a-specific-file-from-the-linux-filesystem-cache

Exemplo de execução do dd:

dd if=/var/log/apache2/access_log.1 iflag=nocache count=0

Exemplo python-fadvise:

pyadvise -d /var/log/apache2/access_log.1


-5

Eu tenho uma máquina de mesa com 16 GB de RAM rodando no kernel PAE. Depois de uma ou duas horas, o desempenho do disco diminui drasticamente até eu soltar os caches, então simplesmente o coloco no cron. Não sei se isso é um problema com o kernel do PAE ou se a implementação do cache é tão lenta se houver muita memória.


9
Este é um excelente exemplo da administração do sistema de "cult de carga": em vez de localizar e resolver o problema, você está simplesmente ocultando-o.
Michael Hampton

2
Às vezes, a solução conveniente é a certa. Pode ser apenas adiar a solução do problema real, ou pode ser a solução necessária nas circunstâncias. Mesmo que seja uma má prática, ainda não é um "culto à carga". Há uma causa e efeito demonstrados: descartar caches e melhorar o desempenho do disco.
Dan Pritts

1
Parte da definição original de CCSA era uma tendência a confundir correlação com causalidade, e aqui estamos. Mascarar um problema abordando uma entidade correlacionada, mas não causal, é uma solução abaixo do ideal, que é contra a qual o conceito de CCSA está tentando advertir.
underscore_d
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.