Header Ads

O que é Swappiness no Linux?(e como alterá-lo)

O valor de swappiness do Linux não tem nada a ver com a quantidade de RAM usada antes do início da troca. Esse é um erro amplamente divulgado e amplamente aceito.Nós explicamos o que realmente é.

Mitos rebentadores sobre a troca

Trocaé uma técnica em que os dados na RAM são gravados em um local especial no disco rígido - uma partição de troca ou um arquivo de troca - para liberar RAM.

O Linux possuiuma configuração chamada valor de troca.Há muita confusão sobre o que essa configuração controla.A descrição incorreta mais comum do swappiness é que ele define um limite para o uso da RAM e, quando a quantidade de RAM usada atinge esse limite, a troca é iniciada.

Esse é um equívoco repetido com tanta frequência queagora é recebido sabedoria. Se (quase) todo mundo diz a você que é exatamente assim que a swappiness funciona, por que você deveria acreditar em nós quando dizemos que não é t?

Simples.Nós vamos provar isso.

Sua memória RAM é dividida em zonas

O Linux não pensa em sua memória RAM como um grande conjunto homogêneo de memória. Considera que está dividido em várias regiões diferentes chamadas zonas. Quais zonas estão presentes no seu computador depende se é de 32 ou 64 bits. Aqui está uma descrição simplificada das possíveis zonas em um computador com arquitetura x86.

  • Acesso direto à memória (DMA): esse é o baixo nível de 16 MB de memória.A região recebe esse nome porque, há muito tempo, havia computadores que só podiam acessar diretamente a memória nessa área da memória física.
  • Acesso direto à memória 32: apesar do nome, Acesso direto à memória 32 (DMA32) é uma zona encontrada apenas no Linux de 64 bits.São os baixos 4 GB de memória.O Linux em execução em computadores de 32 bits só pode fazer DMA com essa quantidade de RAM (a menos que esteja usando o kernel da extensão de endereço físico (PAE)), que é como a região recebeu esse nome. Embora em computadores de 32 bits, ele seja chamado HighMem.
  • Normal: em computadores de 64 bits, a memória normal é toda a RAM acima de 4 GB (aproximadamente). Em máquinas de 32 bits, é RAM entre 16 MB e 896 MB.
  • HighMem: Isso existe apenas em computadores Linux de 32 bits.É toda RAM acima de 896 MB, incluindo RAM acima de 4 GB em máquinas suficientemente grandes.

O valor PAGESIZE

A RAM é alocada em páginas com um valor fixoTamanho. Esse tamanho é determinado pelo kernel no momento da inicialização, detectando a arquitetura do computador. Normalmente, o tamanho da página em um computador Linux é de 4 Kbytes.

Você pode ver o tamanho da página usando o comando getconf:

 getconf PAGESIZE 

As zonas são anexadas aos nós

As zonas são anexadas aos nós. Os nós estão associados a uma CPU (Central Processing Unit).O kernel tentará alocar memória para um processo em execução em uma CPU a partir do nó associado a essa CPU.

O conceito de nós vinculados às CPUs permite que tipos de memória mista sejam instalados em computadores especializados com várias CPUs, usando a arquitetura Non-Uniform Memory Access.

Isso é tudo muito sofisticado.O computador Linux médio terá um único nó, chamado nó zero. Todas as zonas pertencerão a esse nó. Para ver os nós e as zonas do seu computador, olhe dentro do arquivo / proc / buddyinfo. Usaremos menos para fazer isso:

 menos / proc / buddyinfo 

Essa é a saída do 64-bitcomputador em que este artigo foi pesquisado:

 Nó 0, zona DMA 1 1 1 0 2 1 1 0 1 1 3 Nó 0, zona DMA32 2 67 58 19 8 3 3 1 1 1 17 

Existe um único nó, nó zero. Este computador possui apenas 2 GB de RAM; portanto, não há "Normal";zona. Existem apenas duas zonas, DMA e DMA32.

Cada coluna representa o número de páginas disponíveis de um determinado tamanho. Por exemplo, para a zona DMA32, lendo da esquerda:

  • 2: existem 2 de 2 ^ (0 * PAGESIZE) pedaços de memória.
  • 67: Hásão 67 de 2 ^ (1 * PAGE_SIZE) blocos de memória.
  • 58: Existem 58 de 2 ^ (2 * PAGESIZE) blocos de memória disponíveis.
  • E assim por diante,até & # 8230;
  • 17: existem 17 de 2 ^ (512 * PAGESIZE) pedaços.

Mas, na verdade, a única razão pela qual &’ analisar essas informações é ver a relação entre nós e zonas.

Páginas de arquivo e páginas anônimas

O mapeamento de memória usa conjuntos de entradas da tabela de páginas para registrar quais páginas de memória são usadas e para quê.

Os mapeamentos de memória podem ser:

  • Arquivo com backup: Arquivo com backupmapeamentos contêm dados que foram lidos de um arquivo. Pode ser qualquer tipo de arquivo.O importante a ser observado é que, se o sistema liberou essa memória e precisou obter esses dados novamente, eles podem ser lidos no arquivo mais uma vez. Mas, se os dados foram alterados na memória, essas alterações precisarão ser gravadas no arquivo no disco rígido antes que a memória possa ser liberada. Se isso não acontecesse, as alterações seriam perdidas.
  • Anônima: a memória anônima é um mapeamento de memória sem nenhum arquivo ou dispositivo que a apóie. Essas páginas podem conter memória solicitada on-the-fly por programas para armazenar dados ou para coisas como a pilha e a pilha. Como não há arquivo por trás desse tipo de dados, um local especial deve ser reservado para o armazenamento de dados anônimos. Esse lugar é a partição swap ou o arquivo swap. Os dados anônimos são gravados para serem trocados antes da liberação das páginas anônimas.
  • Suporte de dispositivo: os dispositivos são endereçados por meio de arquivos de dispositivo de bloco que podem ser tratados como se fossem arquivos. Os dados podem ser lidos e gravados neles. Um mapeamento de memória suportado por dispositivo possui dados de um dispositivo armazenado.
  • Compartilhado: várias entradas da tabela de páginas podem ser mapeadas para a mesma página da RAM.O acesso aos locais de memória através de qualquer um dos mapeamentos mostrará os mesmos dados. Diferentes processos podem se comunicar de maneira muito eficiente, alterando os dados nesses locais de memória observados em conjunto. Os mapeamentos graváveis ​​compartilhados são um meio comum de obter comunicações entre processos de alto desempenho.
  • Copiar na gravação: a cópia na gravação é uma técnica de alocação lenta. Se uma cópia de um recurso já existente na memória for solicitada, a solicitação será atendida retornando um mapeamento para o recurso original. Se um dos processos 'compartilha' ”o recurso tenta gravar nele, o recurso deve ser verdadeiramente replicado na memória para permitir que as alterações sejam feitas na nova cópia. Portanto, a alocação de memória ocorre apenas no primeiro comando de gravação.

Para troca, precisamos nos preocupar apenas com os dois primeiros da lista: páginas de arquivos e páginas anônimas.

Swappiness

Aqui está a descrição de swappiness da documentação do Linux no GitHub:

"Este controle é usado para definir o quão agressivo (sic) o kernel irá trocarvalores mais altos aumentam a agressividade, valores mais baixos diminuem a quantidade de troca. Um valor 0 instrui o kernel a não iniciar a troca até que a quantidade de páginas livres e com backup de arquivo seja menor que a marca d'água alta em uma zona.

O valor padrão é 60. "

Parece que a troca muda de intensidade para cima ou para baixo. Curiosamente, ele afirma que configurar o swappiness como zero não desativa o swap. Ele instrui o kernel a não trocar até que certas condições sejam atendidas. Mas a troca ainda pode ocorrer.

Vamos aprofundar. Aqui está a definição e o valor padrão de vm_swappiness no arquivo de código-fonte do kernel vmscan.c:

/ * * De 0 a 100. Maior significa mais swappy.* / int vm_swappiness = 60;

O valor da troca pode variar de 0 a 100. Novamente, o comentário certamente soa como se o valor da troca tivesse relação com a quantidade de trocas ocorridas, com um número maior levando amais troca.

Mais adiante, no arquivo de código-fonte, podemos ver que uma nova variável chamada swappiness recebe um valor retornado pela função mem_cgroup_swappiness (). Um pouco mais de rastreamento no código fonte mostrará que o valor retornado por esta função é vm_swappiness. Portanto, agora, a variável swappiness está definida como igual a qualquer valor vm_swappiness foi definido.

int swappiness = mem_cgroup_swappiness (memcg);

E um pouco mais abaixo no mesmo arquivo de código-fonte, vemos o seguinte:

/ * * Com swappiness em 100, anônimo e arquivo têm a mesma prioridade.* Essa prioridade de digitalização é essencialmente o inverso do custo de IO.* / anon_prio = swappiness;file_prio = 200 - anon_prio;

Isso é interessante. Dois valores distintos são derivados do swappiness. As variáveis ​​anon_prio e file_prio mantêm esses valores.À medida que um aumenta, o outro diminui e vice-versa.

O valor de swappiness do Linux realmente define a proporção entre dois valores.

A proporção áurea

As páginas de arquivos contêm dados que podem ser recuperados facilmente se a memória for liberada.O Linux pode apenas ler o arquivo novamente. Como vimos, se os dados do arquivo foram alterados na RAM, essas alterações devem ser gravadas no arquivo antes que a página do arquivo possa ser liberada. Mas, de qualquer maneira, a página do arquivo na RAM pode ser preenchida novamente pela leitura de dados do arquivo. Então, por que se preocupar em adicionar essas páginas à partição swap ou ao arquivo swap?Se você precisar desses dados novamente, é melhor lê-los novamente do arquivo original, em vez de uma cópia redundante no espaço de troca. Portanto, as páginas dos arquivos não são armazenadas no swap. Eles estão "armazenados" ”de volta ao arquivo original.

Com páginas anônimas, não há arquivo subjacente associado aos valores na memória. Os valores nessas páginas foram alcançados dinamicamente. Você não pode simplesmente lê-los novamente de um arquivo.A única maneira de recuperar valores anônimos de memória de página é armazenar os dados em algum lugar antes de liberar a memória.E é isso que a troca mantém.Páginas anônimas às quais você precisará fazer referência novamente.

Mas observe que, tanto para páginas de arquivo quanto para páginas anônimas, liberar a memória pode exigir uma gravação no disco rígido. Se os dados da página do arquivo ou anônimo tiverem sido alterados desde a última gravação no arquivo ou na troca, será necessária uma gravação no sistema de arquivos. Para recuperar os dados, será necessária uma leitura do sistema de arquivos. Ambos os tipos de recuperação de página são caros. Tentar reduzir a entrada e a saída do disco rígido, minimizando a troca de páginas anônimas, apenas aumenta a quantidade de entrada e saída do disco rígido necessária para lidar com as páginas de arquivos gravadas e lidas nos arquivos.

Como você pode ver no último trecho de código, há duas variáveis. Um chamado file_prio para prioridade do arquivo e outro chamado anon_prio para prioridade anônima.

  • A variável anon_prio está definida como o valor de swappiness do Linux.
  • O valor file_prio é definido como 200 menos o valor anon_prio.

Essas variáveis ​​mantêm valores que funcionam em conjunto. Se ambos estiverem configurados para 100, serão iguais. Para quaisquer outros valores, o anon_prio diminuirá de 100 para 0 e o file_prio aumentará de 100 para 200. Os dois valores alimentam um algoritmo complicado que determina se o kernel Linux é executado com uma preferência por recuperar (liberar) páginas de arquivos ou anônimos.páginas.

Você pode pensar em file_prio como a disposição do sistema para liberar páginas de arquivos e anon_prio como a vontade do sistema em liberar páginas anônimas.O que esses valores não fazem é definir qualquer tipo de gatilho ou limite para quando o swap será usado. Isso foi decidido em outro lugar.

Mas, quando a memória precisa ser liberada, essas duas variáveis ​​e a razão entre elas são levadas em consideração pelos algoritmos de recuperação e troca para determinarquais tipos de página são preferencialmente considerados para liberação.E isso determina se a atividade de disco rígido associada processará arquivos para páginas de arquivos ou trocará espaço por páginas anônimas.

Quando o Swap realmente entra em ação?

Estabelecemos que o valor de swappiness do Linux define uma preferência pelo tipo de páginas de memória que serão varridas para possível recuperação. Tudo bem, mas algo deve decidir quando a troca será interrompida.

Cada zona de memória tem uma marca d'água alta e uma marca d'água baixa. Estes são valores derivados do sistema.São porcentagens da RAM em cada zona.São esses valores que são usados ​​como limites do gatilho de troca.

Para verificar quais são suas marcas d'água alta e baixa, consulte o arquivo / proc / zoneinfo com este comando:

 menos / proc / zoneinfo 

Cada uma das zonas terá um conjunto de valores de memória medidos em páginas. Aqui estão os valores para a zona DMA32 na máquina de teste.A marca d'água baixa é 13966 páginas e a marca d'água alta é 16759 páginas:

  • Em condições normais de execução, quando a memória livre em uma zona cai abaixo da zona e&’ marca d'água baixa, o algoritmo de troca começa a varrer as páginas de memória procurando por memória que possa recuperar, levando em consideração os valores relativos de anon_prio e file_prio.
  • Se o valor de swappiness do Linux estiver definido como zero, a troca ocorre quando o valor combinado das páginas dos arquivos e das páginas livres é menor que a marca d'água máxima.

Portanto, você pode ver que não pode usar o valor de swap do Linux para influenciar o comportamento do swap em relação ao uso de RAM. Simplesmente não funciona assim.

O que deve ser definido para a troca?

Depende do hardware, carga de trabalho, tipo de disco rígido e se o seu computador é uma área de trabalho ou um servidor. Obviamente, este não será um tamanho único para todos os tipos de configurações.

E você deve ter em mente que a troca não é usada apenas como um mecanismo para liberar memória RAMquando você está ficando sem espaço na memória.A troca é uma parte importante de um sistema que funciona bem e, sem ela, o gerenciamento de memória sã se torna muito difícil de ser alcançado pelo Linux.

A alteração do valor da troca do Linux tem um efeito instantâneo;você não precisa reiniciar. Assim, você pode fazer pequenos ajustes e monitorar os efeitos. Idealmente, você faria isso durante um período de dias, com diferentes tipos de atividades no computador, para tentar encontrar o mais próximo possível de uma configuração ideal.

Esses são alguns pontos a serem observadosconsidere:

  • Tentando “ desativar swap ”definindo o valor de swappiness do Linux como zero, simplesmente muda a atividade do disco rígido associado à troca para atividade de disco rígido associado ao arquivo.
  • Se você possui discos rígidos mecânicos antigos, tente reduzir o valor de swappiness do Linux paradesviar-se da recuperação de páginas anônimas e reduzir a rotatividade da partição de troca. Obviamente, quando você abaixa uma configuração, a outra aumenta.A redução da rotatividade de swap provavelmente aumentará a rotatividade do sistema de arquivos. Mas o seu computador pode estar mais feliz, preferindo um método ao outro. Realmente, a única maneira de saber com certeza é tentar ver.
  • Para servidores de uso único, como servidores de banco de dados, você pode obter orientação dos fornecedores do software de banco de dados. Freqüentemente, esses aplicativos têm suas próprias rotinas de cache de arquivos e gerenciamento de memória projetadas para fins específicos, nas quais é melhor confiar. Os fornecedores de software podem sugerir um valor de troca do Linux de acordo com a especificação da máquina e a carga de trabalho.
  • Para o usuário médio de desktop com hardware razoavelmente recente?Deixe como está.

Como definir o valor de swappiness do Linux

Antes de alterar seu valor de swappiness, você precisa saber qual é o seu valor atual. Se você quiser reduzi-lo um pouco, a questão é um pouco menor do que o que?Você pode descobrir com este comando:

 cat / proc / sys / vm / swappiness 

Para configurar o valor de swappiness, use oComando sysctl:

 sudo sysctl vm. swappiness = 45 

O novo valor é usado imediatamente, nenhuma reinicialização é necessária.

De fato, se você reiniciar, o valor de swappiness retornará ao valor padrão de 60. Quando você terminar de experimentar e decidir o novo valor que deseja usar, poderá torná-lo persistente nas reinicializações,adicionando-o ao arquivo /etc/sysctl. conf. Você pode usar o editor que preferir. Use o seguinte comando para editar o arquivo com o nano editor:

 sudo nano /etc/sysctl. conf[/PREunette

Quando o nano for aberto,role até a parte inferior do arquivo e adicione esta linha. Estamos usando 35 como o valor de permuta permanente. Você deve substituir o valor que deseja usar.

 vm. swappiness = 35 

Para salvar suas alterações e sair do nano, pressione"Ctrl + O", pressione "Enter" e pressione "Ctrl + Z".

O gerenciamento de memória é complexo

O gerenciamento de memória é complicado.E é por isso que, para o usuário médio, geralmente é melhor deixar para o kernel.

É fácil pensar que você está usando mais memória RAM do que vocêsão. Utilitários como top e grátis podem dar a impressão errada.O Linux usará RAM livre para uma variedade de propósitos próprios, como cache de disco. Isso eleva artificialmente o “ usado ”figura de memória e reduz os “ livres ”figura de memória. De fato, a RAM usada como cache de disco é sinalizada como ambas "usadas" ”e “ disponível ”porque pode ser recuperada a qualquer momento, muito rapidamente.

Para os não iniciados, que podem parecer trocas, não está funcionando, ou que o valor da troca precisa ser alterado.

sempre, o diabo está nos detalhes. Ou, nesse caso, o daemon.O daemon de troca do kernel.

Via: How to Geek

Veja Também:

Nenhum comentário