我有一个C 应用程序,该应用程序使用pthread_setschedparam()
设置线程优先级。在Docker容器内部,这会失败。
如何检测我的过程是否具有设置线程优先级的必要功能?
我猜您的C 应用程序能够设置线程优先级,因为在主机上它具有所需的Linux功能cap_sys_nice
可以使用此命令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
选项可能存在一些问题
最坏的情况:如果其中任何一个不起作用,请尝试使用--privileged
选项运行容器,这将添加所有Linux功能,尽管不建议使用。
尝试一下。
正确检查的正确方法只是尝试一下,看看是否获得EPERM
错误。一方面,LSM可以在允许的调度程序更改上设置任意规则。
因此,正确的事情可能只是在发生这种情况时仅记录警告(一次!)。
在 pthread_setschedparam()
的人中说:
描述了所需的权限和效果 更改线程的调度策略和优先级,以及 在每个调度策略中,允许的优先级范围,请参阅 调度(7)。
在调度效果的人中,
必须特权(cap_sys_nice)才能设置或修改线程 Sched_deadline策略
有关更多信息,您可以查看http://man7.org/linux/man-pages/man7/sched.7.html