【问题标题】:Checking for Linux capabilities to set thread priority检查 Linux 功能以设置线程优先级
【发布时间】:2017-11-21 15:35:26
【问题描述】:

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

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

【问题讨论】:

标签: c++ docker pthreads linux-capabilities


【解决方案1】:

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

试一试。

【讨论】:

  • 感谢您的回答,但我的意图确实相反。我想调低我的应用程序,而不是为容器提供更多功能。
  • 我希望我能投票两次!我知道 OP 想要做相反的事情,但我最终通过谷歌来到这里,因为我需要这样做。谢谢!
  • 很高兴知道它有帮助!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    pthread_setschedparam() 的人写道:

    有关所需权限及其效果的说明, 更改线程的调度策略和优先级,以及 每个调度策略中允许的优先级范围,请参见 时间表(7)。

    在 sched 的人中,它指出:

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

    更多信息可以关注http://man7.org/linux/man-pages/man7/sched.7.html

    【讨论】:

    • 如何检查我的进程是否有 CAP_SYS_NICE ?
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多