先級(jí)線程越多越好嗎?實(shí)時(shí)調(diào)度中的優(yōu)先級(jí)與資源競(jìng)爭(zhēng))
在工業(yè)控制、機(jī)器人運(yùn)動(dòng)控制和實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)中為了讓關(guān)鍵任務(wù)及時(shí)運(yùn)行工程師通常會(huì)使用 Linux 的實(shí)時(shí)調(diào)度策略例如SCHED_FIFO和SCHED_RR并為控制線程設(shè)置較高的實(shí)時(shí)優(yōu)先級(jí)。但在實(shí)際項(xiàng)目中有一種看似合理、實(shí)際上可能適得其反的做法只要某個(gè)線程比較重要就提高它的優(yōu)先級(jí)只要某個(gè)任務(wù)可能影響實(shí)時(shí)性就把它也設(shè)置成高優(yōu)先級(jí)。隨著系統(tǒng)功能逐漸增加實(shí)時(shí)線程的數(shù)量越來越多優(yōu)先級(jí)也越來越高最終反而出現(xiàn)任務(wù)饑餓、鎖等待、周期超時(shí)和系統(tǒng)響應(yīng)異常等問題。原因在于優(yōu)先級(jí)并不是一種能夠憑空增加 CPU 計(jì)算能力的資源。它決定的是符合調(diào)度條件的任務(wù)之間如何競(jìng)爭(zhēng) CPU。當(dāng)多個(gè)線程同時(shí)處于可運(yùn)行狀態(tài)時(shí)提高某個(gè)線程的優(yōu)先級(jí)往往意味著其他線程獲得 CPU 的機(jī)會(huì)減少。如果優(yōu)先級(jí)分配缺乏明確的任務(wù)模型系統(tǒng)就可能把資源集中給某些線程卻讓它們依賴的輔助任務(wù)無法及時(shí)執(zhí)行。例如一個(gè)機(jī)器人控制系統(tǒng)包含 EtherCAT 周期任務(wù)、運(yùn)動(dòng)學(xué)計(jì)算、傳感器處理、狀態(tài)監(jiān)控、日志記錄和網(wǎng)絡(luò)通信。如果所有線程都設(shè)置為高優(yōu)先級(jí)系統(tǒng)并不會(huì)因此讓所有任務(wù)同時(shí)運(yùn)行。相反高優(yōu)先級(jí)線程可能不斷搶占其他線程導(dǎo)致低優(yōu)先級(jí)數(shù)據(jù)處理任務(wù)無法及時(shí)更新共享狀態(tài)控制線程隨后又等待這些狀態(tài)最終形成資源競(jìng)爭(zhēng)和任務(wù)延遲。因此實(shí)時(shí)調(diào)度的核心不是盡可能提高所有任務(wù)的優(yōu)先級(jí)而是根據(jù)任務(wù)周期、截止時(shí)間、執(zhí)行時(shí)間、資源依賴和系統(tǒng)負(fù)載設(shè)計(jì)一套能夠被驗(yàn)證的調(diào)度關(guān)系。本文從 Linux 實(shí)時(shí)調(diào)度機(jī)制出發(fā)分析優(yōu)先級(jí)分配中的常見誤區(qū)并介紹如何在工業(yè)控制系統(tǒng)中建立合理的實(shí)時(shí)調(diào)度方案。一、SCHED_FIFO 和 SCHED_RR 到底怎樣決定線程的執(zhí)行順序在討論優(yōu)先級(jí)規(guī)劃之前需要先理解 Linux 中常見的實(shí)時(shí)調(diào)度策略。對(duì)于使用SCHED_FIFO的線程調(diào)度器會(huì)優(yōu)先選擇當(dāng)前可運(yùn)行的最高優(yōu)先級(jí)實(shí)時(shí)線程。在同一優(yōu)先級(jí)的普通 FIFO 競(jìng)爭(zhēng)關(guān)系中線程通常持續(xù)運(yùn)行直到主動(dòng)讓出 CPU、進(jìn)入阻塞狀態(tài)、被更高優(yōu)先級(jí)線程搶占或者受到其他調(diào)度規(guī)則影響。它不會(huì)因?yàn)橄牧艘粋€(gè)普通的時(shí)間片就像普通公平調(diào)度任務(wù)那樣自動(dòng)輪換。這意味著如果一個(gè)高優(yōu)先級(jí)SCHED_FIFO線程始終處于可運(yùn)行狀態(tài)卻沒有正確阻塞、主動(dòng)讓出 CPU 或結(jié)束本次工作那么較低優(yōu)先級(jí)的線程可能長(zhǎng)期得不到運(yùn)行機(jī)會(huì)。下面是一個(gè)簡(jiǎn)單的場(chǎng)景線程 A實(shí)時(shí)優(yōu)先級(jí) 90采用SCHED_FIFO。線程 B實(shí)時(shí)優(yōu)先級(jí) 70采用SCHED_FIFO。線程 C普通調(diào)度策略執(zhí)行日志和監(jiān)控任務(wù)。如果線程 A 持續(xù)占用 CPU線程 B 和線程 C 就可能無法及時(shí)運(yùn)行。即使線程 B 負(fù)責(zé)準(zhǔn)備下一周期所需的數(shù)據(jù)也不能僅憑它的業(yè)務(wù)重要性保證它得到 CPU。調(diào)度器主要依據(jù)實(shí)際調(diào)度屬性和可運(yùn)行狀態(tài)進(jìn)行決策而不是自動(dòng)理解應(yīng)用程序中的業(yè)務(wù)依賴。因此SCHED_FIFO適合那些執(zhí)行路徑清晰、時(shí)間預(yù)算明確、能夠合理阻塞或完成工作的實(shí)時(shí)任務(wù)但不適合沒有明確執(zhí)行邊界、可能無限循環(huán)占用 CPU 的線程。SCHED_RR則在相同實(shí)時(shí)優(yōu)先級(jí)的可運(yùn)行線程之間引入輪轉(zhuǎn)時(shí)間片。一個(gè)線程使用完相應(yīng)的輪轉(zhuǎn)時(shí)間后可以被安排到同優(yōu)先級(jí)隊(duì)列中的其他線程之后讓同級(jí)線程獲得運(yùn)行機(jī)會(huì)。不過輪轉(zhuǎn)時(shí)間片并不意味著SCHED_RR會(huì)自動(dòng)公平地分配所有 CPU 時(shí)間。不同優(yōu)先級(jí)之間仍然存在搶占關(guān)系低優(yōu)先級(jí)線程不會(huì)僅僅因?yàn)榈却龝r(shí)間較長(zhǎng)就自動(dòng)越過持續(xù)可運(yùn)行的高優(yōu)先級(jí)實(shí)時(shí)線程。因此兩種策略的主要區(qū)別在于同優(yōu)先級(jí)實(shí)時(shí)線程之間的運(yùn)行方式而不是簡(jiǎn)單的“一個(gè)實(shí)時(shí)性更高、另一個(gè)實(shí)時(shí)性更低”。在實(shí)際控制系統(tǒng)中選擇哪種策略應(yīng)根據(jù)線程是否需要持續(xù)執(zhí)行、同級(jí)任務(wù)之間是否需要輪轉(zhuǎn)以及任務(wù)的時(shí)間約束決定。對(duì)于短周期控制線程常見做法是優(yōu)先分析SCHED_FIFO是否適合其執(zhí)行模型如果存在多個(gè)同級(jí)實(shí)時(shí)工作線程也應(yīng)評(píng)估SCHED_RR的輪轉(zhuǎn)行為對(duì)任務(wù)截止時(shí)間的影響。需要注意Linux 實(shí)時(shí)優(yōu)先級(jí)的可用范圍和配置還受到系統(tǒng)實(shí)現(xiàn)、權(quán)限、資源限制及相關(guān)配置影響。不能僅憑一個(gè)優(yōu)先級(jí)數(shù)值就判斷任務(wù)一定能夠按時(shí)運(yùn)行。二、為什么高優(yōu)先級(jí)線程太多反而可能讓系統(tǒng)更不穩(wěn)定優(yōu)先級(jí)分配的首要問題是多個(gè)線程之間存在競(jìng)爭(zhēng)而系統(tǒng)的 CPU 時(shí)間是有限的。假設(shè)一個(gè)控制系統(tǒng)有四個(gè)實(shí)時(shí)線程線程功能周期單次執(zhí)行時(shí)間A讀取傳感器狀態(tài)1 ms100 μsB運(yùn)動(dòng)控制計(jì)算1 ms250 μsC更新執(zhí)行器輸出1 ms100 μsD狀態(tài)監(jiān)控與數(shù)據(jù)整理5 ms400 μs以上數(shù)值只是用于說明調(diào)度關(guān)系的假設(shè)數(shù)據(jù)不代表任何實(shí)測(cè)平臺(tái)結(jié)果。如果 A、B、C、D 都設(shè)置成很高的實(shí)時(shí)優(yōu)先級(jí)而且沒有根據(jù)截止時(shí)間和數(shù)據(jù)依賴安排優(yōu)先級(jí)那么 D 可能在某個(gè)時(shí)刻搶占 B導(dǎo)致控制計(jì)算延遲也可能出現(xiàn) B 已經(jīng)完成計(jì)算卻因?yàn)?C 依賴的某項(xiàng)數(shù)據(jù)尚未準(zhǔn)備好而等待。如果 D 實(shí)際上只是用于整理監(jiān)控?cái)?shù)據(jù)那么將它與關(guān)鍵控制線程設(shè)置成相同甚至更高的優(yōu)先級(jí)通常需要非常明確的工程理由。否則它會(huì)把 CPU 資源分配給相對(duì)不緊急的工作增加關(guān)鍵任務(wù)的調(diào)度競(jìng)爭(zhēng)。這里需要區(qū)分兩個(gè)問題任務(wù)是否重要與任務(wù)是否必須立即運(yùn)行并不是同一回事。日志記錄可能對(duì)故障分析非常重要但大部分日志處理不需要在每個(gè)控制周期內(nèi)立即完成。網(wǎng)絡(luò)狀態(tài)上報(bào)可能關(guān)系到系統(tǒng)可觀測(cè)性但如果它不是當(dāng)前控制閉環(huán)的一部分就不應(yīng)輕易搶占周期控制任務(wù)。相反如果某個(gè)傳感器采樣線程的輸出直接決定下一次控制計(jì)算那么它的調(diào)度時(shí)機(jī)就可能具有更嚴(yán)格的約束。因此優(yōu)先級(jí)規(guī)劃應(yīng)基于任務(wù)的時(shí)間要求而不是單純根據(jù)業(yè)務(wù)重要程度排序。另一個(gè)常見問題是高優(yōu)先級(jí)任務(wù)的 CPU 需求超過了系統(tǒng)能夠提供的時(shí)間預(yù)算。例如某個(gè) CPU 上有兩個(gè)高優(yōu)先級(jí)周期任務(wù)二者的周期分別為 1 ms 和 2 ms執(zhí)行時(shí)間分別為 700 μs 和 800 μs。若它們必須在同一個(gè) CPU 上運(yùn)行并且這些執(zhí)行時(shí)間是每次都需要的工作量那么僅從長(zhǎng)期平均 CPU 需求看第一個(gè)任務(wù)的利用率為 700 μs / 1000 μs即 70%。第二個(gè)任務(wù)的利用率為 800 μs / 2000 μs即 40%。兩者合計(jì)達(dá)到 110%。這意味著長(zhǎng)期所需的 CPU 時(shí)間已經(jīng)超過單核能夠提供的時(shí)間即使優(yōu)先級(jí)分配得再合理也無法讓這兩個(gè)任務(wù)始終按時(shí)完成。這個(gè)例子說明優(yōu)先級(jí)不能替代可調(diào)度性分析。即使系統(tǒng)整體 CPU 使用率很低如果關(guān)鍵任務(wù)被限制在同一個(gè)核心上或者某些任務(wù)必須串行執(zhí)行局部 CPU 時(shí)間仍然可能不足。當(dāng)然對(duì)于具有不同截止時(shí)間、阻塞關(guān)系、釋放模式和搶占規(guī)則的復(fù)雜任務(wù)集僅用平均利用率并不能完整判斷系統(tǒng)是否可調(diào)度。還需要分析任務(wù)釋放時(shí)間、執(zhí)行時(shí)間上界、優(yōu)先級(jí)關(guān)系、阻塞時(shí)間和截止時(shí)間并在實(shí)際平臺(tái)上進(jìn)行驗(yàn)證。對(duì)于實(shí)時(shí)系統(tǒng)來說提高優(yōu)先級(jí)不能解決計(jì)算資源不足也不能讓超出時(shí)間預(yù)算的任務(wù)自動(dòng)變得可調(diào)度。三、優(yōu)先級(jí)反轉(zhuǎn)與資源依賴為什么關(guān)鍵線程可能被低優(yōu)先級(jí)任務(wù)拖住實(shí)時(shí)調(diào)度中最容易被誤判的問題之一是優(yōu)先級(jí)反轉(zhuǎn)。假設(shè)一個(gè)系統(tǒng)有三個(gè)線程高優(yōu)先級(jí)控制線程 H、中優(yōu)先級(jí)業(yè)務(wù)線程 M 和低優(yōu)先級(jí)輔助線程 L。線程 L 負(fù)責(zé)更新共享狀態(tài)并在臨界區(qū)內(nèi)持有互斥鎖。線程 H 需要獲取同一把鎖才能執(zhí)行本周期的控制計(jì)算。當(dāng) H 試圖獲取鎖時(shí)由于 L 尚未釋放鎖H 進(jìn)入等待狀態(tài)。此時(shí)線程 M 恰好處于可運(yùn)行狀態(tài)。如果調(diào)度關(guān)系允許 M 搶占 L那么 L 就無法及時(shí)完成臨界區(qū)H 也只能繼續(xù)等待。最終的結(jié)果是一個(gè)低優(yōu)先級(jí)線程間接決定了高優(yōu)先級(jí)控制線程何時(shí)能夠繼續(xù)運(yùn)行。這就是優(yōu)先級(jí)反轉(zhuǎn)的典型表現(xiàn)。在這個(gè)場(chǎng)景中簡(jiǎn)單地進(jìn)一步提高 H 的優(yōu)先級(jí)通常并不能直接消除根因因?yàn)?H 已經(jīng)由于鎖競(jìng)爭(zhēng)而阻塞。它不能越過互斥鎖直接訪問被保護(hù)的數(shù)據(jù)??梢詮娜齻€(gè)方面改善這種問題。首先縮短臨界區(qū)。不要讓低優(yōu)先級(jí)線程持有共享鎖時(shí)執(zhí)行文件 I/O、網(wǎng)絡(luò)通信、復(fù)雜計(jì)算或其他可能長(zhǎng)時(shí)間阻塞的操作。臨界區(qū)越短潛在的鎖等待時(shí)間通常越容易控制。其次評(píng)估優(yōu)先級(jí)繼承等同步機(jī)制。在 Linux 支持相應(yīng)協(xié)議的情況下可以使用具有優(yōu)先級(jí)繼承能力的互斥鎖使持鎖線程在特定競(jìng)爭(zhēng)情況下臨時(shí)繼承等待線程的優(yōu)先級(jí)減少中優(yōu)先級(jí)任務(wù)對(duì)鎖釋放的干擾。但優(yōu)先級(jí)繼承并不等于鎖等待時(shí)間為零。持鎖線程仍然需要完成臨界區(qū)工作如果臨界區(qū)本身執(zhí)行很久或者存在復(fù)雜的多鎖依賴等待仍可能影響截止時(shí)間。優(yōu)先級(jí)繼承也不是所有同步原語都默認(rèn)提供的能力應(yīng)用必須檢查實(shí)際配置與平臺(tái)支持情況。第三減少關(guān)鍵控制路徑對(duì)共享鎖的依賴。對(duì)于一些狀態(tài)交換場(chǎng)景可以評(píng)估使用固定容量隊(duì)列、雙緩沖、不可變數(shù)據(jù)快照或其他適合數(shù)據(jù)訪問模式的機(jī)制。例如非實(shí)時(shí)線程負(fù)責(zé)準(zhǔn)備一份新的配置快照控制線程只讀取已經(jīng)發(fā)布的有效版本。這樣可以避免控制線程為了讀取配置而等待一個(gè)執(zhí)行復(fù)雜操作的業(yè)務(wù)線程。但這種設(shè)計(jì)需要明確數(shù)據(jù)一致性、緩沖區(qū)生命周期和更新時(shí)機(jī)不能只因?yàn)槭褂昧嗽幼兞炕螂p緩沖就假定整個(gè)數(shù)據(jù)交換過程不存在競(jìng)爭(zhēng)。除了互斥鎖資源依賴還可能來自其他地方例如控制線程等待傳感器線程準(zhǔn)備輸入數(shù)據(jù)。運(yùn)動(dòng)控制任務(wù)等待通信線程完成數(shù)據(jù)交換。實(shí)時(shí)線程等待設(shè)備驅(qū)動(dòng)返回結(jié)果。高優(yōu)先級(jí)任務(wù)等待一個(gè)由普通業(yè)務(wù)線程填充的隊(duì)列。多個(gè)實(shí)時(shí)線程在周期邊界同時(shí)訪問共享狀態(tài)。這些場(chǎng)景不一定都表現(xiàn)為傳統(tǒng)意義上的優(yōu)先級(jí)反轉(zhuǎn)但它們都會(huì)影響實(shí)際任務(wù)的完成時(shí)間。因此設(shè)計(jì)實(shí)時(shí)調(diào)度策略時(shí)不能只看每個(gè)線程的優(yōu)先級(jí)還必須畫清楚線程之間的數(shù)據(jù)依賴與阻塞關(guān)系。一個(gè)高優(yōu)先級(jí)任務(wù)如果依賴多個(gè)低優(yōu)先級(jí)任務(wù)那么這些依賴路徑就需要納入整體時(shí)間預(yù)算。四、怎樣為實(shí)時(shí)線程分配優(yōu)先級(jí)從截止時(shí)間與任務(wù)模型出發(fā)合理的優(yōu)先級(jí)設(shè)計(jì)應(yīng)當(dāng)先建立任務(wù)模型而不是先給線程分配一個(gè)看起來足夠高的數(shù)值。至少需要明確以下信息任務(wù)的釋放模式周期性、事件觸發(fā)還是混合模式。任務(wù)的周期或最小到達(dá)間隔。任務(wù)每次執(zhí)行所需的 CPU 時(shí)間以及在目標(biāo)平臺(tái)上的變化范圍。任務(wù)的相對(duì)截止時(shí)間。任務(wù)是否會(huì)阻塞以及可能等待哪些共享資源。任務(wù)與其他線程之間的數(shù)據(jù)依賴關(guān)系。任務(wù)運(yùn)行在哪個(gè) CPU以及是否會(huì)受到其他任務(wù)和中斷的影響。這里尤其需要區(qū)分任務(wù)周期與截止時(shí)間。周期為 1 ms 的任務(wù)不代表它一定有完整的 1 ms 可以執(zhí)行。如果它必須在下一次控制更新之前完成而執(zhí)行鏈路中還包含數(shù)據(jù)交換和輸出提交那么真正留給計(jì)算步驟的時(shí)間可能明顯小于 1 ms。方法一先根據(jù)截止時(shí)間建立任務(wù)優(yōu)先級(jí)關(guān)系對(duì)于某些獨(dú)立的、周期性、可搶占任務(wù)集如果任務(wù)執(zhí)行時(shí)間和截止時(shí)間滿足特定假設(shè)可以使用經(jīng)典的固定優(yōu)先級(jí)調(diào)度分析方法。一個(gè)常見思路是根據(jù)任務(wù)的周期或截止時(shí)間安排相對(duì)優(yōu)先級(jí)。但這種理論方法有適用條件不能直接套用到所有工業(yè)控制程序。實(shí)際任務(wù)可能存在資源共享、非周期事件、不同截止時(shí)間、驅(qū)動(dòng)阻塞和跨線程同步因此需要根據(jù)具體任務(wù)模型選擇分析方法。工程上可以先明確哪些任務(wù)直接參與關(guān)鍵控制閉環(huán)哪些任務(wù)屬于輔助工作再結(jié)合周期、截止時(shí)間和數(shù)據(jù)依賴決定優(yōu)先級(jí)而不是把所有線程都設(shè)置為同一級(jí)別。方法二分析 CPU 時(shí)間預(yù)算對(duì)于每個(gè) CPU 上的任務(wù)應(yīng)估算它們?cè)谝粋€(gè)時(shí)間窗口內(nèi)需要多少計(jì)算時(shí)間并將任務(wù)阻塞、搶占以及內(nèi)核和中斷活動(dòng)納入分析。對(duì)于周期任務(wù)一個(gè)初步指標(biāo)是 CPU 利用率[U_i\frac{C_i}{T_i}]其中(C_i) 表示任務(wù)每次執(zhí)行需要的 CPU 時(shí)間(T_i) 表示任務(wù)周期。如果同一個(gè) CPU 上有多個(gè)周期任務(wù)可以先計(jì)算[U_{\mathrm{total}}\sum_i \frac{C_i}{T_i}]這個(gè)總利用率有助于發(fā)現(xiàn)明顯的資源不足問題但它不是任意實(shí)時(shí)任務(wù)集都能滿足截止時(shí)間的充分條件。任務(wù)釋放時(shí)刻、截止時(shí)間、優(yōu)先級(jí)、阻塞、搶占以及中斷開銷都可能改變實(shí)際調(diào)度結(jié)果。因此利用率分析應(yīng)該作為初步篩查而不是最終驗(yàn)收結(jié)論。方法三明確實(shí)時(shí)任務(wù)與輔助任務(wù)的邊界在工業(yè)控制系統(tǒng)中建議優(yōu)先識(shí)別真正影響控制閉環(huán)的任務(wù)。例如周期性運(yùn)動(dòng)控制計(jì)算、必要的數(shù)據(jù)采集以及必須按時(shí)完成的輸出更新可能屬于關(guān)鍵路徑。而日志格式化、歷史數(shù)據(jù)整理、界面刷新、非關(guān)鍵網(wǎng)絡(luò)上報(bào)和報(bào)表生成等工作通??梢园才旁谳^低優(yōu)先級(jí)或普通調(diào)度線程中。但是否能夠降低優(yōu)先級(jí)仍需確認(rèn)這些任務(wù)沒有承擔(dān)關(guān)鍵的實(shí)時(shí)依賴。例如如果日志線程還承擔(dān)實(shí)時(shí)故障信號(hào)的唯一轉(zhuǎn)發(fā)職責(zé)那么不能在不了解其功能的情況下直接降低其優(yōu)先級(jí)。更好的設(shè)計(jì)通常是將實(shí)時(shí)故障檢測(cè)和必要的安全響應(yīng)與后續(xù)日志存儲(chǔ)、網(wǎng)絡(luò)上報(bào)拆分讓必須及時(shí)完成的動(dòng)作具有明確的執(zhí)行路徑。方法四用測(cè)量結(jié)果修正任務(wù)模型任務(wù)模型不能只依靠源代碼閱讀或開發(fā)人員估計(jì)。應(yīng)當(dāng)通過應(yīng)用埋點(diǎn)、調(diào)度跟蹤和壓力測(cè)試記錄每個(gè)關(guān)鍵任務(wù)的實(shí)際啟動(dòng)延遲、執(zhí)行時(shí)間、阻塞時(shí)間及完成情況。如果某個(gè)任務(wù)偶爾執(zhí)行時(shí)間明顯增加需要進(jìn)一步分析是計(jì)算量變化、緩存和內(nèi)存訪問、鎖等待、設(shè)備調(diào)用還是被其他任務(wù)搶占。隨后再?zèng)Q定是否需要調(diào)整優(yōu)先級(jí)、改變 CPU 綁定方式或者優(yōu)化執(zhí)行路徑。優(yōu)先級(jí)調(diào)整應(yīng)當(dāng)建立在可解釋的原因之上。盲目把某個(gè)線程提高一級(jí)可能只是讓其他線程的問題變得更加明顯并沒有消除根本原因。五、在 Linux 中怎樣檢查調(diào)度配置并驗(yàn)證優(yōu)先級(jí)方案在完成初步任務(wù)分析之后可以從當(dāng)前運(yùn)行狀態(tài)入手檢查線程的調(diào)度策略、優(yōu)先級(jí)和 CPU 分布。首先查看所有線程的調(diào)度信息ps -eLo pid,tid,psr,cls,rtprio,pri,ni,stat,comm結(jié)合輸出確認(rèn)關(guān)鍵控制線程的 TID、調(diào)度類別、實(shí)時(shí)優(yōu)先級(jí)和最近運(yùn)行的 CPU。對(duì)于多線程程序不要只檢查進(jìn)程主線程因?yàn)檎嬲龍?zhí)行周期控制工作的可能是單獨(dú)創(chuàng)建的線程。接著可以使用chrt查詢或調(diào)整指定線程的實(shí)時(shí)調(diào)度屬性。例如chrt -p TID這條命令用于查詢目標(biāo)線程的調(diào)度策略與相關(guān)優(yōu)先級(jí)信息。修改實(shí)時(shí)優(yōu)先級(jí)時(shí)需要具備相應(yīng)權(quán)限并確認(rèn)系統(tǒng)資源限制和平臺(tái)策略允許該操作。在生產(chǎn)環(huán)境中更推薦通過程序初始化代碼統(tǒng)一設(shè)置線程的調(diào)度屬性并檢查每次配置操作的返回結(jié)果。不能假定請(qǐng)求了實(shí)時(shí)策略就一定設(shè)置成功也不能忽略線程創(chuàng)建、繼承屬性和系統(tǒng)資源限制造成的差異。如果懷疑線程之間存在調(diào)度等待可以進(jìn)一步采集調(diào)度事件。例如sudo trace-cmd record \ -e sched:sched_wakeup \ -e sched:sched_switch \ sleep 10 sudo trace-cmd report實(shí)際使用時(shí)應(yīng)確認(rèn)當(dāng)前內(nèi)核支持相關(guān)事件并盡量通過目標(biāo) TID 過濾記錄避免采集過多無關(guān)數(shù)據(jù)。跟蹤開銷也可能影響被測(cè)系統(tǒng)因此應(yīng)在測(cè)試環(huán)境中驗(yàn)證采集方式并控制記錄時(shí)長(zhǎng)和緩沖區(qū)大小。分析時(shí)重點(diǎn)關(guān)注以下情況目標(biāo)線程已經(jīng)被喚醒卻沒有立即獲得 CPU。高優(yōu)先級(jí)線程持續(xù)運(yùn)行其他任務(wù)長(zhǎng)時(shí)間處于可運(yùn)行狀態(tài)。目標(biāo)線程運(yùn)行后又進(jìn)入阻塞等待共享鎖或其他資源。某個(gè)低優(yōu)先級(jí)線程持有共享資源導(dǎo)致高優(yōu)先級(jí)線程無法繼續(xù)執(zhí)行。多個(gè)實(shí)時(shí)線程集中運(yùn)行在同一 CPU局部計(jì)算需求超過該核心的時(shí)間預(yù)算。調(diào)度跟蹤只能提供內(nèi)核調(diào)度行為的證據(jù)不能單獨(dú)解釋所有用戶態(tài)計(jì)算和設(shè)備等待。因此建議在關(guān)鍵代碼路徑中添加時(shí)間戳記錄任務(wù)計(jì)劃釋放時(shí)間、實(shí)際開始時(shí)間、關(guān)鍵步驟耗時(shí)和最終完成時(shí)間再將這些數(shù)據(jù)與內(nèi)核事件對(duì)應(yīng)起來。最后使用相同硬件、內(nèi)核、驅(qū)動(dòng)、業(yè)務(wù)負(fù)載和測(cè)試時(shí)長(zhǎng)對(duì)不同優(yōu)先級(jí)方案進(jìn)行對(duì)照。除了平均延遲還應(yīng)記錄 P95、P99、P99.9、最大觀測(cè)延遲、樣本數(shù)量和截止時(shí)間違約次數(shù)。若測(cè)試過程中沒有發(fā)生超時(shí)應(yīng)明確測(cè)試持續(xù)時(shí)間和樣本規(guī)模不能把有限時(shí)間內(nèi)未觀察到超時(shí)理解為任何條件下都不會(huì)超時(shí)。對(duì)于望獲OS或其他實(shí)時(shí) Linux 平臺(tái)同樣應(yīng)通過統(tǒng)一的任務(wù)模型和測(cè)試口徑驗(yàn)證優(yōu)先級(jí)配置。系統(tǒng)平臺(tái)能夠提供調(diào)度能力但具體應(yīng)用是否滿足實(shí)時(shí)要求仍取決于任務(wù)設(shè)計(jì)、資源依賴、CPU 分配和實(shí)際負(fù)載。總結(jié)來說實(shí)時(shí)調(diào)度不是一場(chǎng)不斷提高優(yōu)先級(jí)數(shù)值的競(jìng)賽。優(yōu)先級(jí)的作用是協(xié)調(diào)任務(wù)競(jìng)爭(zhēng)而不是創(chuàng)造額外的計(jì)算資源。只有先明確任務(wù)周期、截止時(shí)間、執(zhí)行時(shí)間和資源依賴再合理安排優(yōu)先級(jí)、減少關(guān)鍵路徑阻塞并通過壓力測(cè)試驗(yàn)證才能建立真正可靠的實(shí)時(shí)調(diào)度方案。