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

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

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

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

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

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

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

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

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

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

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

76
задан 13 April 2017 в 15:14

9 ответов

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

sysctl -w vm.min_free_kbytes=65536

Следует иметь в виду, что это - установка на ядро, поэтому если у меня есть 2 ГБ RAM и двух Ядер, затем я вычислил 6% только 1 ГБ и добавил немного дополнительное только для сейфа.

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

sysctl -w vm.swappiness=5

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

Результат состоит в том, что Linux больше случайным образом решает загрузить целый файл ролика приблизительно 1 ГБ в поршне при наблюдении его и уничтожении машины при этом.

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

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

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


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

vm.swappiness=5
vm.min_free_kbytes=65536
64
ответ дан 13 April 2017 в 15:14

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

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

sysctl vm.swappiness

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

sudo sysctl vm.swappiness=10

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

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

0
ответ дан 13 April 2017 в 15:14

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

Поэтому я написал скрипт для контроля использования памяти. Сначала он попытается очистить кэш ОЗУ, если потребление памяти увеличит порог. Вы можете настроить этот порог в сценарии. Если даже тогда потребление памяти не будет ниже порогового значения, оно начнет убивать процессы на один в порядке убывания потребления, пока потребление памяти не станет ниже порогового значения. Я установил его на 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

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

0
ответ дан 13 April 2017 в 15:14

Я сталкиваюсь с той же проблемой с Ubuntu 16.04 до Ubuntu 18.10. Если через некоторое время использовать Firefox несколько вкладок, он застрянет и не сможет ничего сделать после этого. Затем я хочу нажать кнопку питания, чтобы продолжить снова. Я беспокоюсь, что моя система будет повреждена!

0
ответ дан 13 April 2017 в 15:14

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

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

sudo apt-get install zram-config

После этого мне удалось настроить размер свопа zram, изменив /etc/init/zram-config.conf в строке 21. [ 116]

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

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

0
ответ дан 13 April 2017 в 15:14

Я постоянно запускаю один из моих ноутбуков с живой 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.

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

0
ответ дан 13 April 2017 в 15:14

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

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

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

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

Для 16 ГБ ОЗУ попробуйте следующее:

vm.min_free_kbytes=500000

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

0
ответ дан 13 April 2017 в 15:14

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

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

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

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

sudo blkid

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

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

0
ответ дан 13 April 2017 в 15:14

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

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

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

Вы можете использовать ядро ​​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

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

0
ответ дан 1 December 2019 в 13:35

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

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