Estou fazendo alguns experimentos com VM e KVM. Estou tentando perceber o fato do supercomprometimento e do espaço de troca. A princípio, deixe-me mostrar a configuração do sistema e a configuração associada que fiz para este experimento.
Meu sistema de computador host tem:
- Memória (DRAM): 16 GB
- swapspace (partição de troca): 32 GB
- SSD: 512GB
e minha VM tem:
- Memória: 4 GB
- swapspace (partição de troca): 8 GB
- 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ção ocorre supercomprometimento . Então tentei resolver isso pelo wap-space e verifiquei através do vmstat se funcionou ou não. Parece que não usa espaço de troca como memória.
Por que minha VM não usou o espaço de troca durante a situação de supercompromisso?
Acho que a parte que está faltando é o que significa "excesso de comprometimento".
O excesso de comprometimento não é um truque para realmente ter mais recursos do que aqueles que você restringiu o sistema a ter. É 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 realmente usam uma página de memória para isso. Mas ainda havia 32K alocados. Note que este exemplo é dos anos 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á cobrado.
Se não me engano, isso acontece até em alguns programas que não fazem isso conscientemente, porque eles carregam bibliotecas que fazem isso, e mesmo carregando essas bibliotecas faz isso - o linker aloca memória suficiente para a biblioteca, mas apenas as rotinas que são realmente invocados são realmente carregados. Isso provavelmente será memória compartilhada, de modo que o efeito seja minimizado, mas ainda está lá.
A quantidade de compromisso excessivo que acontece é baseada muito nos programas invocados e como eles são usados. Se um programa for exercitado completamente, provavelmente usará mais algumas de suas bibliotecas. Programas que chamam calloc ao invés de malloc não parecem comprometer tanto, porque calloc escreve em cada byte do espaço alocado, exigindo que o sistema operacional cumpra o compromisso solicitado, mesmo que a parte real dessa memória que será usada será muito menor. Alguns programas são muito mais cuidadosos em alocar apenas a quantidade exata de memória de que precisam, enquanto outros dependem do sistema operacional para suportar supercomprometimento para 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 GB completo de páginas, ele usará a troca de 8 GB que você configurou para poder usar. Mas não usa isso para supercomprometimento. Tecnicamente, ele não usa excesso de comprometimento até que esteja alocando além dos 9 GB de VM que realmente possui.
Dito isto, este é o Linux, e minha lembrança de tentar empurrar o Linux para a alocação máxima de memória sem habilitar o supercomprometimento é que ele tende a falhar um pouco cedo - ele manteve alguma reserva para várias coisas, como uma pequena quantidade de cache de arquivo e outras coisas . Essa experiência foi há mais de uma década, mas não vejo motivo para que isso mude; ter memória para poder fazer E/S de arquivo é importante.