swapoff falha quando overcommit_memory == 2

6

Desativei a supercomprometimento de memória definindo overcommit_memory=2 . Agora, quando tentei swapoff , recebi este erro:

swapoff: /dev/sda5: swapoff failed: Cannot allocate memory

Mas na verdade eu tenho 0 MiB em swap e muita memória livre! Tentei definir overcommit_ratio para 100, mas isso não mudou nada.

Se eu definir temporariamente overcommit_memory=0 como padrão, posso swapoff e, em seguida, desabilitá-lo novamente.

Por que esse comportamento estranho? É um bug?

EDITAR conforme solicitado nos comentários:

$ grep -E '^Mem|Commit' /proc/meminfo
MemTotal:        2044420 kB
MemFree:          751836 kB
CommitLimit:     4122112 kB
Committed_AS:    2752544 kB
    
por Ruslan 05.09.2013 / 11:14

2 respostas

8

Como apontado @Mat, Committed_AS > MemTotal Em outras palavras, você já alocou mais memória do que fisicamente, então, se você desabilitar a troca, você já estaria super comprometido. Assim, quando você não permitir over-commit, você não poderá desabilitar o swap até liberar alguma memória.

Nem toda a memória alocada é realmente usada , e é por isso que você ainda tem alguma memória livre, apesar de ter alocado muito.

    
por 05.09.2013 / 16:37
5

Essa é uma confusão muito comum. Existem várias noções que são apenas vagamente relacionadas.

  • Uso de memória física
  • Uso da área de troca
  • Reserva de memória virtual
  • Alocação de memória virtual

Quando um processo aloca memória (malloc ou similar), o que ele faz é realmente reservar memória. Por padrão, o Linux supercomprime a memória virtual, por isso não se preocupa muito com a reserva e geralmente retorna com sucesso.

Quando você acessa a memória reservada pela primeira vez, essa memória precisa ser armazenada por páginas localizadas na RAM ou no disco.

Se não houver RAM suficiente para armazenar toda a memória virtual acessada na RAM, o sistema começará a paginar (o que normalmente é chamado de troca) e a performance parará.

Se os processos reservarem mais memória do que a soma da área de troca e (parte da) RAM, e seu sistema estiver configurado para não comprometer a memória, a alocação falhará. Isso pode acontecer mesmo quando você tiver bastante RAM livre e não estiver usando nenhuma página na área de troca. Esse é o preço a pagar para ter um sistema que não mate aplicativos aleatoriamente.

No seu caso, você tem memória virtual livre suficiente, mas uma parte dela é reservada, portanto, exija que a área de swap esteja presente, o que significa que você não pode remover a última.

    
por 05.09.2013 / 17:32

Tags