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


37

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. Eu sei que ajusta com que intensidade o kernel tenta trocar de página, mas que processo de tomada de decisão no código do kernel isso afeta?

Ele ajusta há quanto tempo uma página deve ter sido acessada antes que o kernel a troque? Em caso afirmativo, o que o valor padrão de 60 representa? E quanto é alterado por um incremento / decremento de 1 (uma fórmula seria legal)?
Ou ele troca páginas com base na frequência de acesso?
Ou alguma outra coisa?


2
Sim, a permutação é vaga ;-) #
22412

Respostas:


27

Desde a versão 2.6.28 do kernel, o Linux usa uma estratégia de substituição de página LRU ( Split Menos Utilizadas Recentemente ). As páginas com uma fonte do sistema de arquivos, como texto do programa ou bibliotecas compartilhadas, pertencem ao cache do arquivo. As páginas sem o apoio do sistema 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. Normalmente, as páginas pertencentes ao cache de arquivos são mais baratas para serem expulsas da memória (pois elas podem ser lidas novamente a partir do disco, quando necessário) . Como as páginas anônimas não têm o apoio do sistema de arquivos, elas devem permanecer na memória enquanto forem necessárias por um programa, a menos que haja espaço de troca para armazená-las.

A vm.swappinessopção entra em jogo em get_scan_count()definido em mm/vmscan.c. get_scan_count()determina com que agressividade as listas LRU anônima e de arquivo devem ser verificadas ao procurar páginas para despejo. O valor de cada caso é determinado pela média flutuante das taxas rotacionadas recentemente e varridas recentemente, nas quais referências mais recentes têm mais peso do que as mais antigas para levar em consideração a mudança na carga de trabalho do sistema.

O vm.swappinessé um modificador que muda o equilíbrio entre a trocar 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, definido como 60 . O cache do arquivo recebe um valor de prioridade 200 do qual o vm.swappinessmodificador é 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á próximo de uma condição de falta de memória , as listas LRU anônima e de arquivo são varridas igualmente, a menos que vm.swappinessseja definido como zero.

Quando vm.swappinessdefinido como 100, as prioridades seriam iguais ( anon_prio=100, file_prio=200-100=100). Definir vm.swappinesscomo zero impedirá o kernel de remover páginas anônimas em favor de páginas do cache de arquivos.


Existe uma maneira de mudar a permuta de file_prio? Ou limitá-lo a um diretório específico?
CMCDragonkai

13

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

tendência de troca = mapped_ratio / 2 + angústia + vm_swappiness

Aqui você pode ver que a swappiness é uma escala, que é adicionada em algum algoritmo e você pode controlar por esse parâmetro como o kernel se comportará quando precisar trocar. Você pode imaginar como uma porcentagem de probabilidade que alguma página de memória inativa seja trocada. Se você definir o swappiness para 100, não há probabilidade, mas há uma garantia de que ele será trocado e se você o definir como 0, o kernel tentará não trocar, desde que tenha alguma memória vazia.


6

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

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

Porque a maioria acredita que trocar = ruim e que, se você não reduzir a troca, o sistema será trocado quando realmente não for necessário. Nenhum deles é realmente verdade. As pessoas associam a troca a momentos em que seu sistema está atolado - no entanto, é principalmente a troca porque o sistema está atolado, e não o contrário. É verdade que há certos momentos em que a troca pode ter uma penalidade perceptível, mas a redução da troca nesse caso pode reduzir o desempenho geral do sistema ou a estabilidade de outras maneiras que depois se tornarão perceptíveis…

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

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.