Автор Тема: РЕШЕНО jackd: Cannot use real-time scheduling (RR/20)(1: Operation not permitted  (Прочитано 9384 раз)

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Запускаю jackd, получаю ошибку:
Cannot create RT messagebuffer thread: Operation not permitted (1)
При этом, естественно, в группу audio мой пользователь входит, и файл /etc/security/limits.d/99-jack-audio-connection-kit.conf приехал вместе с остальным пакетом.

Вот тут пишут, что это связано с тем, что systemd игнорирует /etc/security/limits.d; но предлагаемый там рецепт — прописать в /etc/systemd/system.conf строчку:
DefaultControllers=у меня не сработал.

Есть какие-нибудь идеи, как получить нормально работающий jackd?
« Последнее редактирование: 09.05.2020 23:54:54 от yushi »

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Здесь пользователю помогло добавить в /etc/pam.d/lightdm (!!!) строчку
session   required pam_limits.so
Мне это не помогло.

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Здесь предложено решение, подход которого кажется правильным; но ни сервиса cgconfig, ни файлов /etc/cgconfig.conf и /etc/cgrules.conf в Alt Linux нет…

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Попробуйте установить qjackctl и поиграться опциями в нём.

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Попробуйте установить qjackctl и поиграться опциями в нём.

Я уже запускаю его из qjackctl. Из относящихся к делу опций там разве что «не использовать RT», но мне нужен Ardour, который без RT вообще не работает.

В любом случае, как опции qjackctl изменят поведение системы?

Задача — разрешить jackd работать в RT-режиме. Видимо, решение где-то в районе настроек systemd и/или механизма cgroups, как и пишут по ссылкам выше.

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
А что у Вас за аудиокарта?

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
А что у Вас за аудиокарта?

Ну, lspci говорит про неё
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA)
В общем, какая-то набортная.

Но в системе с SysVinit на той же машине jackd работал безо всяких проблем. Так что дело точно не в железе.

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
О, на форуме Ardour нашёлся человек с совершенно такой же проблемой в Ubuntu 20.04:
https://discourse.ardour.org/t/anyone-encountering-rt-jack-issues-after-upgrading-to-ubuntu-20-04-lts/103477

Он решил проблему абсолютно шаманскими методами (удалил openmpi, удалил snap, запретил apparmor — в любом случае этот метод неприменим в Альте), но там ему подсказывают отличный MWE:
$ ulimit -r
95
$ chrt -f 80 echo "I'm chrt'ed!"
chrt: failed to set pid 0's policy: Операция не позволена

То есть вопрос сужается от «что с джеком» до «как заставить работать команду chrt».
« Последнее редактирование: 01.05.2020 17:17:21 от yushi »

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
То есть вопрос сужается от «что с джеком» до «как заставить работать команду chrt».

А вот так:
sudo sysctl -w kernel.sched_rt_runtime_us=-1
После этой команды и jackd нормально запускается и работает.

Остался, правда, вопрос: что вся эта фигня значит? Очень хочется хотя бы кратких объяснений от людей, знающих потроха ядра в его современном состоянии.

Ну и да, нельзя ли как-то сделать так, чтобы jack в Альте был работоспособным «из коробки»?

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Ну и да, нельзя ли как-то сделать так, чтобы jack в Альте был работоспособным «из коробки»?

Оформите багу на jackd с рецептом.

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Ну и да, нельзя ли как-то сделать так, чтобы jack в Альте был работоспособным «из коробки»?

Оформите багу на jackd с рецептом.

Подождите, вообще-то пока никакого рецепта нет.

Если я правильно понимаю, приведённая выше команда — просто костыль, ломающий контроль потребления ресурсов процессора, и делать так вообще-то не надо. Если вместе с пакетом jack-audio-connection-kit на машину в /etc/sysctl.d будет приезжать файл, содержащий
kernel.sched_rt_runtime_us = -1пользователи проклянут мейнтейнера пакета и правильно сделают.

Джеку же не нужно всё процессорное время, ему нужно столько, сколько он просит. Задача в том, чтобы он мог корректно поменять свой приоритет на ходу; насколько я понял, это делается через механизм cgroups, в котором я ничего не понимаю. На вики или на этом форуме, насколько я понял, нет никаких описаний того, как рулить cgroups в Альте. Соответственно, очень хочется, чтобы в этом треде отметился кто-нибудь, кто умеет готовить systemd и cgrups и понимает хотя бы, как должно выглядеть правильное решение задачи.

Я бы бы, конечно, очень рад, если бы мейнтейнер jack-audio-connection-kit просто решил эту задачу за меня, но не уверен, что пакетом активно занимаются.
« Последнее редактирование: 01.05.2020 19:44:09 от yushi »

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Так. Чем больше я читаю про гарантии «реального времени» в планировщике ядра, тем меньше понимаю.

Вот у нас есть настройка /proc/sys/kernel/sched_rt_runtime_us. Если я правильно понимаю, она задаёт количество микросекунд, на которое приложения реального времени могут занять процессор в один период планирования (или -1, если мы разрешаем им занять всё время). Так как период планирования равен одной секунде:
$ cat /proc/sys/kernel/sched_rt_period_us
1000000
а в /proc/sys/kernel/sched_rt_runtime_us по умолчанию число 950000, каждую секунду задачи реального времени могут занять 0,95 с.

Дальше приложения могут с помощью системного вызова sched_setscheduler задавать себе приоритет, в том числе приоритет реального времени — числом от 1 до 99, которое означает долю времени ЦП, гарантируемого приложению.

Я (очень бегло) посмотрел исходники, похоже, в JACK именно это и происходит.

Здесь, насколько я понимаю, POSIX-версия реализации тредов в JACK пытается получить приоритет реального времени с помощью вызова функции pthread_setschedparam(): https://github.com/jackaudio/jack2/blob/0ee218826b299a95f937b7c88f10af56534d6cbd/posix/JackPosixThread.cpp#L244
Здесь pthreads зовут функцию __sched_setscheduler() из glibc: https://code.woboq.org/userspace/glibc/nptl/pthread_setschedparam.c.html#56
Реализацию этого дела в glibc для Linux я сходу не нашёл (здесь только заглушка, а как подставляется реализация для конкретной платформы, я не понимаю), но нет оснований полагать, что там что-то кроме системного вызова sched_setscheduler.

Пока всё понятно. Довольно логичная и простая система.

Но! Дальше на сцене появляются опция CONFIG_RT_GROUP_SCHED, Леннарт Поттеринг и cgroups — и всё безнадёжно запутывается.

Эта опция включена в стандартном альтовом ядре:
sudo cat /boot/config-5.4.31-std-def-alt1 | grep CONFIG_RT_GROUP_SCHED
CONFIG_RT_GROUP_SCHED=y

Если она включена, запуск приложений реального времени от непривилегированного пользователя становится невозможен, пока они не включены в некую группу, которой выделены ресурсы ЦП:
Цитировать
By default all bandwidth is assigned to the root group and new groups get the
period from /proc/sys/kernel/sched_rt_period_us and a run time of 0. If you
want to assign bandwidth to another group, reduce the root group's bandwidth
and assign some or all of the difference to another group.

Realtime group scheduling means you have to assign a portion of total CPU
bandwidth to the group before it will accept realtime tasks. Therefore you will
not be able to run realtime tasks as any user other than root until you have
done that, even if the user has the rights to run processes with realtime
priority!

В апреле 2008 Леннарт просит включить CONFIG_RT_GROUP_SCHED в ядре Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=442959 в надежде, что PulseAudio от этого станет работать лучше (уже смешно).

Но! В июне 2015 всё тот же Леннарт просит выключить CONFIG_RT_GROUP_SCHED в ядре Fedora!

И вот теперь у меня вопросы.
  • Зачем в std-def включена опция CONFIG_RT_GROUP_SCHED?
  • Как включивший эту опцию человек предлагает запускать от непривилегированного пользователя приложения, нуждающиеся в режиме реального времени (например, jackd)?
  • Можно ли, не меняя конфиг ядра std-def, сделать jackd работоспособным «из коробки»?
Люди, принимающие такие решения, вообще заглядывают на этот форум?

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
У нас есть ядро rt. Попробуйте его:

update-kernel -t rt

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
У нас есть ядро rt. Попробуйте его:

update-kernel -t rt

$ apt-cache show kernel-image-rt
Виртуальный пакет kernel-image-rt предоставляется следующими пакетами:
  kernel-image-rt#4.19.103-alt1.rt42:p9+247115.100.1.1@1582872587 4.19.103-alt1.rt42:p9+247115.100.1.1@1582872587
You should explicitly select one to show.
E: Package kernel-image-rt is a virtual package with multiple providers.

Кажется, здесь уместнее формулировка «у нас было ядро rt».

В любом случае, вопрос не в том, какой костыль выбрать для решения задачи (тот, что выше по треду, вполне работает), а как создатели дистрибутива предлагают решать эту задачу без костылей. Какой-то логикой же они руководствовались.
« Последнее редактирование: 03.05.2020 00:29:35 от yushi »

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
Кажется, здесь уместнее формулировка «у нас было ядро rt».

Оно на месте:
https://packages.altlinux.org/ru/p9/srpms/kernel-image-rt/rpms

С ядром rt должно работать без костылей (не проверял пока).