3

pthread_setschedparam()我有一个用于设置线程优先级的 C++ 应用程序。在 docker 容器内,这会因 EPERM 而失败。

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

4

3 回答 3

2

我猜您的 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 功能添加到该容器中,尽管不推荐这样做。

试试看。

于 2017-11-21T17:10:30.140 回答
2

正确的检查方法是简单地尝试一下,看看你是否得到EPERM错误。一方面,LSM 可以对允许的调度程序更改设置任意规则。

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

于 2017-11-21T23:19:06.043 回答
1

pthread_setschedparam()它的人中说:

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

在 sched 的人中,它特别指出:

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

有关更多信息,您可以查看http://man7.org/linux/man-pages/man7/sched.7.html

于 2017-11-21T15:46:00.487 回答