Fora do Swap - O que acontece?

6

Na minha máquina debian VM com 512MB de RAM e 348MB de swap, o que acontecerá se eu abrir um arquivo de 1GB em um editor e ficar sem memória?

Isso causará falha no sistema? Ou se não, como o Linux lidará com isso?

Não seria sensato instalar o Swapspace então, se necessário, haverá troca suficiente de forma automática e dinâmica?

sudo apt-get install swapspace
    
por rubo77 08.06.2014 / 18:38

2 respostas

14

Depende das configurações com as quais você está executando, em especial a supercomprometimento de memória ( /proc/sys/vm/overcommit_memory ; consulte man 5 proc para obter detalhes).

Se a superalocação de memória estiver desativada, a tentativa do editor (e possivelmente de outros programas ao mesmo tempo) de alocar memória falhará. Eles obterão um resultado de falha da chamada do sistema. Cabe a cada programa lidar com isso, embora um resultado infelizmente comum seja o travamento do programa. O editor também pode, por exemplo, recusar-se a abrir o arquivo.

Se a superalocação de memória estiver ativada, a chamada do sistema solicitando memória pode ser bem-sucedida. Nesse caso, quando a memória é realmente acessada, o kernel notará que está sem memória e mata um processo para recuperar a memória. Esse processo pode ou não ser o editor. A escolha é governada pelo oom_score (o resultado de várias heurísticas do kernel) e oom_score_adj (configurado) de cada processo no sistema. Aqueles também estão nessa proc (5) manpage.

    
por 08.06.2014 / 20:01
3

Existe um enorme problema no Linux se você se aproximar da condição de falta de memória - você notará que todo o seu sistema se tornará totalmente indiferente porque iniciará muitas trocas. Mesmo o cursor do mouse pode ficar tão "lento" que você não pode iniciar um terminal e matar o processo de comedor de memória ofensiva manualmente. Isso é devido ao grande número de operações de disco. Para evitar esta situação, eu normalmente desabilito completamente a swap, então o kernel do Linux é sempre responsivo e, no pior dos casos, o killer oom (sem memória) mata algum processo. A lógica de qual processo é morto por oom depende da versão do kernel.

Portanto, a resposta é não - não ativar a alocação de troca dinâmica, você enfrentará paralisações da máquina.

É fácil experimentá-lo com um programa que aloca constantemente alguma memória em loop. Salve este programa no arquivo de texto memeater.c :

#include <stdlib.h>
int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Depois compile:

$ gcc memeater.c -o memeater

e execute:

$ ./memeater

Experimente com swap, sem swap e com sua alocação de troca dinâmica.

Além disso, lembre-se de que na maioria dos casos essa condição acontece por causa de um bug no software (vazamento de memória) ou você fez algo errado como 'carregar este arquivo de 10Gb no editor' ou 'executar muitos redimensionamentos de arquivos gráficos em paralelo' e fazer a conclusão você precisa trocar ou não.

    
por 08.06.2014 / 23:26