Как избежать нехватки памяти для зависания системы

Я видел много вопросов, связанных с памятью об Ubuntu, и, честно говоря, я действительно не могу понять, как все еще можно бороться с такими проблемами.

У меня 8 ГБ ОЗУ. Я экспериментировал с / без свопа без особых различий.

Проблема в том, что мне часто (до одного раза в день) приходится сильно перезагружать свой ноутбук, потому что он полностью завис (ожидание не помогает). Скорее всего, это связано с использованием оперативной памяти моих веб-браузеров. Судя по всему, на ноутбуке не запущен процесс с высокими требованиями.

Чтобы экспериментировать / воспроизводить:

  • Я «заполняю» свою память Python бесконечным циклом, который заполняет список.
  • Я открываю свой (веб) браузер (либо Chrome / Firefox), с одной или несколькими вкладками.

Мои наблюдения таковы:

  • Python не может распределять память бесконечно: он в конечном итоге вызовет MemoryError.
  • браузер, с другой стороны, не дает об этом, и, в моем случае, приведет к зависанию системы. Тогда мне придется перезагрузить ноутбук.

Я не понимаю:

  • , почему браузеру разрешается выделять все больше и больше памяти (до последнего бита это кажется)
  • почему система зависает, а не просто убивает процесс.

Я знаю, что для подкачки требуется процессор, поэтому он может зависнуть на некоторое время. Вот почему я отключил его, поэтому думал, что ядро ​​быстро решит убить процесс.

Я не могу понять, как такое простое использование (с использованием браузеров) могло быть проблемой с недавней ОС, использующей 8 ГБ ОЗУ. Нужно ли настраивать мою систему, чтобы она была надежной?

Спасибо за любые советы / объяснения / уловки, которые помогут.

6
задан 4 May 2018 в 18:29

1 ответ

Я решил подобную проблему со сценарием наблюдателя памяти/CPU и просто имею его, уничтожают любые процессы, что это видит, что имеют больше, чем поршень x или y память для дольше, чем t секунды. Это не решает проблему резервирования ЦП/мадам для ОС, но это - обходное решение, пока Вы не находите лучший ответ (И когда Вы делаете, совместно используете его со мной, потому что я получил сюда поиск того же самого),

#!/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
3
ответ дан 23 November 2019 в 08:04

Другие вопросы по тегам:

Похожие вопросы: