pthread_setschedparam()
我有一个用于设置线程优先级的 C++ 应用程序。在 docker 容器内,这会因 EPERM 而失败。
如何检测我的进程是否具有设置线程优先级的必要功能?
pthread_setschedparam()
我有一个用于设置线程优先级的 C++ 应用程序。在 docker 容器内,这会因 EPERM 而失败。
如何检测我的进程是否具有设置线程优先级的必要功能?
我猜您的 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 功能添加到该容器中,尽管不推荐这样做。
试试看。
正确的检查方法是简单地尝试一下,看看你是否得到EPERM
错误。一方面,LSM 可以对允许的调度程序更改设置任意规则。
因此,正确的做法可能只是在发生这种情况时记录一个警告(一次!)。
在pthread_setschedparam()
它的人中说:
有关更改线程调度策略和优先级所需的权限和效果的描述,以及每个调度策略中优先级允许范围的详细信息,请参阅 sched(7)。
在 sched 的人中,它特别指出:
线程必须具有特权 (CAP_SYS_NICE) 才能设置或修改 SCHED_DEADLINE 策略
有关更多信息,您可以查看http://man7.org/linux/man-pages/man7/sched.7.html