Проблема, я думаю, чем-то похожа на эту ветку.
Неважно, если я включил или отключил обмен, всякий раз, когда реальный объем используемой оперативной памяти начинает приближаться к максимуму и почти не остается места для дискового кэша, система перестает отвечать на запросы.
Диск крутится дико, и иногда после долгого ожидания 10-30 минут он размораживается, а иногда нет (или у меня кончается терпение). Иногда, если я действую быстро, мне удается медленно открыть консоль и убить некоторые приложения, которые едят баранов, такие как браузер, и система почти мгновенно размораживается.
Из-за этой проблемы я почти никогда не вижу ничего в свопе, только иногда там есть несколько МБ, а затем вскоре после того, как эта проблема появляется. Мое не очень образованное предположение состояло бы в том, что он каким-то образом связан с слишком жадным дисковым кешем или слишком мягким управлением памятью, поэтому, когда память требуется, она не освобождается достаточно быстро и приводит к голоданию системы.
Проблема может быть решена очень быстро, если работать с файлами lagrge (500 МБ +), которые загружаются в дисковый кеш, и после этого система не может выгрузить их достаточно быстро.
Любая помощь или идеи будут с благодарностью.
Пока мне приходится жить в постоянном страхе, когда что-то делает компьютер, который может просто зависнуть, и мне, как правило, приходится перезапускать его, если на самом деле заканчивается ОЗУ, мне бы очень хотелось просто убить некоторых из пользовательские приложения, такие как более широкие (желательно, если бы я мог как-то пометить, какой из них убить первым)
Хотя загадка не объясняет, почему обмен не спасает меня в этой ситуации.
ОБНОВЛЕНИЕ: Некоторое время не зависало, но теперь я снова получил несколько происшествий. Сейчас я постоянно держу монитор памяти на своем экране, и когда зависание происходило, оно все равно показывало ~ 30% свободного места (вероятно, используется дисковым кешем). Дополнительные симптомы: Если во время просмотра видео (проигрыватель VLC) звук останавливается первым, через несколько секунд изображение останавливается. Хотя звук прекратился, я все еще имею некоторый контроль над ПК, но когда изображение останавливается, я даже больше не могу двигать мышью, поэтому я перезапустил его после некоторого ожидания. Между прочим, этого не произошло, когда я начал смотреть видео, но некоторое время спустя (20 минут) и в то время я больше ничего не делал активно, хотя браузер и oowrite были открыты на втором экране все время. По сути, что-то просто решает произойти в какой-то момент, и система зависает.
Согласно запросу в комментариях я запускал dmesg сразу после зависания. Я не заметил ничего странного, но не знал, что искать, так что вот оно: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=en_US&F_key
Для решения этой проблемы, я нашел, что необходимо установить следующую установку на что-то приблизительно 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
Я предполагаю, что вы установили vm.swappiness
на очень низкое значение, из-за чего ядро переключается слишком поздно, оставляя слишком мало ОЗУ для работы системы.
Вы можете отобразить текущую настройку подкачки, выполнив:
sysctl vm.swappiness
По умолчанию это значение равно 60. Ubuntu Wiki рекомендует установить его на 10, но не стесняйтесь установить его на более высокое значение. Вы можете изменить его, запустив:
sudo sysctl vm.swappiness=10
Это изменит его только для текущего сеанса , чтобы сделать его постоянным, вам нужно добавить vm.swappiness = 10
в файл /etc/sysctl.conf
.
Если у вас медленный диск, подумайте о покупке нового.
У меня ничего не получалось !!
Поэтому я написал скрипт для контроля использования памяти. Сначала он попытается очистить кэш ОЗУ, если потребление памяти увеличит порог. Вы можете настроить этот порог в сценарии. Если даже тогда потребление памяти не будет ниже порогового значения, оно начнет убивать процессы на один в порядке убывания потребления, пока потребление памяти не станет ниже порогового значения. Я установил его на 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 16.04 до Ubuntu 18.10. Если через некоторое время использовать Firefox несколько вкладок, он застрянет и не сможет ничего сделать после этого. Затем я хочу нажать кнопку питания, чтобы продолжить снова. Я беспокоюсь, что моя система будет повреждена!
Я знаю, что этот вопрос старый, но у меня была эта проблема в 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 соответствовал размеру барана, который у меня есть. С тех пор у меня больше не было зависаний или системного бездействия.
Я постоянно запускаю один из моих ноутбуков с живой 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.
Я не совсем уверен в побочных эффектах этого, поэтому я буду осторожен в этом.
Я долго боролся с этой проблемой, но теперь, похоже, она решается на моем ноутбуке.
Если ни один из других ответов не работает для вас (я пробовал большинство из них), поиграйте с min_free_kbytes , чтобы иметь больше места в оперативной памяти, когда ваш компьютер начинает подкачку (непосредственно перед тем, как установить это минимальное значение на вашем компьютере. свободной оперативной памяти).
У меня 16 ГБ ОЗУ, но раньше чем раньше память заполнялась, а затем перестала отвечать на 10–30 минут, пока некоторые вещи не поменялись местами.
По крайней мере для меня установка значения min_free_kbytes выше рекомендуемого делает этот процесс обмена значительно быстрее.
Для 16 ГБ ОЗУ попробуйте следующее:
vm.min_free_kbytes=500000
Чтобы установить это значение, см. Другие ответы или просто введите его в Google :))
Это произошло для меня в новой версии Ubuntu 14.04.
В моем случае это не имело никакого отношения к упомянутым проблемам sysctl.
Вместо этого проблема заключалась в том, что UUID раздела подкачки во время установки отличался от того, который был после установки. Так что мой своп никогда не был включен, и мой компьютер зависал после нескольких часов использования.
Решение состояло в том, чтобы проверить текущий UUID раздела подкачки с помощью
sudo blkid
, а затем sudo nano /etc/fstab
, чтобы заменить значение UUID неверного свопа значением, сообщенным blkid.
Простая перезагрузка, чтобы повлиять на изменения, и вуаля.
Вместо того, чтобы настраивать параметры ядра самостоятельно. попробуйте 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
, если вы настаиваете на использовании ядра по умолчанию, отключение подкачки тоже может быть лучшим вариантом