检查Linuxfunction来设置线程优先级

我有一个使用pthread_setschedparam()来设置线程优先级的C ++应用程序。 在docker集装箱内,EPERM会失败。

如何检测我的进程是否具有设置线程优先级的必要function?

pthread_setschedparam()的人说:

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

除了其他的事情之外,

线程必须有特权(CAP_SYS_NICE)才能设置或修改SCHED_DEADLINE策略

欲了解更多信息,你可以看http://man7.org/linux/man-pages/man7/sched.7.html

正确的方法来检查只是试试看,如果你得到EPERM错误。 首先,LSM可以在允许的调度程序更改上设置任意规则。

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

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

主机上的所有linuxfunction都可以使用这个命令capsh --print来计算出来

在docker conatiner里面,你需要使用--cap-add选项来设置这个function。

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选项运行容器,这将所有的Linuxfunction添加到这个容器,虽然不build议。

试一试。