Cannot set thread priority to real time despite using cap_sys_nice

2.4k Views Asked by At

I have an application that checks on POSIX environment whether thread priorities can be set to real time by calling

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

On one system system A this works, but on another system B the check fails and I would like to find out why.

On both systems:

  • the application is started as a systemd service via a service startup script.

  • calling getcap on the binary returns among others cap_sys_nice+eip.

  • the service script defines that the application is run by a non root user via User=[non root user]

  • the service scripts sets LimitRTPRIO=20

  • calling sysctl -n kernel.sched_rt_runtime_us returns 950000, which should be the default

  • calling sysctl -n kernel.sched_rt_period_usreturns 1000000, which should be the default

  • systemctl show [serviceName] returns among others LimitRTPRIO=20

  • calling the limits on the running process of the application (prlimit --pid [application_pid]) will show among others:

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

On system B where it doesn't allow real time thread priorities:

  • etc/security/limits.conf contains line
[non root user]    -    rtprio    20
  • kernel version is 3.10.0-862.el7.x86_64 and OS version Red Hat Enterprise Linux Server release 7.4 (Maipo)

On system A where realtime thread priorities can be set:

  • kernel version is 3.10.0-957.56.1.el7.x86_64 and OS version Red Hat Enterprise Linux Server release 7.6 (Maipo)

When I test on system A and remove cap_sys_nice+eip from the binary via setcap '' [binary] I also cannot set real time thread priorities. I assume some setting on system B overrides the cap_sys_nice setting because it has a higher priority, so I wonder what that can be.

1

There are 1 best solutions below

0
JR_1 On BEST ANSWER

It turned out the reason why realtime thread priorities could not be set system wide was another service running, which had following settings in service script defined:

CPUShares=20
CPUQuota=500%

After removing these settings from the script and restarting the service, thread priorities could be set system wide again.