【发布时间】:2021-02-01 14:28:00
【问题描述】:
我有一个应用程序检查 POSIX 环境是否可以通过调用将线程优先级设置为实时
struct sched_param param;
param.sched_priority = 1;
int canSetRealTimeThreadPriority = (pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m) == 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_usreturns1000000,这应该是默认的 -
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