我有一个使用pthread_setschedparam()
来设置线程优先级的C ++应用程序。在docker容器内部,这与EPERM失败。
如何检测我的进程是否具有设置线程优先级所需的功能?
答案 0 :(得分:2)
正确的检查方法就是尝试检查是否收到EPERM
错误。首先,LSM可以对允许的调度程序更改设置任意规则。
所以正确的做法可能只是在发生这种情况时记录警告(一次!)。
答案 1 :(得分:1)
在pthread_setschedparam()
的人中,它说:
有关所需权限的说明及其效果, 更改线程的调度策略和优先级,以及详细信息 每个调度策略中允许的优先级范围,请参阅 SCHED(7)。
在其他事情中,在其他事情中说:
线程必须具有特权(CAP_SYS_NICE)才能进行设置或修改 SCHED_DEADLINE政策
答案 2 :(得分:0)
我猜你的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
由于此处https://github.com/moby/moby/issues/25622
提及--userns
选项可能存在问题
最坏的情况:如果其中任何一个没有用,那么尝试使用--privileged
选项运行容器,这会将所有linux功能添加到此容器中,但不建议这样做。
试一试。