Como funciona o vm.overcommit_memory?

41

Quando eu uso as configurações padrão:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Eu posso ler esses valores em /proc/meminfo file:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Mas quando eu altero vm.overcommit_memory de 0 para 2 , não consigo iniciar o mesmo conjunto de aplicativos que eu poderia iniciar antes da alteração, especialmente o amarok. Eu tive que mudar vm.overcommit_ratio para 300 , então o limite poderia ser aumentado. Agora, quando eu 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 configurá-lo como 2 , o amarok precisa alocar mais de 2GiB de memória. É um comportamento normal? Em caso afirmativo, alguém poderia explicar por que, por exemplo, o firefox (que consome 4 a 6 vezes mais memória do que o amarok) funciona da mesma maneira antes e depois da alteração?

    
por Mikhail Morfikov 18.06.2014 / 19:27

1 resposta

56

Você pode encontrar a documentação em man 5 proc ( ou no kernel.org ):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

A resposta simples é que definir a supercomprometida como 1 definirá o cenário para que, quando um programa chamar algo como malloc() para alocar um pedaço de memória ( man 3 malloc ), ele sempre será bem-sucedido, independentemente de o sistema saber não terá toda a memória que está sendo solicitada.

O conceito subjacente para entender é a idéia de memória virtual . Programas ver 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 supercomprometimento, você diz ao sistema operacional que assuma que sempre há memória física suficiente para fazer o backup do espaço virtual.

Exemplo

Para destacar por que isso às vezes importa, dê uma olhada no Redis orientações sobre o porquê vm.overcommit_memory deve ser definido como 1 para ele.

    
por 18.06.2014 / 19:49