Ядро Linux не может мягко обрабатывать ситуации с нехваткой памяти. Как побороть?

vasek
А вот здесь нагружал даже сильнее, но память по нулям, IO тоже нормально - на диск ничего не пишется
Да, это уже как говорится с фактами в руках.
vasek
Чтобы топик был более полным/информативным отмечу два момента

>PS 1 - Для мониторинга использовал команду:

Для удобного мониторинга метрик PSI использую скрипт psi2log из пакета nohang (или nohang-git). Ман: https://github.com/hakavlad/nohang/blob/master/docs/psi2log.manpage.md

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

Примеры вывода:

https://gist.github.com/hakavlad/3d2ae89993d32a4514a06ee4d6b67bdd - avg10, avg60, avg300 под нагрузкой из циклов tail /dev/zero.

https://gist.github.com/hakavlad/40500c989475bc51e90b624d0843fb5b - мониторинг с двухсекундным интервалом.

В конце выводит пиковые значения за период наблюдения.
https://gist.github.com/hakavlad/60575a8393ac6561904f46b0356ebfdb - сравнение отзывчивости десктопа с демонами и без на примере способности системного монитора рисовать ровные линии, без его зависания под нагрузкой. Применение комбинации prelockd+memavaild дает наилучший эффект.

Настройка memavaild 0.6 для сохранения отзывчивости при запуске жирных фоновых процессов - https://gist.github.com/hakavlad/f3b41f0dc4324f110eefcda59c101081

Сегодня вышел prelockd 0.9 - https://github.com/hakavlad/prelockd/releases/tag/v0.9 - теперь по умолчанию блокируется код не всех процессов, а только наиболее важных для отзывчивости.
Расскажу о своем конфиге, каким бы я пользовался (примерно такой и используется в большинстве демо).

10 гиг памяти есть, swap on zram (disksize=10G), swappiness=100 (устройство zram работает намного быстрее моего hdd, поэтому имеет смысл более агрессивный своппинг). Своп на диске не нужен.

nohang-desktop в дефолтах. В prelockd я бы предпочел блокировать все и много - вплоть до гигабайта - при этом при даже видос в браузере не икает при интенсивном своппинге, и вы видели демо - игры со стрессами идут гладко.

В конфиге memavaild я бы предпочел выставить
$CANCEL_LIMITS_BELOW_SWAP_FREE_MIB=0
- никогда не снимать лимиты, всегда стараться держать доступную память. Это помогает юзерспейсному киллеру завершить свою работу несмотря ни на что (nohang запускается в отдельном слайсе, который не ограничивается с помощью memavaild).
Очень давно не соберусь отметить этот факт. Сегодня дошли руки. Earlyoom, оказывается, стучится в сеть. Не понравилось мне это. Скрин дополнительных настроек Networkmanager'a прилагается.

vall
Earlyoom, оказывается, стучится в сеть
но не во внешнюю сеть (не в интерент) - можешь помониторить, например, iptraf-ng (если подробно) ... но можно и просто netstat или ss
В части сокетов, как пример
sudo netstat -np | egrep 'earlyoom|tilix'
unix  3      [ ]         STREAM     CONNECTED     19832    460/tilix
unix  3      [ ]         STREAM     CONNECTED     19829    460/tilix
unix  3      [ ]         STREAM     CONNECTED     19282    460/tilix
unix  3      [ ]         STREAM     CONNECTED     17198    337/earlyoom
unix  3      [ ]         STREAM     CONNECTED     19260    460/tilix
и для сравнения браузер, palemoon
sudo netstat -np | grep palemoon
tcp 0 0 xxx.120.90.215:42458 x.255.255.50:443 ESTABLISHED 98000/palemoon
tcp 0 0 xxx.120.90.215:36772 xx.158.134.91:443 ESTABLISHED 98000/palemoon
tcp 0 0 xxx.120.90.215:46388 xxx.154.131.216:443 ESTABLISHED 98000/palemoon
tcp 0 0 xxx.120.90.215:46384 xxx.154.131.216:443 ESTABLISHED 98000/palemoon
unix 3 [ ] STREAM CONNECTED 143603 98000/palemoon
unix 3 [ ] STREAM CONNECTED 143602 98000/palemoon
unix 3 [ ] STREAM CONNECTED 143598 98000/palemoon
unix 3 [ ] STREAM CONNECTED 141098 98000/palemoon
unix 3 [ ] STREAM CONNECTED 141103 98000/palemoon
unix 3 [ ] STREAM CONNECTED 142792 98000/palemoon
Ошибки не исчезают с опытом - они просто умнеют
vasek
но не во внешнюю сеть (не в интерент)
Спасибо за расклад. Однако хотелось бы услышать от hakavlad -- что это за функционал и для чего служит.
vall
хотелось бы услышать от hakavlad – что это за функционал и для чего служит.
Лучше рекомендую ознакомиться с термином сокет - что этот такое и для чего нужны … если в кратце, то и упрощенно ...

Практически каждая операционная система является многозадачной, то есть одновременно может быть запущено несколько программ. Каждая запущенная программа по существу является процессом грубо говоря каждая запущенная команда порождает как минимум один процесс, который имеет свой уникальный номер, так называемый process ID (PID).
Но эти процессы в большинстве случаев не изолированы от других процессов и не могут существовать без взаимодействия с другимит процессами (например, с теми же ядерными процессами) …. и вот тут то появляется понятие сокет, которые обеспечивают двухстороннюю связь между двумя процессами и являются основными компонентами межсистемной и межпроцессной связи. То есть процессы взаимодействуют только через сокеты.
Согласно DOC имеется свыше 2-х десятков классов сокетов, из которых наиболее распространенные (наиболее часто используемые) это UNIX-сокеты и Inet-сокеты, которым присваиваются свои определенные имена:
- Inet-сокеты - обеспечивают связь между сетевыми процессами (на уровне TCP/IP протоколов, именуются с помощью IP адресов и номеров портов)
- Unix-сокеты - обеспечивают связь между процессами файловой системы (сокетам даются имена объектов типа socket в файловой системе)

Почему NetworkManager видит Unix-сокет? - предположу, что это обусловлено тем, что Unix-сокеты, являются по сути байтовыми потоками и очень похожи на сетевые соединения (Inet-сокеты,) но при этом все данные остаются внутри одного компьютера … то есть обмен данными происходит локально.

PS - netstat видит/показывает все сокеты
Ошибки не исчезают с опытом - они просто умнеют
Более чем информативно; в очередной раз разъяснили. Спасибо.
vall
vasek
но не во внешнюю сеть (не в интерент)
Спасибо за расклад. Однако хотелось бы услышать от hakavlad – что это за функционал и для чего служит.

"earlyoom will send a dbus message to the system bus, and there will be tiny notification daemon running as the user that listens for those messages"
https://github.com/rfjakob/earlyoom/issues/183

Возможно, это для уведомлений - общение с dbus. Включена ли опция -n?

По поводу безопасности - https://github.com/rfjakob/earlyoom/blob/master/earlyoom.service.in - у демона закалённый юнит, работает от случайного юзера, не имеет доступа к домашке, украсть ничего не сможет, даже если в коде появится такая фича.
 
Зарегистрироваться или войдите чтобы оставить сообщение.