Estou administrando um servidor Debian Linux x86_64 com 125 GB de RAM, uma partição de troca de 10 GB e um valor de troca de 60.
Uma free -gw
saída imprime:
total used free shared buffers cache available
Mem: 125 20 1 25 0 103 78
Swap: 9 1 7
Todas as noites, um cron job é executado, o que é muito intensivo em R/W do disco e aumenta a memória usada em 2 GB durante sua execução antes de retornar para ~ 20 GB.
No mesmo período de tempo, certos processos Python em contêineres de longa duração (especialmente gunicorn) são paginados.
Com o tempo, esses processos preencherão gradualmente a troca - após algumas semanas, ela estará 99% completa.
Posso limpar a troca reiniciando os processos ou desativando e reativando com swapoff
e swapon
. Mas o uso de swap dos processos do Python apenas aumentará lentamente novamente.
Eu acho que parte da explicação pode ser que, por causa do trabalho cron noturno, o Kernel está priorizando o cache do sistema de arquivos mais alto que os processos do Python. Mas também acho que algum bug de software no manuseio de memória desses processos Python pode ser o culpado.
Um amigo sugeriu que eu comprasse ainda mais RAM para que houvesse mais espaço para o cache do sistema de arquivos. Isso me parece excessivo. Gostaria de diagnosticar com mais precisão a causa da troca e encontrar alguma solução de software para o problema.
Então agora passo a pergunta para o Serverfault - o que você acha desse fenômeno e para onde devo ir a partir daqui?
Não, você não precisa de mais RAM e não precisa fazer
swapoff
/swapon
. Este é um comportamento normal, o sistema detecta algumas páginas de memória raramente usadas e as move para a troca para que possa usar a RAM para algo mais útil, como cache de arquivos.