Проверка возможностей Linux для установки приоритета потоков

У меня есть приложение C ++, которое использует pthread_setschedparam() установить приоритет потока. Внутри док-контейнера это не работает с EPERM.

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

3

Решение

Правильный способ проверить это просто попробовать и посмотреть, получите ли вы EPERM ошибка. С одной стороны, LSM могут устанавливать произвольные правила для допустимых изменений планировщика.

Так что, вероятно, правильно сделать, просто записать предупреждение (один раз!), Когда это произойдет.

2

Другие решения

В человеке pthread_setschedparam() Говорится:

Для описания разрешений, необходимых для, и эффекта,
изменение политики планирования потока и приоритета, а также детали
допустимые диапазоны для приоритетов в каждой политике планирования, см.
Sched (7).

В человеке Щеда это заявляет среди прочего:

Поток должен быть привилегированным (CAP_SYS_NICE) для установки или изменения
политика SCHED_DEADLINE

Для получения дополнительной информации вы можете посмотреть на http://man7.org/linux/man-pages/man7/sched.7.html

1

Я предполагаю, что ваше приложение 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 в этот контейнер, хотя это не рекомендуется.

Попробуйте.

0
По вопросам рекламы [email protected]