Компьютер зависает на почти полной оперативной памяти, возможно, проблема с дисковым кешем

Проблема, я думаю, чем-то похожа на эту тему.

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

Диск крутится дико, и иногда после долгого ожидания 10-30 минут он разморозится, а иногда нет (или у меня кончится терпение). Иногда, если я действую быстро, мне удается медленно открыть консоль и убить некоторые приложения, которые едят оперативную память, такие как браузер, и система почти мгновенно размораживается.

Из-за этой проблемы я почти никогда не вижу ничего в свопе, только иногда там есть несколько МБ, а затем вскоре после того, как эта проблема появляется. Мое не очень образованное предположение состояло бы в том, что он каким-то образом связан с слишком жадным дисковым кешем или слишком мягким управлением памятью, поэтому, когда память требуется, она не освобождается достаточно быстро и приводит к голоданию системы.

Проблема может быть решена очень быстро, если работать с файлами lagrge (500 МБ +), которые загружаются в дисковый кэш, и после этого система не может выгрузить их достаточно быстро.

Любая помощь или идеи будут с благодарностью.

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

Хотя загадка - вот почему своп не спас меня в этой ситуации.

ОБНОВЛЕНИЕ: Это не висело в течение некоторого времени, но теперь я снова получил несколько происшествий. Сейчас я постоянно держу монитор памяти на своем экране, и когда зависание происходило, оно все равно показывало ~30% свободного места (вероятно, используется дисковым кешем). Дополнительные симптомы: Если во время просмотра видео (проигрыватель VLC) звук останавливается первым, через несколько секунд изображение останавливается. Хотя звук прекратился, я все еще имею некоторый контроль над ПК, но когда изображение останавливается, я даже больше не могу двигать мышью, поэтому я перезапустил его после некоторого ожидания. Между прочим, этого не произошло, когда я начал смотреть видео, но некоторое время спустя (20 минут) и в то время я больше ничего не делал активно, хотя браузер и oowrite были открыты на втором экране все время. По сути, что-то просто решает произойти в какой-то момент, и система зависает.

По запросу в комментариях я запускал dmesg сразу после зависания. Я не заметил ничего странного, но не знал, что искать, поэтому вот оно: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=en_US&authkey=CPzF7bcC

7 ответов

Чтобы устранить эту проблему, я обнаружил, что вам нужно установить следующий параметр примерно в 5%-6% от общей физической памяти, разделенный на количество ядер в компьютере:

sysctl -w vm.min_free_kbytes=65536

Имейте в виду, что это настройка для каждого ядра, поэтому, если у меня 2 ГБ ОЗУ и два ядра, то я рассчитал 6% только на 1 ГБ и добавил немного больше, чтобы быть в безопасности.

Это заставляет компьютер пытаться освободить этот объем ОЗУ, и при этом ограничивает возможность кэширования файлов на диске. Конечно, он все еще пытается их кешировать и немедленно поменять их местами, так что вам, вероятно, следует также ограничить обмен:

sysctl -w vm.swappiness=5

(100 = своп как можно чаще, 0= своп только по полной необходимости)

В результате linux больше не принимает случайного решения загрузить весь файл фильма объемом около 1 ГБ в оперативной памяти во время просмотра, что приводит к гибели компьютера.

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

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

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


Возможно, вы захотите сделать эти настройки постоянными, добавив их в свой /etc/sysctl.conf нравится:

vm.swappiness=5
vm.min_free_kbytes=65536

Это произошло для меня в новой установке Ubuntu 14.04.

В моем случае это не имело никакого отношения к упомянутым проблемам sysctl.

Вместо этого проблема заключалась в том, что UUID раздела подкачки во время установки отличался от того, который был после установки. Так что мой своп никогда не был включен, и мой компьютер зависал после нескольких часов использования.

Решением было проверить текущий UUID раздела подкачки с помощью

sudo blkid

а потом sudo nano /etc/fstab заменить неверное значение UUID свопа значением, сообщенным blkid.

Простая перезагрузка, чтобы повлиять на изменения, и вуаля.

У меня ничего не получалось!!

Поэтому я написал скрипт для мониторинга использования памяти. Сначала он попытается очистить кэш ОЗУ, если потребление памяти увеличит порог. Вы можете настроить этот порог в сценарии. Если даже тогда потребление памяти не будет ниже порогового значения, оно начнет убивать процессы на один в порядке убывания потребления, пока потребление памяти не станет ниже порогового значения. Я установил его на 96% по умолчанию. Вы можете настроить его, изменив значение переменной RAM_USAGE_THRESHOLD в скрипте.

Я согласен, что процессы уничтожения, которые занимают много памяти, не являются идеальным решением, но лучше убить ОДНО приложение, а не терять ВСЕ работу!! Сценарий отправит вам уведомление на рабочем столе, если использование ОЗУ увеличит порог. Он также уведомит вас, если убьет какой-либо процесс.

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send \"{}\"".format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or \
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
                                     "} % memory (memory usage={})". \
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage={}".\
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "\n"
                except Exception as err:
                    print("Error while killing {}: {}".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

Сохраните код в файле скажем save_hang.py. Запустите скрипт как:

sudo python save_hang.py

Обратите внимание, что этот скрипт совместим только с Python 3 и требует установки пакета tkinter. Вы можете установить его как:

sudo apt-get install python3-tk

Надеюсь это поможет...

Я знаю, что этот вопрос старый, но у меня была эта проблема в Ubuntu (Chrubuntu) 14.04 на Chromebook Acer C720. Я попробовал решение Krišjānis Nesenbergs, и оно несколько сработало, но иногда все же падало.

Наконец-то я нашел решение, которое сработало, установив zram вместо физического подкачки на SSD. Чтобы установить его, я просто следовал инструкциям здесь, вот так:

sudo apt-get install zram-config

После этого я смог настроить размер zram swap, изменив /etc/init/zram-config.conf на линии 21.

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

Я заменил 2 на 1, чтобы размер zram соответствовал размеру барана. С тех пор у меня больше не было зависаний или системного бездействия.

Я предполагаю, что вы установили свой vm.swappiness до очень низкого значения, из-за которого ядро ​​переключается слишком поздно, оставляя слишком мало оперативной памяти для работы системы.

Вы можете показать текущую настройку подкачки, выполнив:

sysctl vm.swappiness

По умолчанию это значение равно 60. Ubuntu Wiki рекомендует установить значение 10, но вы можете установить более высокое значение. Вы можете изменить это, запустив:

sudo sysctl vm.swappiness=10

Это изменит его только для текущего сеанса, чтобы сделать его постоянным, необходимо добавить vm.swappiness = 10 к /etc/sysctl.conf файл.

Если у вас медленный диск, подумайте о покупке нового.

Я долго боролся с этой проблемой, но теперь, похоже, она решается на моем ноутбуке.

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

У меня 16 ГБ ОЗУ, но раньше, чем позже, память заполнялась, а затем перестала отвечать на 10-30 минут, пока некоторые вещи не поменялись местами.

По крайней мере, для меня установка значения min_free_kbytes выше рекомендованного значительно ускоряет процесс обмена.

Для 16 ГБ ОЗУ попробуйте это:

vm.min_free_kbytes=500000

Чтобы установить это значение, смотрите другие ответы или просто гуглите его:)

Я постоянно запускаю один из моих ноутбуков с живой SD-карты Ubuntu с небольшим разделом хранения ext4 и файлом подкачки на жестком диске. Когда используется почти вся оперативная память, а значение подкачки слишком мало (иногда я предпочитаю полностью отключить жесткий диск, если это возможно, потому что он шумный), производительность Linux для меня имеет тенденцию падать с обрыва, так что просто TTY1, чтобы убить Firefox, занимает 15 минут.

привлечение /proc/sys/vm/vfs_cache_pressure по умолчанию от 100 до 6000, кажется, помогает предотвратить это. Тем не менее, документация ядра предупреждает против этого, говоря

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

Я не совсем уверен в побочных эффектах этого, поэтому я буду осторожен в этом.

Вместо того, чтобы самостоятельно настраивать параметры ядра. попробуйте linux-zen или linux-ck, которые специально разработаны (пропатчены и настроены) для настольных компьютеров и ноутбуков. Linux по умолчанию больше настроен на большую пропускную способность и серверы без графического интерфейса

дзен даст вам меньше повсюду, но лучшую отзывчивость. По моему опыту, параметры настройки ядра по умолчанию дают меньше, чем linux-zen (или liquorix) и linux-ck.

Для ubuntu, я думаю, вам нужно вручную скомпилировать и исправить ядро ​​для linux-ck с помощью набора патчей Con Kolivas ck

Вы можете использовать ядро ​​Liquorix, использующее исходный код Linux-zen. взгляните на https://liquorix.net/

вот как установить

sudo add-apt-repository ppa:damentz/liquorix
sudo apt-get update
sudo apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64

если вы настаиваете на использовании ядра по умолчанию, отключение подкачки тоже может быть лучшим вариантом

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