Por que o Linux não limpa automaticamente os caches?

Por que o Linux não limpa automaticamente os caches?

Fundo

Minha pergunta é basicamente uma continuação dissoperguntaeresponder, e em particular, esteComente.

Sempre que preciso copiar ou sincronizar novamente grandes quantidades de arquivos, a memória do meu sistema tende a ficar cheia, então executo um script como este (como root):

while true ; do echo "syncing" && sync && echo 3 > /proc/sys/vm/drop_caches && echo "done" && sleep 60 ; done ;

Questões

  • Isso poderia prejudicar o sistema de alguma forma ou causar algum efeito negativo? (Em particular, quais são os “riscos” mencionados no comentário referenciado?)
  • Se a resposta for “não” (que é o que eu suspeito), então por que o Linux não executa esse comando automaticamente por padrão? (Não vejo nenhuma mudança perceptível devido a isso, só percebo que não fico sem memória...)

Responder1

Porque nunca há nenhum benefício em descartar caches. Esquecer as coisas não é onde está o ganho. O ganho está no reaproveitamento de memória, isso vai acontecer de qualquer maneira. Como alguns dados pontuais serão removidos da memória.

No entanto, realizar esses trabalhos grandes pode causar danos ao desempenho: se os dados forem armazenados em cache, mas nunca reutilizados, isso fará com que outros dados sejam despejados, sem nenhum benefício.

Portanto, você precisa executar o trabalho sem cache (infelizmente não me lembro do comando para fazer isso).

Responder2

Por que o Linux não limpa automaticamente os caches?

Ele vai.

ron> free -g
             total       used       free     shared    buffers     cached
Mem:           504        415         88          1          0        352
-/+ buffers/cache:         62        441
Swap:            0          0          0

A memória cache ainda deve ser considerada memória livre.

Quando free chegar a 0, ele será extraído do cache.

Isso poderia prejudicar o sistema de alguma forma ou causar algum efeito negativo?

dano = não. Pesquise echo 3 > /proc/sys/vm/drop_cachese você verá que é umnão destrutivoOperação.

o efeito negativo seria a penalidade de desempenho incorrida por ter que ler algo do disco que estaria no cache. Por exemplo, escreva um programa C que leia um arquivo de dados de 10 GB. A primeira execução será lenta porque está lendo o disco, mas a qualquer momento depois será muito mais rápido porque o arquivo de dados está armazenado em cache na memória RAM. Elimine o cache e a próxima execução subsequente do arquivo de dados de leitura do programa será lenta como na primeira vez que foi executada. Isto é facilmente observável e repetível.

Se a resposta for não, por que o Linux não executa este comando automaticamente por padrão?

Você teria que explicar como e onde você vê isso acontecer. Não estou ciente disso no Linux atual, como RHEL/CentOS 7.7. Mas os Linux mais antigos (como o kernel pré 3.x) podem ter sido uma decisão tomada por aquela distribuição quando o cache não era tão robusto como é agora (na minha opinião). Usando o SLES 11.4 há alguns anos, tenho certeza de que o pessoal do SuSE não escreveu código para fazer com que o descarte de cache acontecesse automaticamente, mas para alguns servidores de trabalho, pedi às pessoas de quem os compramos e configuramos o SLES para nós na época que fez um crontab para fazer o cache de descarte periódico, é uma espécie de área cinzenta sobre por que isso é feito. Eu suspeito que seja uma mentalidade doméstica = boa e porque nunca é um comando destrutivo, não pode realmente machucar. As poucas vezes que fiz isso manualmente echo 3 > drop_cachesno sles 11.4 foram para solução de problemas, pois ele nunca resolveu nada onde uma reinicialização fosse necessária.

Consulte o guia de ajuste de desempenho RHEL e ajuste de memória virtual. Eu não sei o quanto disso é específico do RHEL versus ser de baixo nível o suficiente para ser todo relacionado ao kernel Linux e não específico para uma distribuição Linux. Além disso, o que mudou do kernel 2.6 para 3.x para 4.x, o que tenho certeza é significativo a esse respeito, então considere ler as notas de lançamento do kernel Linux.

informação relacionada