Наблюдение за работой Nohang в мониторе ресурсов Gtop

Предотвращаем переполнение оперативной памяти (OOM) в Linux

Я уве­рен, что каж­дый поль­зо­ва­тель в сво­ей жиз­ни хоть раз стал­ки­вал­ся с явле­ни­ем пере­пол­не­ния опе­ра­тив­ной памя­ти или OOM (Out Of Memory). Все пом­нят как это про­ис­хо­дит: систе­ма вста­ёт раком колом, ядро начи­на­ет гру­зить сво­пом жёст­кий диск на 100%, хоро­шо если мож­но хоть кур­со­ром дви­гать, хотя это уже делу не помо­жет. В этом слу­чае помо­га­ет толь­ко пере­за­груз­ка. А ведь мы же толь­ко Libre Office с Chromium на 2 ГБ ОЗУ запу­сти­ли! Не понят­но, поче­му ядро Linux так пло­хо справ­ля­ет­ся с пере­пол­не­ни­ем опе­ра­тив­ки, но с этим явле­ни­ем мож­но успеш­но бороть­ся сво­и­ми сила­ми и при мини­му­ме наклад­ных затрат.

В борь­бе с явле­ни­ем OOM нам помо­жет Nohang – демон для GNU/Linux, предот­вра­ща­ю­щий наступ­ле­ние явле­ния пере­пол­не­ния опе­ра­тив­ной памя­ти устрой­ства путём при­ну­ди­тель­но­го завер­ше­ния «про­жор­ли­во­го» про­цес­са.

Принцип работы

Nohang в виде демо­на посто­ян­но нахо­дит­ся в опе­ра­тив­ной памя­ти устрой­ства (потреб­ля­ет ~10 Мб ОЗУ) и сле­дит за сво­бод­ным коли­че­ством опе­ра­тив­ной памя­ти и своп-раз­де­ла. Как толь­ко насту­па­ет усло­вие явной нехват­ки ОЗУ и сво­па (эти пара­мет­ры ука­зы­ва­ют­ся в кон­фи­гу­ра­ци­он­ном фай­ле при­ло­же­ния) Nohang при­ну­ди­тель­но завер­ша­ет «жир­ное» при­ло­же­ние, вызвав­шее нехват­ку опе­ра­тив­ной памя­ти устрой­ства.

В каче­стве при­ме­ра – скрин­шот окна мони­то­ра ресур­сов KDE, на кото­ром отоб­ра­же­на рабо­та демо­на Nohang.

Наглядная демонстрация работы Nohang по предотвращению переполнения ОЗУ
Нагляд­ная демон­стра­ция рабо­ты Nohang по предот­вра­ще­нию пере­пол­не­ния ОЗУ

На сред­нем гра­фи­ке вид­ны фак­ты наступ­ле­ния состо­я­ния OOM (пере­пол­не­ния памя­ти) ОЗУ ком­пью­те­ра, на кото­ром про­из­во­дил­ся экс­пе­ри­мент. Опе­ра­тив­ная память нака­чи­ва­лась бес­по­лез­ны­ми пусты­ми дан­ны­ми с помо­щью коман­ды:

tail /dev/zero

Осто­рож­но! Выпол­не­ние дан­ной коман­ды может при­ве­сти (и без уста­нов­лен­ных ути­лит вро­де Nohang – 100% при­ве­дёт) к пере­пол­не­нию опе­ра­тив­ной памя­ти устрой­ства и его зави­са­нию, сколь­ко бы ОЗУ в нём не было уста­нов­ле­но!

Как вид­но, после пер­вой попыт­ки своп запол­нил­ся на 100% (в каче­стве сво­па исполь­зо­вал­ся раз­дел zRam) так же, как и ОЗУ, после чего Nohang при­би­ва­ет про­цесс tail и опе­ра­тив­ная память сно­ва осво­бож­да­ет­ся, воз­вра­ща­ясь к зна­че­нию сво­бод­но­го места, кото­рое име­ла до нача­ла экс­пе­ри­мен­та. Инте­рес­но то, что своп оста­ёт­ся запол­нен­ным прак­ти­че­ски на 100%, но при сле­ду­ю­щих попыт­ках исчер­пать всю доступ­ную ОЗУ это не при­во­дит к зави­са­нию всей систе­мы, и Nohang сно­ва завер­ша­ет про­жор­ли­вый про­цесс tail, осво­бож­даю ОЗУ. По субъ­ек­тив­ным ощу­ще­ни­ям для поль­зо­ва­те­ля, про­ис­хо­дит крат­ко­вре­мен­ное под­тор­ма­жи­ва­ние систе­мы на пару секунд, после чего кон­троль над систе­мой воз­вра­ща­ет­ся без каких-либо про­блем. В общем – сказ­ка!

Установка Nohang в различных дистрибутивах Linux

Так как не все, как я, исполь­зу­ют в сво­ей рабо­те Arch Linux, рас­смот­рим про­цесс уста­нов­ки Nohang для всех самых попу­ляр­ных дис­три­бу­ти­вов.

Arch Linux, Manjaro Linux

pacaur -S nohang-git
sudo systemctl enable --now nohang

Debian GNU/Linux, Ubuntu, Linux Mint

Уста­нав­ли­ва­ем из Github:

git clone https://github.com/hakavlad/nohang.git
cd nohang
sudo make install-desktop
sudo make systemd

Если уве­дом­ле­ния на рабо­чем сто­ле не нуж­ны, заме­ня­ем «sudo make install-desktop» на «sudo make install»

Fedora, RHEL, openSUSE

sudo dnf copr enable atim/nohang
sudo dnf install nohang
sudo systemctl enable --now nohang

Настройка

Все пара­мет­ры Nohang настра­и­ва­ют­ся в кон­фи­гу­ра­ци­он­ном фай­ле

/etc/nohang/nohang.conf

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

Включение оповещений на рабочем столе

Что­бы вклю­чить всплы­ва­ю­щие опо­ве­ще­ния о нехват­ке ОЗУ и завер­ше­нии при­ло­же­ний Nohang, нуж­но в фай­ле кон­фи­гу­ра­ции изме­нить сле­ду­ю­щие пара­мет­ры на зна­че­ние «True» что­бы полу­чи­лось вот так:

post_action_gui_notifications = True
low_memory_warnings_enabled = True

После чего сохра­нить изме­не­ния в кон­фи­гу­ра­ци­он­ном фай­ле и пере­за­пу­стить Nohang для при­ме­не­ния новой кон­фи­гу­ра­ции:

sudo systemctl restart nohang.service

Проверка

Про­ве­ря­ем состо­я­ние демо­на Nohang:

sudo systemctl status nohang.service

Ста­тус рабо­ты дол­жен быть ука­зан зелё­ным цве­том:

Active: active (running)

Если так – Nohang запу­щен и рабо­та­ет нор­маль­но, мож­но при­сту­пать к экс­пе­ри­мен­там.

Сохра­ня­ем все несо­хра­нён­ные дан­ные во всех при­ло­же­ни­ях, дела­ем резерв­ные копии важ­ных дан­ных!

Это я на вся­кий слу­чай 😏 Что ж, ини­ци­и­ру­ем про­цесс накач­ки опе­ра­тив­ной памя­ти пусты­ми дан­ны­ми:

tail /dev/zero

И смот­рим что из это­го полу­чит­ся 😀 По идее, вы може­те почув­тво­вать непро­дол­жи­тель­ный дис­ком­форт, про­яв­ля­ю­щий­ся в зави­са­нии систе­мы на несколь­ко секунд, после чего Nohang дол­жен отра­бо­тать по tail и управ­ле­ние систе­мы вер­нёт­ся в ваши руки. А точ­нее, ско­рее все­го так и про­изой­дёт, что мож­но будет счи­тать успеш­ным дости­же­ни­ем постав­лен­ной цели.

Так же мож­но уста­но­вить более лег­ко­вес­ный мене­джер OOM – Earlyoom.