LINUX.ORG.RU
ФорумTalks

Линукс ядро не может мягко обрабатывать ситуации с нехваткой памяти

 , , ,


3

3

На Reddit уже почти полтысячи комментариев по поводу проблемы в Линукс ядре: оно не может мягко обрабатывать ситуации с нехваткой памяти.

Оригинальное сообщение в LKML:

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

Шаги:

1) Загружаемся с параметром mem=4G
2) Выключаем поддержку swap (sudo swapoff -a)
3) Запускаем любой веб браузер, например, Chrome/Chromium или/и Firefox
4) Начинаем открывать вкладки с сайтами и смотрим как уменьшается объём свободной памяти

Как только возникает ситуация, что новая вкладка требует больше оперативной памяти, чем доступно, система практически полностью зависает. Вы даже с трудом сможете двигать курсором мыши. Индикатор жёсткого диска будет моргать без остановки (мне не ясно почему). Вы не сможете запустить новые приложения или закрыть текущие запущенные.

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

Я почти уверен, что можно поменять некоторые параметры sysctl, чтобы избежать подобную ситуацию, но что-то подсказывает, что это можно сделать по умолчанию для всех, потому что нетехнические пользователи, столкнувшись с такой проблемой, просто откажутся от использования Линукс и им будет не того, чтобы искать решения в Google.

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

Подробности

Перемещено Shaman007 из linux-general

anonymous

Я предполагаю, что система не так должна себя вести в этой ситуации.

А как она должна себя вести?

Deleted ()
Ответ на: комментарий от Deleted

Посылать уведомление через Слак-бот в небесную канцелярию же.

Shaman007 ★★★★★ ()

Во-первых, процесс с наибольшим количеством памяти убьет OOM-killer. Во-вторых, не надо отключать своп, это порочная практика.

Сценарий воспроизведения напоминает стрельбу себе по коленям и жалобы, что больно. Для таких пользователей пишут, что нельзя греть кота в микроволновке и отжимать ребенка в стиралке. «Обычный» пользователь не столкнётся с таким поведением, ему своп разметит инсталляция по умолчанию.

Shaman007 ★★★★★ ()
Ответ на: комментарий от Shaman007

Во-первых, процесс с наибольшим количеством памяти убьет OOM-killer. Во-вторых, не надо отключать своп, это порочная практика.

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

praseodim ★★★★★ ()
Ответ на: комментарий от praseodim

надо выделять кусок неприкосновенной памяти для гуя тогда)
как на винте сделано для рута

darkenshvein ★★★★★ ()

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

Cry me a river.

aidaho ★★★★★ ()
Ответ на: комментарий от darkenshvein

меня больше беспокоит, что взаимодействие ядро -> юзер крайне мало для гуя. всякие системные утилитки иногда появляются и потом благополучно забываются в последующих релизах дистров.
пример для особо тугих - винда орёт при нехватке ОЗУ в трее, а линукс/кде/ВМ - МОЛЧИТ

darkenshvein ★★★★★ ()
Последнее исправление: darkenshvein (всего исправлений: 1)
Ответ на: комментарий от darkenshvein

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

praseodim ★★★★★ ()
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от praseodim

короче, та же ситуация, что с ядром постфактума, но гораздо запущеннее

darkenshvein ★★★★★ ()
Ответ на: комментарий от darkenshvein

имею в виду, код не ориентирован по дефолту на юзерспейс.
всё для впс, всё для победы!

darkenshvein ★★★★★ ()
Ответ на: комментарий от Shaman007

Во-вторых, не надо отключать своп, это порочная практика.

Вот взял и порвал 20-летние шаблоны вендузоидов-поптимизаторов

Deleted ()
Ответ на: комментарий от Shaman007

Бла бла бла. Когда подвесишь наглухо таким образом любой офтопик - тогда и приходи. А так то - парни правы. Как минимум - дефолт для десктопных дистров(а может и серверных) явно должен такую ситуёвину предусматривать. Хочешь выжать весь рам до капли - ради бога, сними флажок в sysctl.

pon4ik ★★★★★ ()

Индикатор жёсткого диска будет моргать без остановки (мне не ясно почему).

mmap

Deleted ()
Ответ на: комментарий от Shaman007

OOMkiller его убьет раньше.

Вот это как раз не факт.

Когда кулхацкер уже отключил своп (или он закончился) и приговорил систему к трешингу, киллера можно ждать долго, иногда до пенсии.

aidaho ★★★★★ ()
Ответ на: комментарий от aidaho

Во-во, то-то всякие поделки на замену oomkiller цветут и пахнут, наверное их дураки и пишут и используют.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

наверное их дураки и пишут и используют

В целом верно.

Настоящее решение проблемы — лимиты.

aidaho ★★★★★ ()
Ответ на: комментарий от aidaho

Ага, чёт только с ними ни шкаеп не работает ни хром.

pon4ik ★★★★★ ()

Запускаем любой веб браузер, например, Chrome/Chromium или/и Firefox

И при чём тут ядро? Эти жирные жрущие память тупые амёбы нихера не понимают, когда им ядро сообщает, что памяти больше нету, и, вместо того, чтобы поумерить свои аппетиты и освободить уже полученную память от говнища, частенько тупо начинают в цикле просить память, уменьшая запрашиваемое количество на несущественную величину в надежде выжрать последнее. Отсюда и тормоза.

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

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

Stanson ★★★★★ ()
Ответ на: комментарий от Shaman007

«Обычный» пользователь не столкнётся с таким поведением, ему своп разметит инсталляция по умолчанию.

Да оно и со свопом себя ведёт плохо.

PS: мне лично всё равно, проще плашками ОЗУ забить проблему. Но macOS или Windows себя в этом плане адекватнее ведут.

fornlr ★★★★★ ()
Ответ на: комментарий от pon4ik

Всё с ними работает.

Чтобы не повторяться:
Выпуск earlyoom 1.3, процесса для раннего реагирования на нехватку памяти (комментарий)
cgroups, systemd и распределение процессора.

Я даже по ссылке на reddit сходил, и четвёртый по плюсам камент: пацаны, а может это, лимиты начнём делать, а?

К чему бы это?

aidaho ★★★★★ ()
Ответ на: комментарий от aidaho

Я думал ты про ulimit. Cgroups - должно работаеть, жалко из коробки мне никто так не запилил.

pon4ik ★★★★★ ()

Ну вот, когда я уже сменил железо и пересел на SSD — миллионы мух опомнились. И шаги такие себе злобно-буратинские.

Deleted ()

Перешел по ссылке чтобы почитать Линуса про ананирующих пользователей, — а там пусто.

urxvt ★★★★★ ()
Ответ на: комментарий от Shaman007

Нет, OOMkiller точно так же встает раком. В этом и суть проблемы.

sid350 ★★★★★ ()
Ответ на: комментарий от aidaho

Настоящее решение проблемы — лимиты.

:D

Deleted ()
Ответ на: комментарий от targitaj

Чем именно и как поможет своп?

Даст сбросить туда анонимные страницы.

aidaho ★★★★★ ()
Ответ на: комментарий от targitaj

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

aidaho ★★★★★ ()
Ответ на: комментарий от aidaho

Сразу пройдём к моменту когда своп тоже закончился. Что потом?

targitaj ★★★★★ ()
Ответ на: комментарий от Shaman007

В этом случае и своп не поможет. Система едва ворочается, проще дёрнуть рубильник, чем пытаться закрыть приложения. Может быть своп на SSD лучше работает, но я не пробовал.

ox55ff ★★★ ()
Ответ на: комментарий от ox55ff

Может быть своп на SSD лучше работает

Да, намного

Deleted ()
Ответ на: комментарий от Vsevolod-linuxoid

Майки проплатили распространение чернухи о божественном пингвине.

ox55ff ★★★ ()
Ответ на: комментарий от ox55ff

Да дело не в чернухе. Просто странно тащить такое в новости — как бы такие особенности поведения уже давно известны.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от targitaj

Потом ситуация практически идентична той, где свопа вообще нет.
Если нет свободного свопа и нет свободной ОЗУ, то всё: ресурсов для решения задачи у машины больше нет.
Ждём когда когда придёт лесник и что-то убьёт, чтобы компьютер просто продолжил работать.

aidaho ★★★★★ ()
Ответ на: комментарий от targitaj

Очевидно: прямо влияет на размер задачи, которую машина может переварить.

Когда своп закончился, снова неанонимные страницы стают единственным источником для reclaim.
Как зорко заметили некоторые наблюдатели, когда кода в памяти особо уже и нет, компуктер стоит без инструкций и ничего не делает.

aidaho ★★★★★ ()
Ответ на: комментарий от aidaho

Почему нельзя так настроить систему, чтобы oom killer пришел до выкидывания неанонимных страниц памяти или же вовсе запретить их выкидывать? Раз сказали что свопа нет, значит нефиг свопить неанонимные страницы в исполняемые файлы приложений.

KivApple ★★★★★ ()
Ответ на: комментарий от KivApple

Почему нельзя так настроить систему, чтобы oom killer пришел до выкидывания неанонимных страниц памяти или же вовсе запретить их выкидывать? Раз сказали что свопа нет, значит нефиг свопить неанонимные страницы в исполняемые файлы приложений.

Это вопросы к Линусу.

Вангую, если так сделать, то весь интернет заполнится хоровым воплем «да склолько же этому вашему проклятому линуксу нужно памяти?!»
А может и не заполнится. Браузер будет убит OOM пока камент строчится %)

ПО требует память. Памяти нет. Приходится крутиться.

aidaho ★★★★★ ()

Вот на самом деле достало такое поведение, когда кривые яваскрипты в браузере вешают целиком машину, и даже консоль в рута не запустишь в alt+ctrl+f1 чтобы браузер кильнуть - потомучто и память и своп - все засрано. Кроме ресета иногда ничего не спасает (

ppy ★★ ()
Ответ на: комментарий от Vsevolod-linuxoid

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

dogbert ★★★★★ ()
Ответ на: комментарий от aidaho

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

KivApple ★★★★★ ()
Ответ на: комментарий от KivApple

А што делать то? Всё кончилось: даже спички и соль.

Проблема с поздним приходом OOM, вполне реальна, ага.
Но это как жаловаться, что сапёрная лопатка плохо заточена.
Перед этим надо продать танк, потерять автомат и сломать нож.

aidaho ★★★★★ ()
Ответ на: комментарий от Deleted

Ты знаешь, что делает Windows, если отключить своп вообще? Она создаёт своп-файл сама, но тайком, внутри C:\WINDOWS.

i-rinat ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)