Aumentando constantemente o tamanho do swap no espaço Linux e Swap não sendo recuperado?

9

Eu tenho uma caixa Linux de 8GB de RAM na qual 4 servidores tomcat estão rodando. Um deles é definido para 3000MB de memória (configuração jvm -Xms e -Xmx) e outros são configurados para 1500MB. A partição swap também está configurada para 8Gigs. Quando inicio esses servidores, o uso do arquivo de troca é baixo. Mas 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 da troca começa a aumentar. Aqui está uma saída típica do sar -r.

kbmemfree kbmemused %memused kbbuffers 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

Mostra 14,2% de swap usado atualmente. O engraçado é que% NUNCA diminui . Continua a aumentar e atinge até 30-40% . Nós reiniciámos nossos servidores semanalmente.

Eu suponho que o % swpused aumente durante períodos de pico de atividade e diminua durante períodos de baixa atividade ... Ou pelo menos permaneça constante. Parece que o espaço de troca nunca é recuperado pelo sistema operacional.

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

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

    
por Zenil 07.01.2010 / 15:42

4 respostas

12

Se as informações forem trocadas para o disco e depois lidas de volta na memória, elas geralmente ficarão alocadas na área de troca até o espaço de troca ficar 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á soltar as páginas da RAM alocada sem precisar gravar nada no disco para economizar tempo.

O swap alocado para material que foi lido de volta na memória será liberado

  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 (por isso, a cópia no disco não está mais atualizada)
  3. a máquina fica com pouco espaço de troca, portanto, limpa algumas coisas que já estão na RAM para liberar espaço

Procure em /proc/meminfo por uma 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 arquivo /proc/meminfo 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ão alocados, mas que 17232K dessas páginas também estão atualmente mapeadas na RAM também (portanto, pode ser desalocada a partir da troca a qualquer momento se o espaço for necessário por outra coisa).

Além disso, sem dúvida haverá páginas que foram trocadas há séculos e nunca mais foram usadas desde então. O kernel não irá recarregar as páginas do swap apenas porque há alguma RAM livre para ser lida de novo, já que a RAM livre pode ser melhor usada para cache ou buffers - páginas escritas para swap são geralmente relidas somente quando forem necessárias.

Se você deseja limpar o que está em swap, contanto que você tenha bastante livre e / ou livre (isto é, buffers gratuitos + cache + (menos as partes das contagens c + b que não são Freight RightThisInstant)), basta desligá-lo e ligá-lo novamente com swapoff -a && swapon -a .

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

    
por 07.01.2010 / 23:14
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 no swap não custa nada. O único custo é colocar o material na troca (página) ou retirá-lo (página fora). Por isso, é perfeitamente razoável que o sistema operacional permita que a troca cresça.

    
por 07.01.2010 / 16:27
0

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

    
por 07.01.2010 / 17:22
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 isso se torna um problema.

Basicamente o sistema operacional trará coisas que não estão sendo usadas para manter alguma memória livre o tempo todo, no caso de um novo programa ser 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 não ter problemas de desempenho. A coisa para se preocupar é se isso está sendo causado por um vazamento de memória. Não é necessariamente um vazamento de memória, mas poderia ser.

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

    
por 07.01.2010 / 17:28