LINUX.ORG.RU

Когда nice не работает и процессы НЕвежливые

 ,


4

2

Отключать ли автогруппировку процессов чтобы позволить приоритетам nice работать глобально?

Как то раз я сидел за старым ноутом с core2duo и ждал, пока в qemu установится винХР. Просто сидеть и пялиться на него разумеется скучно, поэтому я сёрфил. Но так как основная задача всё-таки виртуалка, я выдал ей [найс](https://habr.com/ru/articles/106381/) -20. Но процесс установки шёл весьма неспешно, я наблюдал за htop и заметил, что любое шевеление браузера отбирает у qemu CPU до 50%, а если открывать 2 вкладки, то до 20-33% ядра. Выставляя процессу максимальный приоритет, я ожидаю совершенно не этого.

Пришлось разбираться в вопросе, что с найсом. Перекраивать вручную всю структуру слайсов systemd — удовольствие ниже среднего, так что cgroups лучше сразу забыть или отключить.

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

Вернуть старое поведение можно через echo 0 > /proc/sys/kernel/sched_autogroup_enabled

Пересаживаюсь на RPi4 (4 ядра/ 4 потока) и начинаю тестировать на примере нескольких копий pbzip2 и браузера.

Дефолтное поведение с автогруппировкой, при наличии 4 потоков фоновой нагрузки nice 19: любая средне- и высоко- приоритетная нагрузка 2-6 потоков получает от 180 до 240% ядра, значение nice не играет роли, только число потоков. Сёрфинг в браузере упирается в 2 ядра, причём ситуация даже хуже чем просто 2 ядра - рваная нагрузка видимо плохо сказывается на борьбе браузера за процессор.

Отключение автогруппировки: фоновая нагрузка просто исчезает из уравнения. Браузер работает так, как будто её нет. Но вот высокоприоритетная нагрузка в 4 потока легко ставит систему раком, отбирая процессорное время у всего, в т.ч. DE, звука, Х11. Достаточная отзывчивость сохраняется если ограничить nice -20 всего 3-я потоками pbzip2, с учётом dd всему остальному остаётся 50-70% ядра. Также имеется странность: запуск mpv под фоновой нагрузкой стал долгим, и полноэкранная картинка (на аппаратном ускорении) появляется с задержкой. Опция ignore_nice_load в планировщике начинает не создавать помехи, а работать как надо.

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

★★★★★

Проверено: hobbit ()
Последнее исправление: kirill_rrr (всего исправлений: 2)

как вариант вместо nice можно распределять процессы между ядрами.. вешая процессы на разные ядра..

vpnvpnvpn
()

Спасибо! Не знал, про эти автогруппы. Дурацкая штука, зря включена по умолчанию.

Сейчас глянул, что с чем сгруппировано… Только процессы фаерфокса между собой и всё. Ну ещё sway, waybar и Xwayland между собой тоже в одну группу сгруппированы. Остальное либо каждый в своей автогруппе, либо вне автогрупп.

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

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

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

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

https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html


А сабж ещё можно так сделать, если я правильно понимаю: добавить файл /etc/sysctl.d/no-autogroup:

kernel.sched_autogroup_enabled = 0

Добавил так, но лень сейчас ребутаться, чтобы проверить.

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

0_0

Не знаю... Или это BSD? Или что за ядро? Я всё таки не настолько глубоко копнул чтобы сказать все варианты при сборке.

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

Я в /etc/rc.local после sleep 10 добавил, вместе с прочим тюнингом. На ядре 6.1 отключается сразу для всего, даже если от руки подавать. Включение «на лету» не проверял.

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

Можно ещё виртуалке задать SCHED_BATCH вместо SCHED_OTHER:

chrt -p --batch [nice] [PID]

Получить список пидов всех потоков можно командой

ps -T -o tid -p [PID]
annulen ★★★★★
()
Ответ на: комментарий от kirill_rrr

У меня ядро самосборное 6.1.92. Может я там чего недовключил.

Как теперь проверить эту группировку?

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

Как теперь проверить эту группировку?

cat /proc/[0-9]*/autogroup

Если выдаёт список автогрупп и их niceness, то они есть. Если ничего не выдаёт, то эти автогруппы выключены.

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

Если выдаёт список автогрупп и их niceness, то они есть

Выдало кучу всего, значит есть.

И, мистика, появился

/proc/sys/kernel/sched_autogroup_enabled

И еще я нашел параметр

CONFIG_SCHED_AUTOGROUP=y

Может его сразу в конфиге вырубить? Это, кстати, даст возможность вообще отключить CGROUPS

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

И еще я нашел параметр

CONFIG_SCHED_AUTOGROUP=y

Может его сразу в конфиге вырубить? Это, кстати, даст возможность вообще отключить CGROUPS

Да, если ядро всё равно со своим конфигом пересобираешь, то проще тупо вырубить. У меня просто ядро из реп, как и у большинства.

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

А как потестить до и после? Чтобы оценить масштаб драмы.

П.С. пишут, что при отключении cgroups, системда падает в обморок и не может загрузить систему.

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

CGROUPS может и не надо отключать. А потестить… Ну запусти фигню тяжёлую в фоне, какой-нибудь там ffmpeg, перекодирование, или xz, а также запусти браузер или игрушку какую-нибудь. И смотри, работает ли выставление nice для браузера или игрушки (при nice 20 должна люто лагать, отдавая приоритет фоновому процессу, а при -20 наоборот должна не замечать, будто фонового и нет вовсе).

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

А сабж ещё можно так сделать, если я правильно понимаю: добавить файл /etc/sysctl.d/no-autogroup:

kernel.sched_autogroup_enabled = 0

Проверил, так не работает. Файл должен заканчиваться на .conf. Так — работает.

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

Лучше погонять пару-тройку месяцев с отключаемой опцией. Не будет косяков - вообще вырубить. То что высокм приоритетом надо очень аккуратно пользоваться это скорее фича чем баг, а вот «ленивое» поведение mpv может в итоге оказаться каким то глобальным косяком для плееров или ffmpeg.

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

А как потестить до и после?

Фоновый dd | pbzip2 отлично создаёт нагрузку, число потоков регулируется, расходом памяти можно пренебречь. Ну и браузер с тестовым пакетом сайтов на фоне нагрузки всё отлично покажет. К тому же - довольно частый реальный сценарий.

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

Отключал в самосборном ядре 4.4 на распбиан8 cgroups.mem, системд пережил спокойно. Отключение опцией при загрузке ядра тоже нормально работает. Отмонтирование всей псевдо-ФС на же загруженной системе косяков не вызывает.

А ещё мне кажется механизмы найс/автогруппировки и cgroups это разные механизмы. У них управляющие псевдо-фс разные.

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

а вот «ленивое» поведение mpv может в итоге оказаться каким то глобальным косяком для плееров или ffmpeg

Так плеер — это как раз самый важный процесс, если кино сидишь смотришь, разве нет? Ему не надо выше 0 niceness давать.

А вот какой-нибудь ffmpeg, который на ночь поставил «энкодить» какой-нибудь большой фильм, или процесс бэкапа, и всякая вот такая хрень, которая всё равно за какое время выполнится — вот её надо с nice -n 20 запускать, и пусть пыхтят себе там и не мешаются.

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

Запустил Кingmaker на телевизоре (через хдми) и наблюдал на основном мониторе. Изначально top показал nice=0, после renice -20 стало -20. то есть параметр переключается. Изменил на nice 19

Диких лагов лагов нет, ЧЯДНТ?

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

ffmpeg почему то и без найсов светится фоновым приоритетом в htop.

А с плеерами сложнее. Я тестировал только на RPi4, у меня mpv с частичным или почти полным ускорением на видеокарте. И вот что то сильно тормозит выход на это самое видеоускорение (в смысле под фоновой нагрузкой). Потом, когда плеер запущен и мониторр захвачен картинкой, тогда плееру хватает ~10-20% цпу причём частоты с 300-400Мгцу даже не поднимаются вверх (это если без нагрузки или с ignore_nice_load). Короче у меня странное поведение, хз как нормальные va-api/vdpau на х86_64 будут себя вести.

Забыл подчеркнуть: mpv у меня стал «ленивым» именно при наличии фоновой найс19-нагрузки. Т.е. в логику работы это не ложится.

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

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

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

Добавил так, но лень сейчас ребутаться, чтобы проверить.

sysctl --system [-p] ?

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

Вот если прям приглядываться, то с nice -20 система вроде как менее отзывчивая. Но это вот на уровне ощущений. Какие милисекунды там, здесь.

Вот бы в цифрах измерить.

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

Запустил Кingmaker на телевизоре (через хдми) и наблюдал на основном мониторе. Изначально top показал nice=0, после renice -20 стало -20. то есть параметр переключается. Изменил на nice 19

Диких лагов лагов нет, ЧЯДНТ?

Ты фоном запустил что-нибудь тяжёлое? Ну там, например компрессию в xz чего-то большого, или как выше предлагали, dd | pbzip2

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

У меня не «вроде как», а музыка сразу захлебывается и Х11 проваливается в жестокий sfp на любое действие. И даже tty. Похоже там есть ещё какой то механизм, который не даёт найс -20 сожрать всё.

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

Ты фоном запустил что-нибудь тяжёлое?

Pathfinder: Kingmaker

Ноут воет кулером, температура на всех ядрах 70+, трупобуст выключен.

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

Pathfinder: Kingmaker в роли фоновой нагрузки? Он хотя бы все потоки занимает? Ну, не считая того, что это скорее для ГПУ нарузка.

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

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

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

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

Ну вот смотри, я сейчас что сделал.

  1. В одном терминале: cat /dev/urandom | xz > /dev/null, в другом nice -n 0 firefoxhttps://browserbench.org/Speedometer3.0/ показывает скор 5.65
  2. В одном терминале: cat /dev/urandom | nice -n 20 xz > /dev/null, в другом nice -n 0 firefox — скор 9.6
  3. В одном терминале: cat /dev/urandom | xz > /dev/null, в другом nice -n 20 firefox — тормоза в браузере лютейшие, скора ждать до утра, в цифрах не скажу, но явно больше единицы.

Вот тебе наглядно в цифрах.

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

Он хотя бы все потоки занимает?

Не знаю, ядра все нагружены. Как проверить эти потоки?

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

Сайт спидометра заблочен в корпоративной сети, поэтому Нидерланды.

1. 1.96

2. 2.93

3. 2.03

вместо браузера - ангуглед хромиум.

П.С. xz показывал потребление цпу >700%

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

Разве SCHED_OTHER не приоритетние SCHED_BATCH? В исходниках ядра написано:

Batch and idle tasks do not preempt non-idle tasks (their preemption is driven by the tick)

mky ★★★★★
()

А установить приоритет для группы — нет такой возможности?

Кстати, насколько я помню, у core2duo ещё не было поддержки kvm.

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

А установить приоритет для группы — нет такой возможности?

Есть. Если не ошибаюсь, это делается так:

echo -20 > /proc/$PID/autogroup

Где -20 — желаемый найснесс, а $PID — PID любого процесса в группе.


upd: только есть одна проблема. Только что проверил, и… оно не работает нифига. Что с 19, что с -19 для группы firefox’а, результат по спидометру3.0 одинаковый.

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

Разве SCHED_OTHER не приоритетние SCHED_BATCH? В исходниках ядра написано

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

Вот что говорит об этом shed(7)

This policy is similar to SCHED_OTHER in that it schedules the thread according to its dynamic priority (based on the nice value). The difference is that this policy will cause the scheduler to always assume that the thread is CPU-intensive.  Consequently, the scheduler will apply a small scheduling penalty with respect to wakeup behavior, so that this thread is mildly disfavored in scheduling decisions.

This  policy  is  useful for workloads that are noninteractive, but do not want to lower their nice value, and for workloads that want a deterministic scheduling policy without interactivity causing extra preemptions (between the workload's tasks).
annulen ★★★★★
()
Ответ на: комментарий от utanho

utanho, CrX

Прогнал тесты Спидометра3.0, есть очень интересный WTF. Пи4, Вивальди, во всех тестах найс 0. Автогруппировка выключена со старта и она действительно выключена.

Без фона: 0,508

Фоновый dd if=/dev/urandom bs=4M | pbzip2 -c9 > /dev/null с найс 19: 0,524.
Возможно благотворное влияние перезапущенного kwin_x11, у меня сильная утечка разделяемой памяти. Возможно влияние динамической частоты с пассивным охлаждением, но по моим наблюдениям в тесте более 5 минут это не играет роли. Возможно влияние рваной нагрузки теста с задержкой выхода цпу на максимальную частоту (у меня conservative тюнингован на медленное поднятие и сильную прижимистость).

Фоновый dd if=/dev/urandom bs=4M | pbzip2 -c9 -p3 > /dev/null с найс -20. Обратите внимание, 3 потока, при 4 всё всаёт раком. Результат 0,182 +/- 0,067.

Так вот, WTF: я меняю приоритеты уже запущенных процессов через htop или renice, размеется от рута, циферки изменяются, а вот поведение - нет! Т.е. если dd | pbzip2 был запущен с найс 19, то он остаётся фоновым и не может стать средне- или высокоприоритетным, отобрать цпу у вивальди и поставить систему раком.

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

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

Что с 19, что с -19 для группы firefox’а, результат по спидометру3.0 одинаковый.

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

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

Я в курсе. Смотри выше, как я тестировал с отключенными автогруппами. (tl;dr — в фоне cat /dev/urandom | xz > /dev/null c дефолтным приоритетом).

Со включенными — естественно так же.

Вот с отключенными nice работает. А nice для автогрупп — как-то не особо.

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

Интересное наблюдение. Кстати, может из-за этого моё повышение приоритета для группы и не сработало — ведь оно делалось для уже запущенных процессов.

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

Не очень понятно: так а сколько у тебя ядер/потоков цпу и сколько из них ты грузишь? У меня xz бывает грузит всего 2, а бывает вообще 1 поток. Ну и от фокса можно ожидать 1-2 на вкладку, от игрушки тоже хз сколько.

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

8 ядер, 16 потоков, xz таким макаром грузит их все на 100%.

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

я меняю приоритеты уже запущенных процессов через htop или renice, размеется от рута, циферки изменяются, а вот поведение - нет!

И при этом chrt для всех процессов в pipe показывает SCHED_OTHER?

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

Да, и current scheduling priority при этом не меняется. А высокие найсы работают.

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

как вариант вместо nice можно распределять процессы между ядрами.. вешая процессы на разные ядра..

И с помощью isolcpu запретить планировщику шариться по этим ядрам, и самому подрабатывать планировщиком

blex ★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.