一、排程策略
排程程序
單個 CPU一次只能執行一個程序,雖然 Linux 系統透過使用多工同時處理多個程序,但當多個程序同時執行在一個CPU 上時,它透過交錯執行這些程序。
核心使用程序排程器來決定在某一時間點上哪個程序在執行。排程器必須平衡幾個選項:
-
快速決定下一個該執行的程序
-
程序可以公平的活動 CPU 時間,但高優先順序的程序會活動更多的執行時間並且可以搶佔低優先順序的程序。
-
響應有力的互動式應用程式
-
在各種工作負載下可預測和可擴充套件
程序優先順序
在 Linux 中,排程器根據分配給每個執行緒或程序的排程策略和優先順序來控制執行順序。
這些排程策略分為:實時策略和非實時策略。
排程策略
RHEL提供六種排程策略,分為實時排程策略和非實時排程策略。
1、實時
SCHED FIFO:不帶時間分片的先進先出策略。擁有該策略的程序會一直執行,直到被I/O 阻塞或是更改優先順序的程序搶佔。
SCHED RR:該策略使用時間片迴圈排程演算法,具體同樣優先順序的任務輪詢執行,直到耗盡預定的時間片。
2、非實時
SCHED_NORMAL(OTHER):linux 系統中大多數程序使用的預設策略。
SCHED BATCH:適合批次處理的程序。
SCHED IDLE:該策略有利於執行低優先順序應用程式,
CFS 排程
從 2.6.23 版本的核心開始,CFS 就成為預設的排程程式。CFS 使用紅黑樹來管理可執行的程序。它是基於虛擬時間(virtualtime)。
擁有虛擬時間最長,等待時間最長的程序將獲得使用 CPU。該程序在執行期間,虛擬時間將開始減少。
DEADLINE 排程
在 RHEL8 中,引入了一個新的排程策略 SCHED DEADLINE。該排程主要應用在實時系統中,保證實時任務的有效排程。
Deadline 排程使用三個引數:週期、期限和執行時間(最壞情況的執行時間)
-
週期:如果一個影片處理任務必須每秒處理60幀,新的幀每隔 16ms(毫秒)會到來,則週期為 16ms。
-
期限:指任務需要交付結果的最長時間,必須在這個期限結束前完成任務。
-
執行時間:表示處理一個任務的最長時間。
注意:單位都為 ns。
上面的例子表示:該任務將在每 16.6ms內確保得到 5ms的CPU 時間來執行,並且5ms 的 CPU 執行時間都可以在 10ms 期限內保證可用。
使用命令列方式更改排程選項
管理員可以使用 chrt 命令檢視某個程序(-p)的策略和優先順序。同時當使用 chrt 開啟一個新程式時,需要制定策略和優先順序,如果未指定策略,預設是 SCHED RR.
策略選項:
-b 指定為 SCHED BATCH
-f 指定為 SCHED FIFO
-i 指定為 SCHED IDLE
-o 指定為 SCHED NORMAL(OTHER)
-r 指定為 SCHED RR
-d 指定為 SCHED DEADLINE
例如為某個新程序指定策略和優先順序:
使用 systemd 的方式更改排程選項
在服務啟動時指定排程策略和優先順序,需要在[Service]段落中指定:
-
CPUSchedulingPolicy:設定服務的CPU 排程策略。other,batch,idle,fifo,rr。(當前不支援 deadline 策略)
-
CPUSchedulingPriority:設定優先順序,對於實時排程策略,範圍是1(最低)-99(最高)
完成後,需要重啟 systemctl daemon-reload,然後再重啟服務
二、CPU親和性
Pinning 程序
預設情況下,排程策略可以將程序放置在任何一個CPU上去執行,但為了增加效率,可以將某個程序與哪些 CPU 進行繫結,提供了快取命中率,提供了整體效能。
基於 systemd 的服務提供了一種方便的方式,可以在服務單元中的[Service]段落中使用CPUAffinity,設定,該引數接受一個以空格為分隔符的 CPU 索引列表,例如 0 代表第-個CPU,1代表第二個CPU。
使用 tuna 命令檢視CPU 繫結
yum install tuna