Fora de troca - o que acontece?


8

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

Será que vai travar o sistema? Ou, se não, como o Linux lidará com isso?

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

sudo apt-get install swapspace

Por que você não troca mais?
guntbert

Espaço em disco rígido é caro na minha VM
rubo77

1
Observe que alguns editores apenas mapeiam o arquivo e não carregam tudo no início, isso corrige o problema completamente, pois eles usam o próprio arquivo de origem como 'swap'.
Vality

Respostas:


17

Depende das configurações com as quais você está executando, em particular a confirmação excessiva de memória ( /proc/sys/vm/overcommit_memory; veja man 5 procpara detalhes).

Se a confirmação excessiva de memória estiver desativada, a tentativa do editor (e possivelmente outros programas que estão tentando ao mesmo tempo) 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 confirmação excessiva de memória estiver ativada, a chamada do sistema que solicita memória pode ter êxito. Nesse caso, quando a memória é realmente acessada, o kernel notará sua falta de memória e interromperá 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(configurada) de cada processo no sistema. Aqueles também estão nessa página de manual proc (5).


5

Nesse caso, 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 fica totalmente sem resposta porque inicia muitas trocas. Até o cursor do mouse pode ficar tão "lento" que você não pode iniciar um terminal e interromper manualmente um processo comedor de memória incorreto. Isso ocorre devido ao grande número de operações em disco.

Para evitar essa situação, eu geralmente desabilito completamente a troca, para que o kernel do Linux seja sempre responsivo e, na pior das hipóteses, o assassino de falta de memória (OOM) acabará com algum processo. A lógica de qual processo é morto pelo OOM depende da versão do kernel.

Portanto, a resposta é não - não ative a alocação dinâmica de swap. Você enfrentará trava de máquina.

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

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Em seguida, compile-o:

$ gcc memeater.c -o memeater

e corra:

$ ./memeater

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

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


1
+1 para sugerir o método simples de testá-lo por si mesmo
rubo77

1
Ele responde à segunda pergunta "é uma boa ideia usar a alocação dinâmica de swap".
gena2x

@ gena2x Sim, é uma ideia muito boa, porque torna seu sistema mais responsivo em situações de sobrecarga, em vez de interromper suas tarefas uma após a outra. -1. Embora seja o melhor se você tiver uma partição de swap fixa grande, mas ela tem outra causa (fragmentação de troca reduzida).
peterh - Restabelece Monica

Se você tiver uma grande troca fixa, o sistema não responderá porque tentaria trocar as tarefas ativas para o disco e elas as trocariam para sempre.
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.