Quando uso as configurações padrão:
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
Eu posso ler esses valores do /proc/meminfo
arquivo:
CommitLimit: 2609604 kB
Committed_AS: 1579976 kB
Mas quando mudo vm.overcommit_memory
de 0
para 2
, não consigo iniciar o mesmo conjunto de aplicativos que poderia iniciar antes da alteração, especialmente o amarok. Eu tive que mudar vm.overcommit_ratio
para 300
, para que o limite pudesse ser aumentado. Agora quando inicio o amarok, /proc/meminfo
mostra o seguinte:
CommitLimit: 5171884 kB
Committed_AS: 3929668 kB
Esta máquina tem apenas 1GiB de RAM, mas o amarok funciona sem problemas quando vm.overcommit_memory
está definido como 0. Mas no caso de defini-lo como 2
, o amarok precisa alocar mais de 2GiB de memória. É um comportamento normal? Se sim, alguém poderia explicar por que, por exemplo, o firefox (que consome 4-6x mais memória que o amarok) funciona da mesma forma antes e depois da mudança?
Você pode encontrar a documentação em
man 5 proc
( ou em kernel.org ):A resposta simples é que definir overcommit para 1 irá definir o estágio para que quando um programa chamar algo como
malloc()
alocar um pedaço de memória (man 3 malloc
), ele sempre terá sucesso, independentemente de o sistema saber que não terá toda a memória que está sendo pediu.O conceito subjacente a entender é a ideia de memória virtual . Os programas veem um espaço de endereço virtual que pode ou não ser mapeado para a memória física real. Ao desabilitar a verificação de overcommit, você diz ao sistema operacional para apenas assumir que sempre há memória física suficiente para fazer backup do espaço virtual.
Exemplo
Para destacar por que isso às vezes pode ser importante, dê uma olhada nas orientações do Redis sobre por que
vm.overcommit_memory
deve ser definido como 1 para isso.Esta é uma pergunta antiga com uma resposta bem estabelecida, mas acho que há mais a acrescentar.
Em primeiro lugar, quando
vm.overcommit_memory = 0
, ovm.overcommit_ratio
valor é irrelevante. O kernel usará um algoritmo heurístico para sobrecarregar a memória, para que seuamarok
processo possa receber mais memória do que a disponível.Quando você define
vm.overcommit_memory
como2
, ovm.overcommit_ratio
valor se torna relevante. Por padrão, esse valor é definido como50
, o que significa que o sistema alocaria apenas até 50% de sua RAM (mais swap). Isso explica por que você não consegue iniciar programas que estavam bem quandovm.overcommit_memory = 0
- porque há menos de 500 MB de memória alocável (supondo que não haja troca).Ao configurá-lo para
300
, você está permitindo que o sistema aloque até 300% de sua RAM (mais swap, se houver), e é por isso que oCommitLimit
valor em/proc/meminfo
é tão alto.Embora
vm.overcommit_memory = 2
geralmente seja usado para evitar o comprometimento excessivo, aqui você o está usando para limitar o valor que pode ser comprometido demais. Defini-lo como300
é perigoso, pois seu sistema não tem5171884 kB
memória e, portanto, dependendo de quanto espaço de troca você possui, o sistema usará swap (que é lento) ou ficará sem memória.Quanto ao por que
amarok
usa mais memória quandovm.overcommit_memory = 2
- isso provavelmenteamarok
funciona melhor com mais memória, mas também funciona com menos. Então a lógica do programa pode tentar alocar 2GB de memória inicialmente, mas se falhar, tente 1GB.