【问题标题】:Cannot set thread priority to real time despite using cap_sys_nice尽管使用 cap_sys_nice,但无法将线程优先级设置为实时
【发布时间】:2021-02-01 14:28:00
【问题描述】:

我有一个应用程序检查 POSIX 环境是否可以通过调用将线程优先级设置为实时

struct sched_param param;
param.sched_priority = 1;
int canSetRealTimeThreadPriority = (pthread_setschedparam(pthread_self(), SCHED_FIFO, &param) == 0);

在一个系统 system A 上这有效,但在另一个 system B 上检查失败,我想找出原因。

在两个系统上:

  • 应用程序通过服务启动脚本作为systemd 服务启动。

  • 在二进制上调用getcap 会返回cap_sys_nice+eip

  • 服务脚本定义应用程序由非root用户通过User=[non root user]运行

  • 服务脚本设置LimitRTPRIO=20

  • 调用sysctl -n kernel.sched_rt_runtime_us返回950000,这应该是默认的

  • 调用sysctl -n kernel.sched_rt_period_usreturns 1000000,这应该是默认的

  • systemctl show [serviceName] 等返回 LimitRTPRIO=20

  • 调用应用程序运行进程的限制(prlimit --pid [application_pid])会显示:

RESOURCE   DESCRIPTION                             SOFT      HARD UNITS
NICE       max nice prio allowed to raise             0         0
RTPRIO     max real-time priority                    20        20
RTTIME     timeout for real-time tasks        unlimited unlimited microsecs

system B 上不允许实时线程优先级:

  • etc/security/limits.conf 包含行
[non root user]    -    rtprio    20
  • 内核版本为3.10.0-862.el7.x86_64,操作系统版本为Red Hat Enterprise Linux Server release 7.4 (Maipo)

system A 可以设置实时线程优先级:

  • 内核版本为3.10.0-957.56.1.el7.x86_64,操作系统版本为Red Hat Enterprise Linux Server release 7.6 (Maipo)

当我在system A 上测试并通过setcap '' [binary] 从二进制文件中删除cap_sys_nice+eip 时,我也无法设置实时线程优先级。我假设system B 上的某些设置会覆盖cap_sys_nice 设置,因为它具有更高的优先级,所以我想知道那会是什么。

【问题讨论】:

  • 如果您尝试添加CAP_SYS_ADMIN,那么它会起作用吗?
  • 一句古老的格言:如果你使用优先级来使你的代码工作......你做错了。
  • 我可能会给 CAP_SYS_ADMIN 一个机会,但似乎这几乎等同于从 root 开始,在我的情况下应该避免这种情况。
  • "如果你使用优先级来使你的代码工作......你做错了"。这不是我的代码,所以我需要在不更改代码的情况下找到解决方案。实时线程优先级检查的根本原因是因为某些子进程旨在以更高的优先级运行,我认为这是出于性能原因。

标签: c++ pthreads rhel thread-priority


【解决方案1】:

原来无法在系统范围内设置实时线程优先级的原因是另一个服务正在运行,它在服务脚本中定义了以下设置:

CPUShares=20
CPUQuota=500%

从脚本中删除这些设置并重新启动服务后,可以再次在系统范围内设置线程优先级。

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多