O aumento constante do tamanho do swap no Linux e no espaço do swap não está sendo recuperado?


10

Eu tenho uma caixa Linux de 8 GB de RAM na qual 4 servidores tomcat estão em execução. Um deles está definido para 3000 MB de memória (configuração de jvm -Xms e -Xmx) e outros estão definidos para 1500 MB. A partição de troca também é definida como 8Gigs. Quando inicio esses servidores, o uso do arquivo de troca é baixo. Porém, durante um período de dias e durante determinados períodos em que um / todos os servidores estão em atividade de pico, o uso de troca começa a aumentar. Aqui está uma saída típica sar -r.

kbmemfree kbmemused% kbbuffers memorizados kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99,41 196440 2761852 7197688 1190912 14,20 316044

75504 8098588 99,08 198032 2399460 7197688 1190912 14,20 316032

Ele mostra 14,2% de swap usado atualmente. O engraçado é que esse% NUNCA diminui . Ele continua a aumentar e atingir até 30-40% . Reiniciamos nossos servidores semanalmente.

Eu assumiria que o % swpused aumentou durante períodos de atividade de pico e diminuiu durante períodos de atividade baixa .. Ou pelo menos permaneceu constante. Parece que o espaço de troca nunca é recuperado pelo sistema operacional.

Saída de livre: total -m total usado buffers compartilhados gratuitos armazenados em cache Mem: 7982 7937 45 0 32 2088 - / + buffers / cache: 5816 2166 Swap: 8191 1163 7028

Portanto, há pelo menos 2g de RAM grátis. Portanto, a pergunta é: Por que o espaço de troca continua aumentando e não está sendo recuperado pelo sistema operacional? Ou como depurar isso para descobrir o que está acontecendo.

Respostas:


12

Se as informações forem trocadas para o disco e depois lidas novamente na memória, elas geralmente serão deixadas na área de troca até que o espaço de troca seja baixo. Isso significa que, se as mesmas informações precisarem ser trocadas novamente mais tarde e não tiverem sido alteradas, o sistema operacional poderá simplesmente remover as páginas da RAM alocada sem precisar gravar nada no disco economizando tempo.

A troca alocada para coisas que foram lidas novamente na memória será liberada

  1. quando as páginas relevantes não são mais necessárias (ou seja, são liberadas pelo aplicativo)
  2. quando as páginas relevantes são alteradas (para que a cópia no disco não esteja mais atualizada)
  3. a máquina fica com pouco espaço de troca, limpando algumas coisas que já estão na RAM para liberar espaço

Procure /proc/meminfouma linha chamada "SwapCached". Essa entrada conta as páginas encontradas na RAM e nas partições de troca. Por exemplo, escolhendo uma pequena VM aleatoriamente, o /proc/meminfoarquivo virtual de uma das minhas VMs mostra:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

indicando que 74268K de espaço de troca está alocado, mas que 17232K dessas páginas também estão mapeadas para a RAM (também pode ser desalocado da troca a qualquer momento, se o espaço for necessário para outra coisa).

Também, sem dúvida, haverá páginas que foram trocadas há séculos e nunca mais foram usadas desde então. O kernel não recarregará as páginas do swap apenas porque há alguma RAM livre para lê-lo novamente, pois essa RAM pode ser melhor usada para cache ou buffers - as páginas escritas para swap geralmente são relidas apenas quando forem necessárias.

Se você quiser limpar o que está em swap, contanto que você tenha livre e / ou liberável o suficiente (ou seja, livre + cache + buffers (menos as partes das contagens c + b que não são liberáveis ​​RightThisInstant)), basta ativar desligado e ligado novamente com swapoff -a && swapon -a.

É claro que você também pode ter um vazamento de memória em algum lugar também, mas essa não é a única explicação para o comportamento que está vendo.


Excelente resposta.Obrigado. Portanto, meu sistema atualmente mostra SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB Tão livre de swap real = 7197688 + 595724 = 7793412. Swap Actul usado = 8388600 - 7793412 = 595188 == 581MB. Eu acho que 581MB de uso de arquivo de troca é razoável para um sistema de 8GB com 4 aplicativos em execução. Deixe-me monitorar isso nos próximos dias e ver se o número de swapCached continua aumentando proporcionalmente a% swapUsed.
Zenil

2

Basicamente, você não precisa se preocupar com isso. O que é importante saber é quanto IO vai para a troca (dê uma olhada no comando 'vmstat'). Ter mais coisas na troca não custa nada. O único custo é colocar o material na troca (entrada da página) ou retirá-lo (saída da página). Portanto, é perfeitamente razoável que o SO deixe a troca crescer.


1
É importante saber por que a troca está aumentando e nunca diminuindo. E se permitirmos que nossos servidores continuem em execução por semanas? A troca crescerá além do limite e resultará em problemas de memória? A troca / troca parece "razoável". Durante os períodos de atividade de pico, há alta troca / troca (e também% de aumento de troca) .. Durante períodos normais, troca / troca é mínima, mas% de troca não está diminuindo
Zenil

0

contanto que você tenha espaço de troca disponível, não há necessidade de o sistema operacional liberar espaço de troca. Será liberado quando não houver mais espaço. Mas quando você entra nessa situação, definitivamente tem um problema.


0

Não há como saber se isso acabará se tornando um problema, a menos que você execute um servidor por tempo suficiente para ver se ele se torna um problema.

Basicamente, o sistema operacional irá trocar coisas que não estão sendo usadas para manter alguma memória livre o tempo todo, caso um novo programa seja iniciado. O espaço de troca não será liberado até que seja necessário, o que significa que você pode ter 100% de espaço de troca usado e sem problemas de desempenho. O que mais preocupa é se isso está sendo causado por um vazamento de memória. Não é necessariamente um vazamento de memória, mas poderia ser.

Java não é propenso a vazamentos de memória, mas pode acontecer especialmente com aplicativos complicados.

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.