[英]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
服務啟動。
對二進制返回調用getcap
等cap_sys_nice+eip
。
服務腳本通過User=[non root user]
定義應用程序由非 root 用戶運行
服務腳本設置LimitRTPRIO=20
調用sysctl -n kernel.sched_rt_runtime_us
返回950000
,這應該是默認值
調用sysctl -n kernel.sched_rt_period_us
返回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
設置,因為它具有更高的優先級,所以我想知道那是什么。
原來無法在系統范圍內設置實時線程優先級的原因是另一個正在運行的服務,它在服務腳本中定義了以下設置:
CPUShares=20
CPUQuota=500%
從腳本中刪除這些設置並重新啟動服務后,可以再次在系統范圍內設置線程優先級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.