У меня есть eeePC 900a: он имеет 8 ГБ флэш-памяти и только 1 ГБ оперативной памяти. Установленный дистрибутив Linux - это ArchLinux.
Когда система исчерпывает память, она становится крайне не отвечающей: для таких вещей, как переключение на TTY1 или даже перемещение указателя мыши, уходит несколько секунд / минут. Иногда кажется, что система просто зависает: три года назад я оставил ее в покое, и пока ничего не изменилось.
Я бы предпочел избегать создания раздела / файла подкачки на этом eeePC, поскольку диск уже настолько мал, а также потому, что большое количество записей в пространстве подкачки значительно сократило бы срок службы флэш-карты. Более того, я думаю, что файл / раздел подкачки просто переместит проблему, а не решит ее.
Разве ядро не должно убивать некоторые случайные приложения, когда ему не хватает памяти? Почему это не удается (или занимает много времени) при этом?
Несколько месяцев / лет назад я уже пытался разобраться в этом, но не смог найти ничего, что действительно сработало бы ...
while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }
. Это определенно решило бы мою проблему. Но подождите, разве ядро не должно делать это (и гораздо лучше, чем мой скрипт)? Почему он не делает свою работу?Ответы:
OOM-killer (вне памяти) можно вызвать напрямую с помощью комбинации клавиш:
SysRq-F
Клавиша SysRq обычно сочетается с клавишей PrtSc на клавиатурах.
OOM-killer убивает некоторые процессы, и система снова становится отзывчивой.
Спасибо Раману за советы по этой функции в комментариях выше.
PS: это мне очень помогло. Я согласен с мнением, что это самый полезный совет по поводу этой проблемы, если она вызвана Chrome или каким-либо другим программным обеспечением, жадным до памяти. Но нужно помнить, что OOM-killer может убить какой-то действительно важный процесс, используйте его осторожно.
источник
PrtScn|SysRq
. Но нажатиеSysRq - F
дает только скриншотЕстественное положение вещей заключается в том, что данные приложения находятся в оперативной памяти, а файлы - на диске.
Идеально с точки зрения производительности - данные, которые часто используются, находятся в оперативной памяти, а данные, которые в данный момент не нужны, находятся на диске.
В нормальной системе ядро делает две вещи, пытаясь достичь этого идеала:
В типичной системе значительная часть оперативной памяти отводится кэш-памяти и буферам (50% - это типичная цифра). Поскольку ОЗУ является ограниченным ресурсом, для этого может потребоваться смещение некоторых данных приложения для подкачки (подкачка необходима, только если есть лучший способ использования ОЗУ).
В системе без подкачки есть момент, когда данные приложения используют почти всю оперативную память, и поэтому для кеша практически не остается места. Тогда система, вероятно, будет медленной. Ядро не начнет убивать приложения до тех пор, пока это не произойдет. Пока приложения заполняют только 99% доступной памяти, система продолжает работать, но очень медленно, потому что данные файлов должны постоянно загружаться и перезагружаться с диска. С теми же запущенными приложениями система будет быстрее со свопом в этот момент.
Для получения дополнительной информации по этому вопросу см. Обсуждение lkml и эту запись в блоге .
Я не знаю прямого способа сказать ядру зарезервировать минимальный объем оперативной памяти для дискового кэша. Вы можете настроить небольшую часть вашей оперативной памяти как пространство подкачки , возможно, даже сжатую . На этом фронте есть сообщения об успехах , хотя я не даю никаких гарантий в вашем конкретном случае.
источник
ld
, кусок мусора), оно все еще зависает почти минуту, просыпаясь настолько, чтобы позволить мне на секунду двигать невероятно медленную мышь или два каждые несколько секунд. Обработка OOM в Linux - полная хрень. Если мне повезет, OOM Killer убивает правильный процесс, не нарушая полностью среду рабочего стола. И я большой поклонник Linux. Это намного хуже с включенной подкачкой. Linux-пейджинг - это шутка.Это известная ошибка с 2007 года - см. Зависание системы при большом использовании памяти .
В этой ситуации Windows отображает диалоговое окно, предупреждающее пользователя о закрытии одного или нескольких приложений.
источник
Недавно я нашел решение моей проблемы.
Поскольку Linux OOM Killer не может выполнять свою работу должным образом, я начал использовать пользовательское пространство OOM Killer: earlyoom . Он написан на C, довольно настраиваемый и работает для меня как шарм.
Я также слышал о некоторых альтернативах, таких как OOMD Facebook , разработанных для запуска на их серверах, но я не пробовал этот
источник