Como evitar falta de memória para travar o sistema

4

Eu tenho visto muitas questões relacionadas à memória no Ubuntu, e para ser honesto, eu realmente não consigo entender como ainda é possível lutar com esses problemas.

Tenho 8 GB de RAM. Eu estou experimentando com / sem swap sem muita diferença.

O problema é que eu frequentemente (até uma vez por dia) tenho que reiniciar meu laptop porque está totalmente congelado (esperar não ajuda). É provavelmente relacionado ao uso de RAM dos meus navegadores web. Apart deste, nenhum processo de alta exigência está sendo executado no laptop.

Para experimentar / reproduzir:

  • Eu "preencho" minha memória com o Python com um loop infinito que preenche uma lista.
  • Eu abro meu navegador (web) (Chrome / Firefox), com uma ou mais guias.

Minhas observações são:

  • O Python não pode alocar a memória infinitamente: ela eventualmente aumentará um MemoryError .
  • o navegador por outro lado, não dá a mínima para isso, e no meu caso, vai travar o sistema. Eu tenho que reiniciar o laptop com força.

Eu não entendo:

  • por que o navegador tem permissão para alocar mais e mais memória (até o último bit que parece)
  • por que o sistema trava ao invés de "apenas" matar um processo.

Estou ciente de que a troca requer CPU, por isso pode travar o sistema por um tempo. É por isso que eu o desativei, então eu estava pensando que o kernel iria decidir rapidamente matar um processo.

Não consigo entender como esse uso básico (usando navegadores) pode ser um problema com um SO recente usando 8 GB de RAM. Preciso ajustar meu sistema para ter um confiável?

Obrigado por qualquer conselho / explicação / truques que possam ajudar.

    
por pltrdy 04.05.2018 / 17:29

1 resposta

2

Eu resolvi um problema semelhante com um script de memória / cpu watcher e simplesmente o matei de qualquer processo que tenha mais de x memória ou memória por mais de t segundos. Isso não resolve o problema de reservar CPU / Mem para o SO, mas é uma solução alternativa até que você encontre uma resposta melhor (E quando você faz isso, compartilhe comigo, porque eu cheguei aqui procurando a mesma coisa)

#!/bin/bash

# Kill POS if we're doing stupid shit.
HOG_COUNTER=0
while true; do
    # This is pulling CPU, change the awk column from 9 to something
    # that you want to check against.
    HOG=$(top -b -n 1 | grep pos2 | awk '$9 > 90 {print $1}')
    # If the hog variable is not empty, add some counter info - we don't
    # want to catch periodic spikes, we want to catch consistent offenders.
    if [ ! -z "$HOG" ]; then
        counter_time=$(date)
        HOG_COUNTER=$(expr ${HOG_COUNTER} + 1)
        echo "$counter_time - Found a hog: $HOG - ${HOG_COUNTER} counters." >> high_mem_kill_log
    else
        HOG_COUNTER=0
    fi
    # If we have more than 2 counters (3 or more) then we kill the process
    # that's doing it.
    if [ $HOG_COUNTER -gt 2 ]; then
        kill_time=$(date)
        echo "$kill_time - Found a hog: $HOG.  $HOG_COUNTER counters.  Killing $HOG." >> high_mem_kill_log
        kill $HOG
    fi
    sleep 30s
done
    
por bubthegreat 01.11.2018 / 17:55