O Linux sempre trava quando está sem memória física

2

Estou usando ArchLinux , com 3.18.6-1 kernel, quando um software usa mais do que a memória física (quando a memória total usada é > 5.8 GB), sempre fica sem resposta e tudo o que posso fazer é redefinir o computador. Eu forneci swap em /etc/fstab

/swapfile swap swap defaults 0 0

Meu vm.swappiness é 1 , a saída do comando free -m :

              total        used        free      shared  buff/cache   available
Mem:           7800        3059         688         239        4053        4204
Swap:         10247           0       10247

Eu tentei aumentar o swappiness para 10 e, em seguida, executar um programa de memória munch .c mas sempre trava quando alcança 4000 MB

O que há de errado com o meu Linux?

Ou existe uma maneira de matar automaticamente o programa com o maior uso de RAM? (esse é provavelmente o programa em execução mais recente, que é valgrind ou meu programa de teste recente)

    
por Kokizzu 20.02.2015 / 06:50

2 respostas

0

Eu tenho experimentado com echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task , mas ainda demora alguns minutos antes de realmente matar o programa problemático. Nos meus testes earlyoom é o melhor para este caso, para instalá-lo, basta digitar:

yaourt --needed --noconfirm -S --force earlyoom
sudo cp /usr/bin/earlyoom /usr/local/bin/
sudo systemctl enable earlyoom
sudo systemctl start earlyoom

Agora tente compilar e executar este programa novamente:

echo '
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;
    if(argc > 1) max = atoi(argv[1]);
    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer,0,1024*1024);
        printf("Allocated %d MB\n", ++mb);
    }
    return 0;
}
' > munch.c && gcc -O2 -o munch munch.c 
./munch

Isso daria uma saída assim:

Allocated 1 MB
Allocated 2 MB
Allocated 3 MB
...
Allocated 4367 MB
Allocated 4368 MB
Allocated 4369 MB
Killed

O programa com maior uso de memória agora é eliminado automaticamente e seu sistema sempre será responsivo. Para ver o registro em tempo real do tipo de serviço journalctl -f -u earlyoom , seria mostrado algo assim:

-- Logs begin at Mon 2014-11-03 10:54:39 WIB. --
Feb 20 13:25:25 s497 earlyoom[20041]: earlyoom v0.3-15-g528196e
Feb 20 13:25:25 s497 earlyoom[20041]: total:  7800 MiB
Feb 20 13:25:25 s497 earlyoom[20041]: min:     780 MiB
Feb 20 13:25:25 s497 earlyoom[20041]: avail:  4963 MiB
Feb 20 13:33:10 s497 earlyoom[20041]: Out of memory! avail: 519 MiB < min: 780 MiB
Feb 20 13:33:10 s497 earlyoom[20041]: Killing process 24984 (munch)

pressione Ctrl+C para fechar esse comando.

    
por 20.02.2015 / 07:47
0

Eu tive o mesmo problema em algumas das minhas máquinas: era como se o Linux não percebesse que eu havia adicionado swap.

A solução: Atualize o kernel de 3.x para 4.x.

    
por 01.03.2018 / 08:21