Para onde vai a memória restante de vm.overcommit_ratio?

10

Se eu desabilitar a confirmação excessiva de memória, definindo vm.overcommit_memorycomo 2, por padrão, o sistema permitirá alocar a memória até a dimensão de troca + 50% da memória física, conforme explicado aqui .

Eu posso mudar a proporção modificando o vm.overcommit_ratioparâmetro. Digamos que eu defina para 80%, então 80% da memória física pode ser usada.

Minha pergunta é:

  • o que o sistema fará com os 20% restantes?
  • por que esse parâmetro é necessário em primeiro lugar?
  • por que nem sempre devo configurá-lo para 100%?
Dan Tumaykin
fonte

Respostas:

6

O que o sistema fará com os 20% restantes?

O kernel usará a memória física restante para seus próprios propósitos (estruturas internas, tabelas, buffers, caches, qualquer que seja). A configuração de comprometimento excessivo de memória manipula as reservas de memória virtual do aplicativo do usuário, o kernel não usa memória virtual, mas física.

Por que esse parâmetro é necessário em primeiro lugar?

O overcommit_ratioparâmetro é uma opção de implementação projetada para impedir que os aplicativos reservem mais memória virtual do que o que razoavelmente estará disponível para eles no futuro, ou seja, quando eles realmente acessarem a memória (ou pelo menos tentarem).

Definir overcommit_ratiopara 50% foi considerado um valor padrão razoável pelos desenvolvedores do kernel do Linux. Ele assume que o kernel nunca precisará usar mais de 50% da RAM física. Sua milhagem pode variar, o motivo pelo qual é ajustável.

Por que nem sempre devo configurá-lo para 100%?

Configurá-lo para 100% (ou qualquer valor "muito alto") não desabilita o comprometimento excessivo de maneira confiável, porque você não pode assumir que o kernel utilizará 0% (ou muito pouco) de RAM.

Ele não impedirá que os aplicativos travem, pois o kernel pode antecipar de qualquer maneira toda a memória física que ele exige.

jlliagre
fonte
Se o kernel pode receber toda a memória necessária, qual é o sentido de expor esse parâmetro (ou mesmo criá-lo)?
Dan Tumaykin
Existe algum documento oficial em que esses parâmetros sejam explicados em detalhes? Além do kernel.org/doc/Documentation/vm/overcommit-accounting - qualquer referência à memória do kernel está ausente.
Dan Tumaykin
1
Ainda não encontrei documentação explicando com detalhes suficientes o que é precisamente levado em consideração quando se refere a "confirmação total do espaço de endereço". O fato de o documento que você fornecer um link para os estados "na maioria das situações, significa que um processo não será morto ..." é suficiente para confirmar que alguma memória pode ser usada em outro lugar, e o consumidor óbvio dessa memória é o kernel.
jlliagre
2

Definir a proporção para 100% não reservará espaço para páginas com backup de arquivo ou alocações no kernel, como código do kernel, buffers de rede, etc.

As estruturas no kernel serão alocadas independentemente, causando supercomprometimento. Eles geralmente são limitados individualmente (por exemplo, há uma configuração para buffers de rede). Não acho que exista um limite geral de 50%, embora um limite geral seja algo que tenha sido trabalhado com o objetivo de hospedar contêineres.

As páginas com backup de arquivo são onde você normalmente executa o código do espaço do usuário, portanto, você também precisa de espaço para isso.

sourcejedi
fonte