尽管使用 cap_sys_nice,但无法将线程优先级设置为实时
Cannot set thread priority to real time despite using cap_sys_nice
我有一个应用程序检查 POSIX 环境是否可以通过调用
将线程优先级设置为实时
struct sched_param param;
param.sched_priority = 1;
int canSetRealTimeThreadPriority = (pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m) == 0);
在一个系统上 system A
这有效,但在另一个 system B
上检查失败,我想找出原因。
在两个系统上:
应用程序通过服务启动脚本作为 systemd
服务启动。
在二进制文件 returns 中调用 getcap
cap_sys_nice+eip
.
服务脚本定义应用程序是 运行 由非 root 用户通过 User=[non root user]
服务脚本集LimitRTPRIO=20
调用sysctl -n kernel.sched_rt_runtime_us
returns950000
,应该是默认的
调用sysctl -n kernel.sched_rt_period_us
returns1000000
,应该是默认的
systemctl show [serviceName]
returns 其中 LimitRTPRIO=20
调用应用程序 运行ning 进程的限制 (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
和OS版本Red Hat Enterprise Linux Server release 7.4 (Maipo)
在 system A
上可以设置实时线程优先级:
- 内核版本为
3.10.0-957.56.1.el7.x86_64
和OS版本Red Hat Enterprise Linux Server release 7.6 (Maipo)
当我在 system A
上测试并通过 setcap '' [binary]
从二进制文件中删除 cap_sys_nice+eip
时,我也无法设置实时线程优先级。我假设 system B
上的某些设置会覆盖 cap_sys_nice
设置,因为它具有更高的优先级,所以我想知道那是什么。
原来无法在系统范围内设置实时线程优先级的原因是另一个服务 运行,它在服务脚本中定义了以下设置:
CPUShares=20
CPUQuota=500%
从脚本中删除这些设置并重新启动服务后,可以再次在系统范围内设置线程优先级。
我有一个应用程序检查 POSIX 环境是否可以通过调用
将线程优先级设置为实时struct sched_param param;
param.sched_priority = 1;
int canSetRealTimeThreadPriority = (pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m) == 0);
在一个系统上 system A
这有效,但在另一个 system B
上检查失败,我想找出原因。
在两个系统上:
应用程序通过服务启动脚本作为
systemd
服务启动。在二进制文件 returns 中调用
getcap
cap_sys_nice+eip
.服务脚本定义应用程序是 运行 由非 root 用户通过
User=[non root user]
服务脚本集
LimitRTPRIO=20
调用
sysctl -n kernel.sched_rt_runtime_us
returns950000
,应该是默认的调用
sysctl -n kernel.sched_rt_period_us
returns1000000
,应该是默认的systemctl show [serviceName]
returns 其中LimitRTPRIO=20
调用应用程序 运行ning 进程的限制 (
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
和OS版本Red Hat Enterprise Linux Server release 7.4 (Maipo)
在 system A
上可以设置实时线程优先级:
- 内核版本为
3.10.0-957.56.1.el7.x86_64
和OS版本Red Hat Enterprise Linux Server release 7.6 (Maipo)
当我在 system A
上测试并通过 setcap '' [binary]
从二进制文件中删除 cap_sys_nice+eip
时,我也无法设置实时线程优先级。我假设 system B
上的某些设置会覆盖 cap_sys_nice
设置,因为它具有更高的优先级,所以我想知道那是什么。
原来无法在系统范围内设置实时线程优先级的原因是另一个服务 运行,它在服务脚本中定义了以下设置:
CPUShares=20
CPUQuota=500%
从脚本中删除这些设置并重新启动服务后,可以再次在系统范围内设置线程优先级。