簡體   English   中英

盡管使用 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, &param) == 0);

在一個系統system A這有效,但在另一個system B上檢查失敗,我想找出原因。

在兩個系統上:

  • 該應用程序通過服務啟動腳本作為systemd服務啟動。

  • 對二進制返回調用getcapcap_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM