LINUX.ORG.RU

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

Ну а при чем тут это. Во первых это не то, а во вторых когда вся озу заполнена swapoff высылается далеко и надолго далеко не самой цензурной лексикой.

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

Вот это пожалуй то что нужно, спасибо! Пойду курить мануал и писать обертку)

Serbis
() автор топика

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

Запускаем терминал, заходим из под рута и…

# Создаем группу контроля памяти с именем group0
mkdir /sys/fs/cgroup/memory/group0

# Устанавливаем лимит памяти группы
echo 1000M > /sys/fs/cgroup/memory/group0/memory.limit_in_bytes

# Запрещаем вытеснять процесс в swap
echo 0 > /sys/fs/cgroup/memory/group0/memory.swappiness

# Отключаем OOM для процессов в группе
echo 1 > /sys/fs/cgroup/memory/group0/memory.oom_control

# Заносим pid текущего шелла в группу
echo $$ > /sys/fs/cgroup/memory/group0/tasks

# Запускаем интересующую нас программу от нужного пользователя
su - serbis -c 'JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ /home/serbis/app/clion-2018.1.5/bin/clion.sh'

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

Serbis
() автор топика

Если ты разрабатываешь код этого процесса, тогда man mlockall

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

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

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

Это для группы процессов. Если он в группе будет один, то считай для одной конкретной программы. А никто не заставляет выключить своп полностью, ставь memory.swappiness больше нуля и будет использование свопа в заданных пропорциях. Плюс там есть еще вроде какое-то расширение, которое позволят прямо установить лимит свопа для заданной группы в байтах. Я уж не стал копаться, так как данный метод решает проблему на 110%.

У меня проблема связана работой на ноутбуке, так как на нем памяти мало, 8 Гб всего, пара ide + хром + сервер, все 8 гигов заняты и 5 гигов в свопе. Система превращается в слайдшоу, работаешь в ide, переключился на хром, все тормозит - хром с диска выгружается, при это через минуту начинает ide утекать на диск. Только хром вроде отвис, переключился на ide, теперь тут слайдшоу, и так по кругу. А данный метод направлен на то, что бы тупо не давать ide стекать на диск. Ну тормоза хрома я еще как-то переживу, но вот ждать пять минут потом пока ide отвиснет мне как-то ну очень не нравится. Ну и плюс тот факт, что все что работает на java, ест памяти в три-четыре больше памяти чем программе реально нужно. 1G вполне нормально для одного инстанса клиона.

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

Круто, спасибо. Я тогда майнкрафт запущу. Он один 7+ гигабайт выжирает и у меня всё зависает (перезапуск иксов не работает чего-то, не знаю). Хотя лимит стоит 3гб и жава всегда использует от 2 до 2.8, ха. Но не течёт так чтобы заметно, может часами быть 5.6гб и даже уменьшаться до 5.4.

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

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

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

Он не течет, у jvm есть такая область как metaspace, это данные вне хипа вм, они хранятся в нативной памяти и на них никак не влияют лимиты вроде -Xmx.

Serbis
() автор топика

Cgroups swapaccount

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

Да, мне нужна ваша помощь. Как теперь сделать чтобы когда ВСЯ память кончается OOM сразу прибивал браузер и не трогал жабу и остальное?

Когда ВСЯ память кончается, линукс зависает после нескольких секунд лагов, ООМ-killer никогда не приходит. На magic key он тоже не реагирует, можно только убить все процессы вместе с иксами (оконный менеджер при этом может упасть в инфинит луп не помню что он там делает но грузит 1 ядро целиком и не реагирует на сигнал terminate, только kill).

Так вот, как можно сказать ядру что браузер со всеми его 100 процессами мне не нужен? По идее браузер роняет вкладки когда памяти нет, но с жабой что-то не работает.

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

Вся память кончается где? В контрольной группе или в системе?

  1. Java при получение отказа на выделение области нативной памяти виснет (по крайней восьмая версия). Если это случается, значит ей точно не хватает памяти и нужно либо разрешить использовать своп либо увеличить объем озу. Это утверждение справедливо как для cgroups так для процесса вне него.

  2. Что бы браузер убивался OOM а джава нет, нужно создать вторую контрольную группу. В первой будет джава, во второй браузер. У группы джавы OOM выключен у бразера включен. Если браузер оборзеет, его грохнут, если джава сделает то же самое, то это уже дело самой джавы. Как показывает практика, она просто вешается. Ну память соответственно поделить разумно между данными группами.

  3. У большинства браузеров есть дополнения для выгрузки вкладок, для хрома это The Great Suspender. С ним у меня браузер редко съедает больше 500 мб озу.

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

Как теперь сделать чтобы когда ВСЯ память кончается OOM сразу прибивал браузер и не трогал жабу и остальное?

oom_score_adj браузеру настроить, а киллера вызывать через Alt-SysRq-F

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

Alt-SysRq-F не работает ваще (без жабы кое-как работает, если это не гцц пытается скомпилировать в 4 потока), только Alt-SysRq-E. Жаба и звук в плеере сразу развисают, только иксы умирают при этом — может их запиннить как-то?).

Сейчас попробую поиграться с oom-score, сообщу результат. Так-то у браузера и так adj 300 стоит, должен умирать наверно? Попробую с 1000.

anonymous
()

У меня проблема связана работой на ноутбуке, так как на нем памяти мало, 8 Гб всего, пара ide + хром + сервер, все 8 гигов заняты и 5 гигов в свопе. Система превращается в слайдшоу, работаешь в ide, переключился на хром, все тормозит - хром с диска выгружается, при это через минуту начинает ide утекать на диск. Только хром вроде отвис, переключился на ide, теперь тут слайдшоу, и так по кругу.

Будущее, которое мы заслужили.

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

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

Serbis
() автор топика
Ответ на: комментарий от annulen

echo 1000 > /proc/$$/oom_score_adj что-то не выставляет скор для браузера, а как ещё для новых процессов выставить? запускать в кроне каждую секунду скрипт типа такого?

for i in `pidof opera`;do csadj=`cat /proc/${i}/oom_score_adj`; $((csadj+=700));echo $csadj >/proc/${i}/oom_score_adj; done

Это работает, но не для новых процессов. Хотя странно, вроде пишет oom_score_adj выставлен, а в dmesg только у bash 1000, у браузера дефолтные 300.

Alt-SysRq-F отработал кое-как, но кажется у жабы звук сломался? После 5 нажатий чуть отлагало и только тогда баш прибился, мне кажется оно лукавит в логе.

А что если я хочу при малейшем намёке на проблемы просто убить все процессы из группы процессов? Через убийство родителя не очень сработало.

В идеале конечно она должна бы спросить «бротишка у нас тут проблемки, выбери из списка кто тебе не нравится или я справлюсь сама, вот тут тебе кнопочка показать консольку где ты можешь посмотреть procfs или убить кого-нибудь ещё, а я пока всё заморожу чтобы ничего лишнего не потерять». Вот это я понимаю было бы удобство, а не тупо зависать и ни на что не реагировать как сейчас.

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

Это-то понятно, оно работает (и виснит адово, даже в варианте с adj_score башу несколько минут прошло с отправки Manual OOM execution).

Лучше расскажите как можно запиннить процессы чтобы они игнорировали terminate, — при отправке Terminate All Tasks умирают syslog и всё остальное (самое болезненное dhclient и dbus), но su bash сессия в tty по-моему активна осталась, значит приложение спокойно может игнорить сигнал?

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

В моём дистрибутиве нет системд к сожалению, в моём гугле мне рассказали, что с такими задачами стоит обращаться к нему. Поро запиннить ничего нет, я знаю только гугловский breakpad умеет принуждать приложение игнорить некоторые определённые сигналы (скажем trap), стоит смотреть в эту сторону?

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

значит приложение спокойно может игнорить сигнал?

Приложение само обрабатывает сигнал, поэтому может. Все, кроме 9, который обрабатывает ядро и тут уже деваться некуда.

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

Да, отправка сигнала trap стиму роняла стим, но не трогала его детей (типа борьба с 10000 часов на счётчике дотки), по-моему потом они добавили breakpad и стим стал игнорировать сигналы.

Как мне теперь это использовать на примере dbus и syslog-ng? Я могу поставить нормальный rsyslog если это поможет.

anonymous
()

Есть ли какой-то действенный способ

А «изкаробочные» решения на базе cgroup не пробовал?: ulatency + ulatencyd (https://pkgs.org/download/ulatency). Мне понравилась отзывчивость системы с этим демоном.

zvezdochiot

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

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

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