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?
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?
Respostas:
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.
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.
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.
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.
cat /dev/null > path/nohup.out
cada 15 minutos, pois o nohup.out está crescendo rapidamente. Talvez linux é o cache nohup.out mesmo se eu estou limpando-a
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 nohup
a saída para/dev/null
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.
sysctl -w vm.nr_hugepages=...
) se recusa a funcionar mesmo, a menos que eu solte primeiro os caches (Arch linux).
É 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.
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 .
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.
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.
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 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.
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.
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/swappiness
que 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".
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.
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.
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 é:
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
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.