检查Linux功能以设置线程优先级

时间:2017-11-21 15:35:26

标签: c++ docker pthreads linux-capabilities

我有一个使用pthread_setschedparam()来设置线程优先级的C ++应用程序。在docker容器内部,这与EPERM失败。

如何检测我的进程是否具有设置线程优先级所需的功能?

3 个答案:

答案 0 :(得分:2)

正确的检查方法就是尝试检查是否收到EPERM错误。首先,LSM可以对允许的调度程序更改设置任意规则。

所以正确的做法可能只是在发生这种情况时记录警告(一次!)。

答案 1 :(得分:1)

pthread_setschedparam()的人中,它说:

  

有关所需权限的说明及其效果,        更改线程的调度策略和优先级,以及详细信息        每个调度策略中允许的优先级范围,请参阅        SCHED(7)。

在其他事情中,在其他事情中说:

  

线程必须具有特权(CAP_SYS_NICE)才能进行设置或修改          SCHED_DEADLINE政策

有关详细信息,请查看http://man7.org/linux/man-pages/man7/sched.7.html

答案 2 :(得分:0)

我猜你的C ++应用程序能够设置线程优先级,因为在主机上它具有所需的linux功能cap_sys_nice

使用此命令capsh --print

可以找出主机上的所有Linux功能

此处在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

由于此处https://github.com/moby/moby/issues/25622

提及--userns选项可能存在问题

最坏的情况:如果其中任何一个没有用,那么尝试使用--privileged选项运行容器,这会将所有linux功能添加到此容器中,但不建议这样做。

试一试。