LINUX.ORG.RU
ФорумTalks

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

 , , ,


4

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

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

Когда подвесишь наглухо таким образом любой офтопик - тогда и приходи.

Я схожим образом вешал на десятки минут Windows 95, NT4, XP, 8.1, Server 2019 и ещё некоторые. Иногда задача убивается через час-два. Иногда через 16. Иногда через несколько суток. Последний раз было вчера: загрузить 550М XML в Xerces, сохранить, закрыть — висело больше получаса.

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

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

Какая выгода от свопа в данной ситуации? Что ООМ-киллер сработает не сразу, а сперва система встанет раком и несколько минут похрустит диском?

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

Откуда информация?

Из первых рук. Но как мне уже офлайн сказали, мой опыт мог устареть. Я только видел такое в Windows XP. Новыми Windows долго не пользовался, так что не уверен. Разве что случайный поиск по интернету даёт кучу сообщений от пользователей, которым Windows, в том числе и 10-й, мозг проел сообщением о том, что он создал временный pagefile.

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

если бы увидел хоть одну софтину, которая может пережить отказ в malloc()

https://github.com/hakavlad/nohang-extra/blob/master/trash/i-memhog

- вот эта всё нормально переживает

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

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

вот эта всё нормально переживает

Если бы она ещё чего полезного делала.
Теперь напиши браузер, будь мужиком.

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

Весь тред крыли матом жирнософт :)
Именно из-за таких трюкачей malloc и перестал выделять память.

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

Именно из-за таких трюкачей malloc и перестал выделять память.

Если оверкоммит в единице то трюки безвредны.

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

Именно из-за таких трюкачей malloc и перестал выделять память.

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

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

Если бы она ещё чего полезного делала.

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

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

Я себе когда-то давно наваял

#include <stdio.h>
#include <stdlib.h>

#define MEGABYTE 1024*1024

int main(int argc, char *argv[])
{
	void *memblock = NULL;
	int count = 0;

	while (1)
	{
		memblock = malloc(MEGABYTE);
		if (!memblock) {
			printf("\nOut of memory but no OOM in sight after %d MB\n", ++count);
			break;
		}
		memset(memblock, 1, MEGABYTE);
		printf("\rHogged %d MB", ++count);
		fflush(stdout);  // prevent cursor jumps
	}

	exit(0);
}

Запуск: tcc -run memhog.c

Мне хватает.
Ну и оно уже давно ничего не может из-за cgroups.

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

10-й, мозг проел сообщением о том, что он создал временный pagefile.

А, даже так...

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

Небось сходил и поставил галку «оптимизировать работу служб»? А на сервере она вроде у них и по умолчанию стоит.

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

если части твоего скрипта не умеют работать с ограниченным объемом памяти - то это их проблемы

Чавой?

#/bin/sh

mkdir -p /tmp/gay-space
touch /tmp/gay-space/reprimand

В этом скрипте создаются аж два новых процесса. Это требует памяти. Расскажи мне, пожалуйста, как правильно обрабатывать нехватку памяти в этом скрипте?

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

Расскажи мне, пожалуйста, как правильно обрабатывать нехватку памяти в этом скрипте?

Давай я расскажу.

Читаешь /proc/meminfo, находишь MemAvailable и SwapFree. Если Эти показатели имеют большие значения - мнго метров - то можно делать mkdir и прочее. Как проверить доступную память чтобы начать проверять память - это уже другой вопрос.

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

Ну и оно уже давно ничего не может из-за cgroups.

У меня ничего не смогло из-за nohang:

Hogged 22001 MB Завершено

- мягенько завершилось через SIGTERM

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

1)

gay-space/reprimand

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

2)

В этом скрипте создаются аж два новых процесса

да, при этом 2-й процесс запускается после того как отработал и завершился 1-й. В твоём примере они не будут запущены параллельно
3)

Расскажи мне, пожалуйста, как правильно обрабатывать нехватку памяти в этом скрипте?

Так же как это делают адекватные люди которые проверяют успешность работы частей скрипта? Смотреть в return value?

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

Так же как это делают адекватные люди которые проверяют успешность работы частей скрипта? Смотреть в return value?

А если скрипт на питоне? Каждую фцию в try except MemoryError заворачивать?

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

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

Мама, мама, меня мальчик обидел!

да, при этом 2-й процесс запускается после того как отработал и завершился 1-й. В твоём примере они не будут запущены параллельно

Ничего не понял. Если памяти нет, что должен делать shell?

Так же как это делают адекватные люди которые проверяют успешность работы частей скрипта? Смотреть в return value?

То есть скрипты начнут валиться в произвольных местах вместо пятисекундной задержки (и нет, я не про то, что ошибки обрабатывать не нужно, я о том, что вместо «немного подождать» мы создаем кучу репортинга в духе АААА ЧУВАК ПРОГРАММА УПАЛА в notification area или логах, что тащит за собой дополнительное выделение памяти)? Я уже говорил про боженьку UX, да?

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 3)
Ответ на: комментарий от hakavlad

А если скрипт на питоне? Каждую фцию в try except MemoryError заворачивать?

Если есть требования чтобы скрипт работал в необычных ситуациях (одна из них - недостаток памяти) то обрабатывать эти ситуации.

Если требований нет то зачем парить моск?

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

Мама, мама, меня мальчик обидел!

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

судя по всему 1-е

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

Ещё раз: за эту проблему трут ДВАДЦАТЬ лет подряд. И до сих пор нет единого решения, которое бы всех устроило. Но тут в тред врывается reprimand на белом коне и восклицает ДА ЩА ВСЕ РЕШИМ ПАЦАНЫ. Я тебе плавно намекаю на то, что прежде чем орать ААААА ЯДРО НЕ МОЖЕТ ОНИ ТАМ ТАКИЕ ПЛОХИЕ, предложить детальный план изменений, охватывающий больше одного юзкейса «браузер повис кокококо». И не на пальцах, а с диаграмками, примерами кода и описанием поведения уже написанных программ.

В противном случае ты просто пердишь в лужу.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 3)

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

Проблема обработки нехватки памяти будет полностью исчерпана, если принять за аксиому, что обработка нехватки памяти - это задача юзерспейса, и не ядра. Ядро не смогло за 20 лет решить проблему. В юзерспейсе же мы можем на коленке за вечер написать работающее решение. Или выбрать качественное решение по вашему вкусу из множества существующих (earlyoom, peacemker, nohang, oomd, lmkd), которое наилучшим образом подойдет для вашего юзкейса.

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

Читаешь /proc/meminfo, находишь MemAvailable и SwapFree. Если Эти показатели имеют большие значения - мнго метров - то можно делать mkdir и прочее. Как проверить доступную память чтобы начать проверять память - это уже другой вопрос.

Типа если я хочу offlineimap в цикле запустить, то мне нужно там /proc/meminfo парсит? Дядя, ну ты чего.

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

окей, допустим предложу

что дальше? собирать деньги для того чтобы кто-то заплатил за реализацию?

P.S. Внесите мне плз кого-нибудь на белом коне который пофиксит 12309, я ему задоначу.

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

Может иксы тут совсем не при чём,

вангую блобы нвидиа, а свалили всё опять на бедные иксы

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

Не проще просто ВСЕГДА держать зарезервированным 1 мег (или сколько там нужно) для tty1 и для htop / ps / ssh , чтобы юзер всегда мог залогиниться в рута и кильнуть что там из апликух выжрало всю память? Тогда решиться проблема с хардресетом

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

быть не должно

волосы будут мягкие и шелковистые, прямо как в 2.6.16?

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

А начни с пункта #1 — предложиbb.

Я-то начну, но зачем мне тратить своё свободное время на пункт 1 если я не уверен что пункт 2 вообще будет?

выбросить примерно 20 часов жизни впустую?

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

зарезервированным 1 мег

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

Кстати, обратите внимание также на memlockd. - Старая прога, в репах есть, маппит исполняемые файлы прог необходимых для логина.

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

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

вот так дети и подсаживаются на героин!

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

А если скрипт на питоне? Каждую фцию в try except MemoryError заворачивать?

питон настолько плох?

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

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

Нагрузка на систему может быть полезной (оставили обсчет на ночь) и автомат может решить что именно этот процесс надо убить.

Резервировать нужно для рута на крайний случай для избавления от хардресета.

memlockd

Ну вот это, да, примерно то что нужно.

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

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

Странно что memlockd в юзердистрах хотябы в init 5 не установлен и настроен из коробки.

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

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

Проведена значительная оптимизация производительности планировщика ввода/вывода BFQ. В условиях высокой нагрузки на ввод/вывод внесённые оптимизации позволяют до 80% сократить время таких операций, как запуск приложений;

http://www1.opennet.ru/opennews/art.shtml?num=51051

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

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

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

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

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

Где есть?)

Недавно случайно зашел на сайт азбуки вкуса. Хз что случилось, но система встала настолько колом, в tty не залогиниться - чтобы кильнуть браузер. Логин по 60сек таймауту отваливался. Понятно что LA засран, но кроме ресета ничего сделать не смог ) Ну ок это один только мой кейс, но периодически такое случается..

ppy ★★
()
Ответ на: комментарий от ppy
       /proc/sys/vm/admin_reserve_kbytes (since Linux 3.10)
              This file defines the amount of free memory (in  KiB)  on  the
              system  that  should be reserved for users with the capability
              CAP_SYS_ADMIN.

              The default value in this file is the minimum of [3%  of  free
              pages,  8MiB]  expressed  as  KiB.  The default is intended to
              provide enough for the superuser to log in and kill a process,
              if necessary, under the default overcommit 'guess' mode (i.e.,
              0 in /proc/sys/vm/overcommit_memory).

              Systems  running  in  "overcommit  never"  mode  (i.e.,  2  in
              /proc/sys/vm/overcommit_memory)  should  increase the value in
              this file to account for the full virtual memory size  of  the
              programs  used  to recover (e.g., login(1) ssh(1), and top(1))
              Otherwise, the superuser may not be able to log in to  recover
              the system.  For example, on x86-64 a suitable value is 131072
              (128MiB reserved).

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

Круто. Тогда следующий вопрос почему в юзердистрах оно не настроено из коробки?)

Но, да, возможно от дистра зависит..

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

Потому что в юзердистрах тебе сперва нужно переключиться из GUI в сосноль, что ЧАЩЕ ВСЕГО ЗАПРЕЩЕНО АХАХАХАХАХАХАХАХАХАХААХХА.

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

12309 в freebsd нет, а в linux есть

думаешь нет в мире людей которые способы это пофиксить?

гораздо проще и дешевле сказать «memory is cheap» и засунуть весь IO source в кеш чем искать и решать проблему


ух, я бы на их месте-то

Нет. Есть живой пример.

1) У меня стоит обычный мейнстримный линукс.
2) Я настроил в нём стандартными средстави переключение раскладки по Ctrl+Shift
3) Комбинации клавиш которые начинаются с Ctrl+Shift не будут работать ибо раскладка изменяется ПОСЛЕ НАЖАТИЯ на эти клавиши а не после их отпускания как это сделано в нормальных системах.

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

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

Тем временем мне надо делать работу а не накатывать сомнительные патчи, подключать сторонние репы с накатыванием X-ов неизвестно какой свежести (не факт что не будет чёрного экрана после ребута) и вообще мне щас не надо делать ребут, всё окружение блин поднято и настроено! НАДО РЕШАТЬ ПРОБЛЕМУ ПРЯМ ЩАС

Что сделал я? Взял да и начал писать юзер спейс прогу которая решат мою проблему.

Т.ч. ты там с пиздабольством повремени

reprimand ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.