LINUX.ORG.RU

Выпуск Nohang v0.1 - демона, предотвращающего OOM в пространстве пользователя

 , ,


2

1

Nohang - это демон для GNU/Linux, обрабатывающий ситуации нехватки памяти и предотвращающий OOM. Код открыт под лицензией MIT. Написан на Python, потребляет около 10 MiB VmRSS и настраивается с помощью редактирования конфига, расположенного по адресу /etc/nohang/nohang.conf. По сравнению с аналогичным проектом earlyoom, nohang обладает некоторыми дополнительными возможностями.

Основные особенности:

  • настраиваемая интенсивность мониторинга: если на сервере не предполагаются резкие перепады потребления памяти, то можно снизить нагрузку на процессор, снизив интенсивность мониторинга;
  • при нехватке памяти nohang сначала отправляет SIGTERM процессу с наибольшим oom_score. При дальнейшем падении уровня доступной памяти и отсутствии реакции на SIGTERM процесс с наибольшим oom_score получает SIGKIL. Уровни доступной памяти, при достижении которых должны происходить корректирующие действия, могут задаваться в процентах и в MiB;
  • возможность GUI уведомлений о результатах завершения процессов (реализовано с помощью notify-send);
  • возможность GUI уведомлений о низком уровне доступной памяти: настраиваемость уровня памяти, при котором отправляются уведомления, и минимальная периодичность уведомлений (по умолчанию уведомления отключены; уровни памяти для отправки: одновременное снижение уровней SwapFree и MemAvailable до 20%; минимальный период между отправками уведомлений - 20 секунд). В уведомлениях отображается уровень доступной памяти, а также Pid и Name процесса с наибольшим badness;
  • поддержка zram - mem_used_total в качестве триггера (может быть актуально для систем с большим disksize и низкой степенью сжатия сохраняемых в zram данных);
  • предохранение от убийства невинных жертв: задержки после отправки сигналов (по умолчанию 0.5 секунд для SIGTERM и 3 секунды для SIGKILL) предотвращают возможное массовое убийство процессов, так как память при завершении процессов может освобождаться не сразу; возможность игнорировать процессы, имеющие badness ниже заданного;
  • возможность модификации badness процессов перед выбором жертвы через сопоставление имён процессов с заданным в конфиге регулярным выражением;
  • возможна настройка запуска произвольной команды (например, sendmail или systemctl restart) вместо отправки сигнала SIGTERM жертве, если имя процесса-жертвы совпадает с заданным в конфиге именем.

>>> Подробности

★★

Проверено: Shaman007 ()

хорошая идея

хорошая идея,
спасибо!

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

Ну вот я тестю на ноут 4 года назад поставил дебиан. Давай, объясни ему, что это за херня и зачем это нужно.

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

Это для facebook oomd

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

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

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

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

Про сравнение с earlyoom спасибо. Теперь понятно, вследствие чего проект появился.

Почти все фичи, впиленные в earlyoom 1.1 и 1.2, добавлены в него в процессе выноса мозга мной создателю earlyoom в его issues

Ы, тоже хорошо.

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

Ты коммитить что ли собрался туда? Почему тебя вообще беспокоит, сколько стилевых ошибок в коде программы, которую требуется просто запускать согласно ману?

Ты когда готовую еду покупаешь, ты состав смотришь или просто ешь?

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

die-if --exceeds-memory 50G ./prog
как-нибудь. Чтобы вот стандартными линуксовыми средствами

Кажется в баше ulimit может потребление памяти ограничивать. Или это только у меня так?

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

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

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

Без натянутых аналогий ответ будет? Итак, ещё раз, чем тебе лично тебе мешают ошибки PEP8 и комментарии на русском?

Crocodoom ★★★★ ()

демон предотвращает OOM, путём создания ПРЕЖДЕВРЕМЕННОГО oom.

оригинально! :-)

, то есть теперь оперативной памяти останется ещё меньше, так как процессы будут ВЫЛИТАТЬ (с пинка демона) даже когда памяти будет ещё оставаться свободно.. ЛОЛ.

какой гений придумал это

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

Ладно остальное, а комментарии тебе чем не угодили?

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

Тут уже по личным предпочтениям, у oomd конфиг на json и публичная документация ещё не очень подробна, кому-то это понравится, кому-то нет.
У oomd богато, что возможны плагины, nohang проще захачить напрямую т.к. по-сути скрипт.

Мне лично проще читать код на C или Python, чем C++, но кому-нибудь другому наверняка проще наоборот.

feanor ★★★ ()

демон предотвращает OOM, путём создания ПРЕЖДЕВРЕМЕННОГО oom.

Низкий уровень памяти - это еще не ООМ. В имеющемся небольшом объеме памяти соханится страничный кэш, вместо его почти полного исчерпания при настоящем ООМ. Сохранение запаса памяти позволяет системе не тормозить в процессе предотвращеия ООМ и постоянно сохранять достаточный уровень отзывчивости.

hakavlad ★★ ()

клёвая штука, особенно на ноуте

но обязательно нужно конфигурировать, благо конфиг подробно прокомментирован

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

для этого достаточно настроить несколько параметров в /proc/sys/vm/

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

Мне вот это понравилось

# возможность запрета самоубийства
mahalaka ★★ ()
Ответ на: комментарий от vasya_pupkin

А в macos, в случае близком к OOM, процессам приходит сообщение от ОС освободить память по максимуму (освободить кеши, ...)

И как это помогает ?

Я вот без понятия, как оно работает. Но при ситуации нехватки памяти MacOS себя ведёт на порядок лучше.

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

Мне лично проще читать код на C или Python, чем C++

Удачи в понимании большого проекта на С

Вот curl перед сном почитай

fornlr ★★★★★ ()
Последнее исправление: fornlr (всего исправлений: 1)

Подумал-подумал - и убил сам себя за ненадобностью.

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

зачем объяснять это обычным людям? вы бредите.
а в нормальных дистрибутивах он будет в поставке по умолчанию.

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

Если человек не удосужился даже по кодстайлу писать - с огромной долей вероятности его ПО будет работать некачественно.

+ dikiy Комментарии на русском мешают участвовать в разработке всем желающим, например.

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

Проблема в том, что там полная каша-какаша

Когда рядом английский комментарий, а к нему парный (!) на русском.

И это и кода касается

 if niceness is None:
        print('Invalid niceness value, not integer\nExit')
        exit()
    if niceness < -20 or niceness > 19:
        print('Недопустимое значение niceness\nExit')
        exit()

Ну просто такой вот кусок монолитного того самого...

ЗЫ: а вы ещё про какой-то там мудрённый кодестайл

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

Чем чаще я читаю подобные новости, тем больше мне хочется поставить винду.

А вот это лечится покупкой виндопланшета с 1 гигом памяти и десяточколй на борту. Они конечно все вымерли и заменились виндопланшетами с 2 гигами, но у двухгигового лечебный эффект не так выражен.

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

Почему сразу переписать? Сначала надо подумать, а ему вообще зачем столько? А потом надо поменять на процесс, который впишется в данное конкретное оборудование и сможет выполнить задачу. Их много всяких разных написано. Иногда какой нибудь oldstable релиз справится значительно лучше.

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

А проблема 90% в том, что какой то прогер экономит себе сколько то часов рабочего времени и берёт очередной суперфреймворк для эффективной разработки. Потом получается жирное и тормозное решение, оно тиражируется на 10К+ пользователей, становится мейнстримом и всем недовольным предлагается поменять железо.

Я могу понять, когда приложению нужно ворочать массив из 20Гб данных в 21Гб памяти, но когда кто то пишет питоновый скрипт с требованием 10М памяти для того, чтобы прочитать конфиг и следить за значениеи пары параметров в системе, это уже за гранью. Серьёзно, /bin/sh в тысячу раз сложнее и требует в сотню раз меньше ресурсов.

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

Почему на Python?

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

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

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

Простой кейс - фарфокс, который внезапно начинает жрать память и приводит систему в состояние стояния колом. Снять процесс невозможно, потому что ничего не реагирует. Но если убить файрфокс или даже соответствующий процесс «Web-content» то система сразу работает как часы, а страничку можно перезагрузить по f5.

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

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

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

ulimit не работает, ну или напиши как, пожалуйста. Выше было

ulimit -v 50000000; ./prog

так ничего не происходит в убунте, по крайней мере.

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

zram, zswap, параметры свопинга вроде swappines, cgrops на память, настроить работу диска на своп (или дисков), приоритеты своп-разделов, cgrops на i/o. Думаю ещё о каких то тонких настройках я просто не знаю.

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

Да всё равно всё через попу для десктопа. Крути-верти — особой разницы не будет

В ядре просто на это не приоритет.

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

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

OOM killer вроде бы не только для десктопа аварийное средство. Вроде сегфолта или магических комбинаций для ребута.

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

+ dikiy Комментарии на русском мешают участвовать в разработке всем желающим, например.

это не нендостаток прям такой серьезный. Любой может взять и перевести комментарии на англ

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

Сохранение запаса памяти позволяет системе не тормозить в процессе предотвращеия ООМ и постоянно сохранять достаточный уровень отзывчивости.

звучит в стиле «повышение пенсионного возраста заставит стариков дольше жить» :-)

ты делаешь «не ядерный» OOM для того чтобы «ядерный» OOM не произошёл. но зачем же нужна эта «отзывчивость» если программа уже упала (от «не ядерного» OOM) :-) ..

ды блин(!) стакой логикой можно было бы и вообще не включать компьютер — тогда точно «ядерный» OOM не случился бы :-D.

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

Шаман Вернулся И Модерирует. полный швим же Щ

etwrq ★★★★ ()

интересно, что об этом думае джавЭ?

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

Я вот без понятия, как оно работает. Но при ситуации нехватки памяти MacOS себя ведёт на порядок лучше

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

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

Xeon на десктопе?

Ну т.к. моим сервисом всё равно никто не пользуется, то я без зазрения совести использую сервер как десктоп.

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

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

Ну как есть вообщем. Про всякие кэши — это же так, не единственное.

Линукс становится раком 🦞 при исчерпании ОЗУ. MacOS нормально это обрабатывает.

Потому что эту проблему продумали в целом, а не так, что у нас тут что-то на это есть, тут что-то есть — можно настроить (в теоретической теории)

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

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

Пока такой оптмальный для desktop конфиг sysctl.conf :

vm.swappiness=20 vm.vfs_cache_pressure=1000 vm.overcommit_memory=1 vm.overcommit_ratio=75

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

MacOS нормально это обрабатывает

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

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

нормальной обработки такой ситуации не может быть в принципе

Может быть: «хозяин, тут попа начинается, вот тебе список приложений — закрывай чего-то , а то я дальше работать не буду».

Это десктоп, а не сервер или роутер.

fornlr ★★★★★ ()
Последнее исправление: fornlr (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.