У меня есть приложение C ++, которое использует pthread_setschedparam()
установить приоритет потока. Внутри док-контейнера это не работает с EPERM.
Как я могу определить, обладает ли мой процесс необходимыми возможностями для установки приоритета потока?
Правильный способ проверить это просто попробовать и посмотреть, получите ли вы EPERM
ошибка. С одной стороны, LSM могут устанавливать произвольные правила для допустимых изменений планировщика.
Так что, вероятно, правильно сделать, просто записать предупреждение (один раз!), Когда это произойдет.
В человеке pthread_setschedparam()
Говорится:
Для описания разрешений, необходимых для, и эффекта,
изменение политики планирования потока и приоритета, а также детали
допустимые диапазоны для приоритетов в каждой политике планирования, см.
Sched (7).
В человеке Щеда это заявляет среди прочего:
Поток должен быть привилегированным (CAP_SYS_NICE) для установки или изменения
политика SCHED_DEADLINE
Для получения дополнительной информации вы можете посмотреть на http://man7.org/linux/man-pages/man7/sched.7.html
Я предполагаю, что ваше приложение C ++ может установить приоритет потока, потому что на хосте оно имеет необходимые возможности Linux cap_sys_nice
Все возможности Linux на хосте могут быть выяснены с помощью этой команды capsh --print
Здесь, внутри docker conatiner, вам нужно установить эту возможность, используя --cap-add
вариант.
docker run -it --rm --cap-add SYS_NICE ubuntu bash
Если это не сработало, попробуйте это
docker run -it --rm --userns host --cap-add SYS_NICE ubuntu bash
Так как может быть какая-то проблема без --userns
вариант, как упомянуто здесь https://github.com/moby/moby/issues/25622
В худшем случае: если что-то из этого не сработало, попробуйте запустить контейнер с --privileged
опция, это добавит все возможности Linux в этот контейнер, хотя это не рекомендуется.
Попробуйте.