LINUX.ORG.RU

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

 , ,

Выпуск 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 ()
Последнее исправление: Deleted (всего исправлений: 2)

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

anonymous
()

на самом деле проблема не в OOM а в том, что без overcommitа прекращают работать браузеры и прочее ПО.

vm.overcommit=2 и система уходит в жопу. своп на месте. я на знаю почему такого говно но оно есть.

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

В ядре 4.20 добавили подсистему PSI

Таки да, добавить его поддержку не должно составить большого труда.

В earlyoom также планируется поддержка PSI https://github.com/rfjakob/earlyoom/issues/100

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

Купите себе оперативы, достали уже.

Извините, мой ноут больше 8 гиг не поддерживает. На целый ноут денег пока нет.

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

Очнвидно, в Mac OS процессы на это соглашаются. В отличии от.

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

я может чего-то не понимаю, но в документации написано ХХХХ и исходя из этого мы ожидаем что с 2гигами мы сможем открыть yandex.ru а по факту мы закрываемся с ENOMEM. а винда открывает с гигом на том же браузере.

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

Не понимаю на сколько это не нужно.

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

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

я может чего-то не понимаю, но в документации написано ХХХХ и исходя из этого мы ожидаем что с 2гигами мы сможем открыть yandex.ru а по факту мы закрываемся с ENOMEM. а винда открывает с гигом на том же браузере.

XXXX? Насколько я вижу в Documentation/vm/overcommit-accounting.rst написано:

The Linux kernel supports the following overcommit handling modes
...
2       Don't overcommit. The total address space commit for the
        system is not permitted to exceed swap + a configurable amount
        (default is 50%) of physical RAM.  Depending on the amount you
        use, in most situations this means a process will not be
        killed while accessing pages but will receive errors on memory
        allocation as appropriate.

«default is 50%» это про vm.overcommit_ratio

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

мне срать что там в документации написано. я пишу про то, чем заканчивалась команда sysctl vm.overcommit=2. а заканчивалась она нерабоспособным десктопом где не запускалось ничего.

i36_zubov
()

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

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

Твои бы усилия направить на что-то полезное, глядишь, и деньги бы появились.

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

Ну что ты несёшь. Почему потребляди сразу? Если чуваку памяти не хватает, то надо память покупать, а не процессы валить.

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

Если чуваку памяти не хватает, то надо память покупать, а не процессы валить.

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

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

С чем разбираться-то? Ну вот жрёт нужный ему софт больше чем у него есть, и ничего ты с этим не поделаешь. Или твоё «разобраться» означает переписать всё нахер?

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

и ничего ты с этим не поделаешь.

Писать баг репорты, искать альтернативный софт, на худой конец-переписать.

Odalist ★★★★★
()

А если я знаю, что у меня конкретная софтина может выжрать всю память, засвопиться и поставить рабочую станцию раком, можно вот без этого пердолинга просто запустить с какой-то стандартной командой с лимитами-боксами-ещёкакойхнёй?

Чтобы вместо

./prog

было

die-if --exceeds-memory 50G ./prog

как-нибудь. Чтобы вот стандартными линуксовыми средствами и гарантированно?

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

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

WitcherGeralt ★★
()

Два вопроса автору.

  • Почему на Python?
  • Не особенно знаком с earlyoom, поэтому список фич не знаю. Но всё же, чем это лучше/хуже earlyoom? Если в earlyoom нет фич нужных, то почему не впилить в earlyoom фичи?
krautcat
()
Ответ на: комментарий от anonymous

Чтобы вот стандартными линуксовыми средствами и гарантированно?

cgroups, из того что для пользователя: docker или systemd-юниты и systemd-run

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

идея хорошая, но ведь он сразу браузер закрывать будет)))

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

А можешь написать, что конкретно делать или ткнуть хоть в гугл, хоть в доку с примером вот чтобы без пердолинга? Потому что на первой странице гугла по запросам systemd-run memory limit и cgroups memory limit — пердолинг.

Вот вроде бы что надо пример, но deprecated https://wiki.archlinux.org/index.php/cgroups

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

А можешь написать, что конкретно делать или ткнуть хоть в гугл, хоть в доку с примером вот чтобы без пердолинга?

Нет, в текущей ситуации «пердолинг» неизбежен.

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

die-if --exceeds-memory 50G ./prog

как-нибудь. Чтобы вот стандартными линуксовыми средствами и гарантированно?

Элементарно. man systemd-run

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

Та я не против.

А штука в целом нужная может быть. Только важно её научить не убивать всё подряд, а по приоритетам, так сказать.

У меня как-то бывало, что оперативка кончилась, система ушла в своп, всё висло настолько, что терминал не могу открыть, чтобы руками там что-то грохнуть... А, допустим, какой-нибудь ktorrent бы полетел первым под нож, а вот чтобы убивали мою idea или virtualbox, я бы не хотел. И у каждого свой список.

P.S. Хотя лучше, конечно, оперативки добавить.

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

Нет, в текущей ситуации «пердолинг» неизбежен.

У вас консенсус сломался.

systemd-run --scope -p MemoryMax=512M -p MemorySwapMax=0 bash -c ':(){ : $@$@;};: :'
intelfx ★★★★★
()
Ответ на: комментарий от intelfx

У вас консенсус сломался

При должном упорстве и это можно назвать пердолингом (какие-то непонятные буквы, сделайте чтоб работало уже), поэтому дискуссия не имела смысла.

feanor ★★★
()

Я не знаю насколько это не нужно, но у меня 256 Гб оперативы и даже когда моя игрушка на каждом кадре заново подгружала все текстуры в память, я этого не заметил.

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

Чувак попросил:

die-if --exceeds-memory 50G ./prog

Я предложил:

systemd-run --scope -p MemoryMax=512M -p MemorySwapMax=0 bash -c ':(){ : $@$@;};: :'

По-моему, достаточно похоже.

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

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

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

Почему на Python?

Питон - мой первый языка. Писал эту штуку с процессе прохождения курса по питону https://www.coursera.org/learn/diving-in-python Просто начал применять язык для актуальных для меня задач. О существовании earlyoom узнал уже в процессе написания nohang.

чем это лучше/хуже earlyoom?

Хуже earlyoom: вследствие питона большее потребление памяти и ниже скорость реакции (хотя ее все равно достаточно - обычно на на поиск жертвы уходит около 10 миллисекунд, что видно их картинки выше). Чем лучше earlyoom: больше фич, большая гибкость настроки. Все что можно было - вынес в конфиг, есть десятки опций конфигурации. Например, в earlyoom уведомления не легко включить из коробки, особенно на некоторых дистрах при запуске от рута. В nohang же уведомления включаются легкой правкой конфига и работают везде, где есть notify-send. Все те баги, которые фиксились в релизах earlyoom 1.1 и 1.2, уже отсутствуют в nohang.

Если в earlyoom нет фич нужных, то почему не впилить в earlyoom фичи?

Почти все фичи, впиленные в earlyoom 1.1 и 1.2, добавлены в него в процессе выноса мозга мной создателю earlyoom в его issues https://github.com/rfjakob/earlyoom/issues?q=is:issue is:closed Репортнул туда кучу багов и фичреквестов, большинство были закрыты.

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

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

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

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

А штука в целом нужная может быть. Только важно её научить не убивать всё подряд, а по приоритетам, так сказать.

Она умеет в prefer/avoid по сопоставлению имен с regex. Поддержку многоступенчатых приоритетов, чтоб для каждого имени задавать отдельный приоритет (типа oom_score_adj), планируется в будущем.

hakavlad ★★★
() автор топика

Я так понимаю это своеобразная борьба с «течкой памяти» в прогах.

Если челу надо обрабатывать фото/видео/аудио размером с 10 гиг, он, если конечно не упоротый, будет иметь на борту 64-и более гиг ОЗУ. Ну в крайнем случае вывернется порезав данные на мелкие куски, обработав их и склеив обратно.

Сомневаюсь, что чел на ноуте, имеющим ограничение по поддержке ОЗУ в 2/4/8Гб(в этом случае и проц кастратик какой-нить орбычно) будет запускать реально жрущие проги(я имею ввиду именно те, которым эта ОЗУ нужна, а не текущие мелкие поделки как дуршлаг).

Пусть у меня с 20 вкладок в гуглохроме(не понимаю как в них ориентироваться в этом случае, но не стоит свою мерку на всех примерять, может кому-то это комфортно...), но есть же свап, сам не раз ощутил, что линуха/фря, в отличие от винды(не буду говорить за мак, но уверен что так же как и фря),весьма адекватно себя ведёт при нехватке памяти. Да, появляются лаги, дающие понять юзеру - ты перестарался, но разгребает же, и пашет дальше, никаких мёртвых зависонов, никаких bsod`ов.

Спецом пытался валить. Штук 10 процессов, 4 штуки burnK7(по количеству голов в проце), остальные тупые мелкие(по 100Мб) malloc() в цикле на Си. За два часа работы так и не увалил. Первые минут 15 в гуглозонде вообще не ощущал что что-то там не так. Потом пошли подтормаживания, мелкие(лампа веника уже не гасла), но ещё терпимо(примерно так же, как, если бы винда умудрилась одновременно зарядить дефраг и установку пачки обнов), потом сильнее, дошло, до того, что по несколько минут не мог ничего в DE сделать, но стоит переключиться в консоль - и всё норм, да ps -A,top, free и т.п. запускаются по несколько минут, но пашут же, заразы.
Надоел этот експеримент и поубивал их всех. Через 10 сек - как и небыло этих мучений системы.

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

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

весь код в 1 файле

125 PEP8 ошибок

комментарии на русском

Спасибо, но нет.

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

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