Devo estar preocupado que a troca está sendo usada em um host com quase 40 GB de memória livre?

39

Eu tenho um host de produção, abaixo:

O sistema está usando 1 GB de swap, mantendo quase 40 GB de espaço de memória livre e não utilizado. Eu deveria estar preocupado com isso, ou é mais normal?

    
por MrDuk 12.01.2017 / 18:04

5 respostas

68

Isso não é um problema e provavelmente é normal. Muitos códigos (e possivelmente dados) são usados muito raramente, então o sistema irá trocá-los para liberar memória.

A troca é apenas um problema se a memória estiver sendo trocada continuamente. É esse tipo de atividade que mata o desempenho e sugere um problema em outro lugar do sistema.

Se você quiser monitorar sua atividade de troca, pode usar várias utilidades, mas vmstat geralmente é bastante útil, por exemplo,

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 348256  73540 274600    0    0     1     9    9    6  2  0 98  0  0
 0  0      0 348240  73544 274620    0    0     0    16   28   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   29   33  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   21   23  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   24   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   23   23  0  0 100  0  0

Ignore a primeira linha como se fosse uma atividade desde o início do sistema. Observe as colunas si e so em ---swap-- ; eles geralmente devem ser números relativamente pequenos se não forem 0 na maioria das vezes.

Também vale a pena mencionar que esta troca preventiva pode ser controlada com uma configuração do kernel. O arquivo em /proc/sys/vm/swappiness contém um número entre 0 e 100 que informa ao kernel como trocar a memória de forma agressiva. Cat o arquivo para ver o que isso está definido. Por padrão, a maioria das distribuições Linux padroniza isso para 60, mas se você não quiser ver nenhuma troca antes que a memória se esgote, faça um eco no arquivo assim:

echo 0 >/proc/sys/vm/swappiness

Isso pode se tornar permanente adicionando

vm.swappiness = 0

para /etc/sysctl.conf .

    
por 12.01.2017 / 18:10
25

O Linux irá escrever páginas em disco, se não tiver nada melhor para fazer. Isso não significa que ele removerá essas páginas da memória. É só que no caso de precisar remover essas páginas em algum momento no futuro, não precisa esperar que elas sejam gravadas em disco, porque elas já estão lá.

Afinal, a razão pela qual você está ficando sem memória, provavelmente é porque sua máquina já está trabalhando duro, você não quer sobrecarregá-la com a troca. É melhor fazer a troca quando a máquina não está fazendo nada.

Por um motivo semelhante, sua memória deve estar sempre cheia. Páginas de memória, cache do sistema de arquivos, tmpfs , há tantas coisas que podem ser armazenadas na memória. Realmente, você deveria se preocupar se sua memória está vazia; Afinal, você pagou muito dinheiro por isso (pelo menos em comparação com a mesma quantidade de espaço em disco), então é melhor que seja usado!

    
por 13.01.2017 / 01:02
10

O swap usado não é ruim, mas muita atividade de troca é

  vmstat 1
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  6  0 521040 114564   6688 377308    8   13   639   173    0 1100  5  4 90  0
  1  0 521040 114964   6688 377448    0    0   256     0    0 1826  3  4 94  0
  0  0 521040 115956   6688 377448    0    0     0     0    0 1182  7  3 90  0
  0  0 521036 115992   6688 377448    4    0    16     0    0 1154 10  2 88  0
  3  0 521036 114628   6696 377640    0    0   928   224    0 1503 15 17 67  1

A coluna swapd não é problema. Valores diferentes de zero nas colunas si e so são fatais para o desempenho do servidor. Especialmente aqueles com muita RAM.

É melhor desativar a permutação em máquinas com vários GB de RAM:

sysctl -w vm.swappiness=0

Isso não desabilitará a troca. Ele apenas instruirá o Linux a usar o swap como última medida de recurso. Isso desperdiçará alguns MB de programas que não precisam estar na RAM ... Mas é preferível trocar o inchaço das filas de acesso ao disco.

Editar 1: porque o valor padrão de swappiness não é o ideal

Nós temos que lembrar há duas décadas que um grande 486 tinha apenas 32Mb de RAM. Os algoritmos de troca foram desenvolvidos quando toda a RAM pôde ser movida para o disco em uma pequena fração de segundo. Mesmo com os discos mais lentos da época. É por isso que as políticas de troca padrão são tão agressivas. RAM era o gargalo naqueles dias. Desde então, o tamanho da RAM aumentou mais de 10.000 vezes e a velocidade do disco foi menor que 10 vezes. Isso mudou o gargalo para a largura de banda do disco.

Editar 2: por que razão a atividade é mortal para os servidores?

Si e so a atividade em máquinas com toneladas de RAM é fatal porque significa que o sistema está lutando consigo mesmo pela RAM. O que acontece é que os discos, mesmo os grandes armazenamentos, são muito lentos quando comparados aos RAMs. A troca agressiva favorece o cache de disco do kernel sobre os dados do aplicativo e é a fonte mais comum de brigas pela RAM. Como o sistema operacional terá que liberar o cache de disco em cada si , o tempo de vida do cache extra que o swap oferece é muito baixo para ser útil de qualquer maneira. O resultado é que você está usando a largura de banda do disco para armazenar o cache que provavelmente não será usado e pausando seus programas que estão aguardando as páginas si . Significa que consome muitos recursos críticos com pouco ou nenhum benefício para os aplicativos.

Anote o título da resposta "muita atividade de troca em servidores com muita RAM". Isso não se aplica a máquinas com atividade ocasional de si e so. Isso pode não se aplicar no futuro se algoritmos de swap mais inteligentes forem desenvolvidos nos SOs.

Editar 3: páginas "frias"

As pessoas romantizam o algoritmo de troca. Alguns dizem que "são necessárias páginas menos usadas da RAM", mas isso não é o que o kernel faz. A coisa é difícil de entender sobre swap é o kernel não sabe o que é uma "página fria". O kernel não possui uma boa métrica para determinar se a página é usada ou provável de ser usada no futuro próximo. Para contornar que o kernel coloca páginas no swap mais ou menos aleatoriamente e as páginas que não são necessárias ficam lá. O problema desse algoritmo é que as páginas precisam ir para o swap para saber se elas são necessárias pelos aplicativos. E isso significa que muitas páginas "quentes" irão para o swap. O problema é que os discos são muito lentos em comparação com a RAM. A conseqüência disso é quando a troca inicia todos os aplicativos recebem pausas aleatórias aguardando os discos e isso atrasa a latência e a taxa de transferência.

Eu construí meu próprio benchmark que é um cenário realista muito comum a muitas aplicações com um volume decente. Dos meus testes, não vi nenhum benefício em taxa de transferência ou latência quando os swaps estão em uso. Longe disso. Quando a troca inicia, ela diminui a taxa de transferência e a latência em pelo menos uma ordem de magnitude.

Eu vou um pouco mais sobre isso: eu entendo swap não é para processamento. Swaps são apenas para emergências. Aqueles momentos em que muitos aplicativos estão sendo executados ao mesmo tempo e você recebe um pico de memória. Sem swap isso causaria erros de falta de memória. Eu considero o uso de swap uma falha das equipes de desenvolvimento e produção. Esta é apenas uma opinião que vai muito além do que discutimos aqui, mas é o que eu penso. É claro que meus aplicativos têm excelente gerenciamento de memória sozinhos.

    
por 12.01.2017 / 20:27
8

Esta não é uma resposta para sua pergunta; mas apenas informações extras para ajudá-lo a tomar uma decisão informada.

Se você gostaria de saber quais processos especificamente estão usando o quanto de swap, aqui está um pequeno script de shell:

#!/bin/bash

set -o posix
set -u

OVERALL=0
for DIR in 'find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"' ; do
  PID='echo $DIR | cut -d / -f 3'
  PROGNAME='ps -p $PID -o comm --no-headers'

  SUM=0
  for SWAP in 'grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'' ; do
    let SUM=$SUM+$SWAP
  done
  echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"

  let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"

Devo também acrescentar que o tmpfs também será trocado. Isso é mais comum em sistemas Linux modernos usando o systemd que cria sobreposições de espaço de usuário / tmp usando tmpfs.

    
por 12.01.2017 / 19:09
-1

Eu notei que a replicação do MySQL Cluster diminui ou falha quando os agentes estão trocando muito. Talvez alguns aplicativos não se importem ou talvez até se beneficiem de alguma troca, mas os bancos de dados realmente parecem sofrer com isso. No entanto, muitas discussões que tenho visto nos fóruns discutem a troca descontextualizada da discussão específica da carga de trabalho.

No mundo DBA, o consenso parece ser que "É senso comum que quando você está executando o MySQL (ou qualquer outro SGBD) você não quer ver nenhuma E / S no seu espaço de troca. Escalando o cache tamanho (usando innodb_buffer_pool_size no caso do MySQL) é uma prática padrão para garantir que haja memória livre suficiente para que a troca não seja necessária.

Mas e se você cometer algum engano ou erro de cálculo e a troca acontecer? Quanto isso realmente afeta o desempenho? Isso é exatamente o que eu me propus a investigar. "

Espero que os leitores encontrem os links a seguir.

link

link

    
por 24.03.2017 / 16:13