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

【Nanopi2試用體驗(yàn)】高級(jí)(十):進(jìn)程綁定CPU核心
干貨分享:基于嵌入式Linux中進(jìn)程調(diào)度實(shí)現(xiàn)方法
基于GPU/CPU的流程序多粒度劃分與調(diào)度
一種靈活高效的虛擬CPU調(diào)度算法
Linux 中線程與 CPU 核的綁定
Linux CPU的性能應(yīng)該如何優(yōu)化
Linux發(fā)行版CPU漏洞及修復(fù)
容器進(jìn)程調(diào)度時(shí)是該優(yōu)先考慮CPU資源還是內(nèi)存資源
如何將進(jìn)程與 CPU 進(jìn)行綁定
詳解Kubernetes中的Pod調(diào)度親和性
多核服務(wù)器的CPU親和性配置與負(fù)載均衡優(yōu)化
deepin社區(qū)開發(fā)者聯(lián)合打造CPU頻率調(diào)度器

評(píng)論