一、調(diào)度策略
調(diào)度進程
單個 CPU一次只能執(zhí)行一個進程,雖然 Linux 系統(tǒng)通過使用多任務(wù)同時處理多個進程,但當(dāng)多個進程同時運行在一個CPU 上時,它通過交錯執(zhí)行這些進程。
內(nèi)核使用進程調(diào)度器來決定在某一時間點上哪個進程在運行。調(diào)度器必須平衡幾個選項:
快速決定下一個該運行的進程
進程可以公平的活動 CPU 時間,但高優(yōu)先級的進程會活動更多的運行時間并且可以搶占低優(yōu)先級的進程。
響應(yīng)有力的交互式應(yīng)用程序
在各種工作負(fù)載下可預(yù)測和可擴展
進程優(yōu)先級
在 Linux 中,調(diào)度器根據(jù)分配給每個線程或進程的調(diào)度策略和優(yōu)先級來控制執(zhí)行順序。
這些調(diào)度策略分為:實時策略和非實時策略。
調(diào)度策略
RHEL提供六種調(diào)度策略,分為實時調(diào)度策略和非實時調(diào)度策略。
1、實時
SCHED FIFO:不帶時間分片的先進先出策略。擁有該策略的進程會一直運行,直到被I/O 阻塞或是更改優(yōu)先級的進程搶占。
SCHED RR:該策略使用時間片循環(huán)調(diào)度算法,具體同樣優(yōu)先級的任務(wù)輪詢執(zhí)行,直到耗盡預(yù)定的時間片。
2、非實時
SCHED_NORMAL(OTHER):linux 系統(tǒng)中大多數(shù)進程使用的默認(rèn)策略。
SCHED BATCH:適合批量處理的進程。
SCHED IDLE:該策略有利于運行低優(yōu)先級應(yīng)用程序,
CFS 調(diào)度
從 2.6.23 版本的內(nèi)核開始,CFS 就成為默認(rèn)的調(diào)度程序。CFS 使用紅黑樹來管理可運行的進程。它是基于虛擬時間(virtualtime)。
擁有虛擬時間最長,等待時間最長的進程將獲得使用 CPU。該進程在執(zhí)行期間,虛擬時間將開始減少。
DEADLINE 調(diào)度
在 RHEL8 中,引入了一個新的調(diào)度策略 SCHED DEADLINE。該調(diào)度主要應(yīng)用在實時系統(tǒng)中,保證實時任務(wù)的有效調(diào)度。
Deadline 調(diào)度使用三個參數(shù):周期、期限和運行時間(最壞情況的運行時間)
周期:如果一個視頻處理任務(wù)必須每秒處理60幀,新的幀每隔 16ms(毫秒)會到來,則周期為 16ms。
期限:指任務(wù)需要交付結(jié)果的最長時間,必須在這個期限結(jié)束前完成任務(wù)。
運行時間:表示處理一個任務(wù)的最長時間。
注意:單位都為 ns。
上面的例子表示:該任務(wù)將在每 16.6ms內(nèi)確保得到 5ms的CPU 時間來運行,并且5ms 的 CPU 運行時間都可以在 10ms 期限內(nèi)保證可用。
使用命令行方式更改調(diào)度選項
管理員可以使用 chrt 命令查看某個進程(-p)的策略和優(yōu)先級。同時當(dāng)使用 chrt 開啟一個新程序時,需要制定策略和優(yōu)先級,如果未指定策略,默認(rèn)是 SCHED RR.
策略選項:
-b 指定為 SCHED BATCH -f 指定為 SCHED FIFO -i 指定為 SCHED IDLE -o 指定為 SCHED NORMAL(OTHER) -r 指定為 SCHED RR -d 指定為 SCHED DEADLINE
例如為某個新進程指定策略和優(yōu)先級:
使用 systemd 的方式更改調(diào)度選項
在服務(wù)啟動時指定調(diào)度策略和優(yōu)先級,需要在[Service]段落中指定:
CPUSchedulingPolicy:設(shè)置服務(wù)的CPU 調(diào)度策略。other,batch,idle,fifo,rr。(當(dāng)前不支持 deadline 策略)
CPUSchedulingPriority:設(shè)置優(yōu)先級,對于實時調(diào)度策略,范圍是1(最低)-99(最高)
完成后,需要重啟 systemctl daemon-reload,然后再重啟服務(wù)
二、CPU親和性
Pinning 進程
默認(rèn)情況下,調(diào)度策略可以將進程放置在任何一個CPU上去執(zhí)行,但為了增加效率,可以將某個進程與哪些 CPU 進行綁定,提供了緩存命中率,提供了整體性能。
基于 systemd 的服務(wù)提供了一種方便的方式,可以在服務(wù)單元中的[Service]段落中使用CPUAffinity,設(shè)置,該參數(shù)接受一個以空格為分隔符的 CPU 索引列表,例如 0 代表第-個CPU,1代表第二個CPU。
使用 tuna 命令查看CPU 綁定 yum install tuna 選頂: -t -P (大寫)查看特定線程的信息,例如調(diào)度策略,優(yōu)先級,CPU綁定等
使用 cgroup 管理 CPU 親和性
在 NUMA 架構(gòu)中,一個 NUMA 節(jié)點上包含了連接在該節(jié)點上的 CPU,內(nèi)存等硬件設(shè)備。由此也引出了 CPU 親和性的概念。即CPU 訪問同一個節(jié)點中的內(nèi)存速度最快效率最高。利用 lscpu 命令查看 CPU 處于哪個 NUMA 節(jié)點中。
NUMA
NUMA,非一致性內(nèi)存訪問。將不同的CPU核心劃分到不同的 node 節(jié)點。每個 node都有自己的內(nèi)存控制器,允許不同 node 中的 CPU 只訪問屬于同一個 node 的內(nèi)存區(qū)域。
而不同的 node 節(jié)點通過 QPI進行通信,如圖:
利用 cpuset cgroup 控制器可以將程序綁定到特定的核心上。cuset 目錄已經(jīng)被掛載到了/sys/fs/cgroup 目錄下。管理員可以手工對該目錄下的文件進行讀寫(修改)。
cpuset.cpus:指定 cgroup 中任務(wù)可以訪問的CPU 數(shù)。“-”代表連續(xù)的 CPU 數(shù)。
Cpuset.mems:指定 cgroup 中的任務(wù)可以訪問的 NUMA 內(nèi)存節(jié)點。
鏈接:https://www.cnblogs.com/OpenSourceSite/p/18567209
-
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211568 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209318
原文標(biāo)題:Linux之CPU調(diào)度策略和CPU親和性
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論