Posso fazer com que a máquina virtual use o espaço de troca (arquivo de troca) como memória ao sobrecarregar?

Posso fazer com que a máquina virtual use o espaço de troca (arquivo de troca) como memória ao sobrecarregar?

Estou fazendo alguns experimentos com VM e KVM. Estou tentando perceber o fato do comprometimento excessivo e do espaço de troca. Primeiramente, deixe-me mostrar a configuração do sistema e a configuração associada que fiz para este experimento.

Meu sistema de computador host tem:

  1. Memória (DRAM): 16GB
  2. espaço de troca (partição de troca): 32 GB
  3. SSD: 512 GB

e minha VM tem:

  1. Memória: 4 GB
  2. espaço de troca (partição de troca): 8 GB
  3. Capacidade do disco virtual: 20 GB

Se eu limitar o recurso de memória da VM de 4 GB para 1 GB pela interface cgroup. Nesta situaçãocomprometimento excessivoocorre. Então tentei resolver issoespaço wape verificado atravésvmstatse funcionou ou não. Parece que não usa espaço de troca como memória.

Por que minha VM não usou espaço de troca durante uma situação de supercomprometimento?

Responder1

Acho que a parte que está faltando é o que significa "excesso de comprometimento".

O comprometimento excessivo não é um truque para realmente ter mais recursos do que aqueles que você restringiu o sistema. É uma técnica para agir como se houvesse mais recursos.

O conceito básico é que a maioria dos programas alocará mais memória do que realmente usa. Por exemplo, eles podem alocar 32 K de RAM para ler um arquivo de apenas 57 bytes. Eles lêem e usam uma página de memória para isso. Mas ainda havia 32K alocados. Observe que este exemplo é da década de 90 e hoje a alocação é maior e o arquivo maior, mas a questão é que a memória extra ainda é um compromisso que nunca será coletado.

Se não me engano, isso acontece até em alguns programas que não fazem isso conscientemente, porque carregam bibliotecas que fazem isso, e até carregar essas bibliotecas faz isso - o vinculador aloca memória suficiente para a biblioteca, mas apenas para as rotinas que são realmente invocados são realmente carregados. Provavelmente será memória compartilhada, então esse efeito é minimizado, mas ainda está lá.

A quantidade de comprometimento excessivo que ocorre depende muito dos programas invocados e de como eles são usados. Se um programa for exercitado de forma muito completa, provavelmente usará mais algumas de suas bibliotecas. Programas que chamam calloc em vez de malloc não aparecem com comprometimento excessivo, pois calloc grava em cada byte do espaço alocado, exigindo que o SO cumpra o comprometimento solicitado, mesmo que a porção real dessa memória que será utilizada será muito menor. Alguns programas são muito mais cuidadosos para alocar apenas a quantidade exata de memória necessária, enquanto outros dependem do sistema operacional para suportar comprometimento excessivo e permitir que sejam pragmáticos em seus arranjos de estrutura de dados.

Se os aplicativos em seu servidor que você limitou a usar 1 GB realmente conseguirem acessar um total de GB de páginas, ele usará a troca de 8 GB que você configurou para poder usar. Mas não usa isso para excesso de comprometimento. Tecnicamente, ele não usa comprometimento excessivo até alocar além dos 9 GB de VM que realmente possui.

Dito isto, este é o Linux, e minha lembrança de tentar levar o Linux à alocação máxima de memória sem permitir o comprometimento excessivo é que ele tende a falhar um pouco mais cedo - manteve alguma reserva para várias coisas, como uma pequena quantidade de cache de arquivos e outras coisas . Essa experiência ocorreu há mais de uma década, mas não vejo razão para que isso mude; ter memória para poder fazer E/S de arquivos é importante.

informação relacionada