O que o parâmetro vm.swappiness realmente controla?

32

De acordo com a documentação do kernel:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

No entanto, isso é meio vago. Estou tentando descobrir exatamente o que o parâmetro controla no final das contas. Eu sei que ajusta o quão agressivamente o kernel tenta trocar as páginas, mas qual processo de tomada de decisão no código do kernel isso afeta?

Ajusta há quanto tempo uma página deve ter sido acessada antes que o kernel a exclua? Em caso afirmativo, qual é o valor padrão de 60? E quanto é alterado por um incremento / decremento de 1 (uma fórmula seria boa)?
Ou troca páginas com base em sua frequência de acesso?
Ou algo mais?

    
por Patrick 22.02.2012 / 02:42

3 respostas

24

Desde a versão 2.6.28 do kernel, o Linux usa uma página Split menos usado recentemente (LRU) estratégia de substituição. Páginas com uma origem de sistema de arquivos, como texto de programa ou bibliotecas compartilhadas, pertencem ao cache de arquivos. Páginas sem suporte a sistemas de arquivos são chamadas de páginas anônimas e consistem em dados de tempo de execução como o espaço de pilha reservado para aplicativos etc. Geralmente, as páginas pertencentes ao cache de arquivos são mais baratas para serem removidas da memória (pois podem ser lidas do disco quando necessário) . Como as páginas anônimas não têm backup do sistema de arquivos, elas devem permanecer na memória, desde que sejam necessárias por um programa, a menos que haja espaço de troca para armazená-las.

A vm.swappiness < A / a> opção entra em jogo em get_scan_count() definido em mm/vmscan.c . get_scan_count() determina com que intensidade as listas de LRU anônimas e de arquivos devem ser verificadas ao procurar por páginas a serem despejadas. O valor de cada caso é determinado pela média flutuante dos índices recentemente rotacionados e recentemente escaneados, onde as referências mais recentes têm mais peso do que as mais antigas, a fim de levar em conta a carga de trabalho em mudança do sistema.

O vm.swappiness é um modificador que altera o equilíbrio entre a troca de páginas de cache de arquivos em favor de páginas anônimas. vm.swappiness é o valor de prioridade dado às páginas anônimas, Por padrão, configurado para 60 . O cache de arquivos recebe um valor de prioridade de 200, do qual o modificador vm.swappiness é deduzido ( file_prio=200-anon_prio ). Isso significa que, por padrão, os pesos de prioridade são moderadamente a favor de páginas anônimas ( anon_prio=60 , file_prio=200-60=140 ). No entanto, quando o sistema está perto de um condição de falta de memória , as listas LRU anônimas e de arquivo são verificadas igualmente, a menos que vm.swappiness seja definido como zero.

Quando vm.swappiness é definido como 100, as prioridades seriam iguais ( anon_prio=100 , file_prio=200-100=100 ). Configurar vm.swappiness para zero impedirá que o kernel elimine páginas anônimas em favor de páginas do cache de arquivos.

    
por 12.09.2013 / 08:07
12

Existe uma fórmula que é usada para calcular qual página será trocada. Em vmscan.c você pode ver esse algoritmo:

swap tendency = mapped_ratio / 2 + distress + vm_swappiness

Aqui você pode ver que o swappiness é uma escala, que é adicionada em algum algoritmo e você pode controlar por este parâmetro como o kernel irá se comportar quando ele precisar ser trocado. Você pode descobrir como uma porcentagem de probabilidade, que alguma página de memória inativa será trocada. Se você definir swappiness para 100, não há probabilidade, mas uma garantia de que ele irá trocar e se você configurá-lo para 0, o kernel tentará não trocar nada enquanto tiver alguma memória vazia.

    
por 22.02.2012 / 08:25
6

Foi dito (acho Norman 1986) que muitas vezes o botão "FECHAR PORTA" em um elevador está quebrado ou nunca foi conectado a nada em primeiro lugar. Isso faz com que o controle de ersatz não seja uma maneira de manipular o elevador, mas de pacificar o ciclista apressado.

De maneira semelhante, o swappiness tem um efeito não relacionado ao seu controle determinístico e bem definido de um predicado de kernel. Como foi observado por @neon_overlord em askubuntu.com

Because most believe that swapping = bad and that if you don't reduce swappiness, the system will swap when it really doesn't need to. Neither of those are really true. People associate swapping with times where their system is getting bogged down - however, it's mostly swapping because the system is getting bogged down, not the other way around. It's true that there are certain times when swapping can have a noticeable penalty, but reducing swappiness for that case can reduce overall system performance or stability in other ways which may later become noticeable…

Então o que realmente controla ? Uma resposta válida - além das ótimas respostas já fornecidas - é que ela modifica sua expectativa de que você tem mais controle sobre seu sistema e que girar um botão permitirá que você exerça esse controle de maneira significativa.

    
por 28.09.2013 / 14:24