openEuler 22.03 LTS 版本新增了 Preempt_RT 內(nèi)核實時補丁,提供軟實時特性。該特性由 Industrial-Control SIG 引入,并得到 Kernel SIG、Embedded SIG 和 Yocto SIG 配合與支持,已經(jīng)被集成到openEuler 22.03 LTS Server 和 openEuler 22.03 LTS Embedded 中。
什么是實時系統(tǒng)
實時系統(tǒng)的典型定義如下:“所謂實時系統(tǒng),就是系統(tǒng)中計算結果的正確性不僅取決于計算邏輯的正確性,還取決于產(chǎn)生結果的時間。如果完成時間不符合要求,則可以認為系統(tǒng)發(fā)生了問題。”也就是說,不管實時應用程序執(zhí)行的是何種任務,它不僅需要正確執(zhí)行該任務而且必須及時完成。當前,Preempt_RT 維護者 Thomas Gleixner 給出的“實時”含義是:它和指定的一樣快。
Linux 作為一種通用操作系統(tǒng),隨著時間的推移,在功能和時序行為方面一直在發(fā)展,以便適合許多其他更具挑戰(zhàn)性的場景;尤其是實時系統(tǒng)對 Linux 的實時性改造一直從未停止過。
對 Linux 進行實時性改造,通常可從兩個大的方向來著手。一個方向是從 Linux 內(nèi)核內(nèi)部開始,直接修改其內(nèi)核源代碼,其典型代表是 Preempt_RT 實時補丁;另一個方向則是從 Linux 內(nèi)核的外圍開始,實現(xiàn)一個與 Linux 內(nèi)核共存的實時內(nèi)核,即采用雙內(nèi)核方法,其典型實現(xiàn)為 RTAI/Linux,即現(xiàn)在的 Xenomai。
因為 Xenomai 實時內(nèi)核與 Linux 內(nèi)核共存,Xenomai 實時內(nèi)核小而精巧,能夠很好地控制其中的代碼質量。Xenomai 實時內(nèi)核完成了基本的硬件抽象層、任務調(diào)度管理和進程間通信管理模塊等,能夠滿足一些硬實時系統(tǒng)的需求。然而,其上的實時應用通常分為實時和非實時兩部分來完成 ,實時部分必須使用 Xenomai 提供的特有的 API;非實時部分則可以使用 Linux 提供的系統(tǒng)調(diào)用。與 Preempt_RT 實時編程相比,Xenomai 編程實現(xiàn)更為困難,軟件移植難度更大。
與雙內(nèi)核機制方案相比,Preempt_RT 實時補丁最大的優(yōu)勢在于它遵循 POSIX 標準,使用該補丁的實時系統(tǒng)應用程序和驅動程序與非實時系統(tǒng)的應用和驅動程序差異很小。因此,在使用該補丁的平臺上做相應的開發(fā)比雙內(nèi)核機制的方案更容易。另外,該補丁與硬件平臺相關性小,可移植性高。由于 Linux 內(nèi)核過于龐大,有著較多關中斷、關搶占代碼,加上復雜的內(nèi)存管理、調(diào)度器代碼邏輯等眾多不確定性因素,使得 Preempt_RT 雖然具有較好的軟實時性,但在硬實時性方面有所欠缺。
什么是 Preempt_RT
Preempt_RT 補丁開發(fā)始于 2005 年。之后由德國 OSADL 組織贊助,Ingo Molnar、Thomas Gleixner 和 Steven Rostedt 三人共同發(fā)起,旨在將 Linux 內(nèi)核的最大線程切換延遲從無限制的毫秒數(shù)降低到數(shù)十微秒的有界值。2016 年以后成為 Linux 基金會下屬合作項目。目前 Preempt_RT 的贊助者來自 ARM、BMW、CIP、ELISA、Intel、National Instruments、OSADL、RedHat 和 Texas Instruments 等。經(jīng)過 Preempt_RT 和 Linux 內(nèi)核工程師在搶占、實時性方面的努力,Linux 內(nèi)核的搶占延遲降低了幾個數(shù)量級,使其能夠與商業(yè)實時操作系統(tǒng)競爭。業(yè)界知名的 MontaVista Linux、WindRiver Linux、TimeSys Linux 都有 RT 補丁的身影。像 RTJVM、RTKVM、RTDocker、RTAndroid 等曾經(jīng)出現(xiàn)過的 Preempt_RT 衍生用例,響應速度都有著不同程度的提升。
多年來,該補丁的許多部分已被納入主線 Linux,包括高分辨率計時器(2.6.16)、優(yōu)先級繼承(2.6.18)、可搶占的 RCU(2.6.25)、內(nèi)核互斥量和線程中斷處理程序(2.6.30)、完全 Tickless 機制(3.10)、DL 調(diào)度器(EDF 調(diào)度算法)(3.14)、實時搶占鎖(5.15)。然而,該補丁的核心部分仍然在主線之外。從近幾年的 Preempt_RT 補丁來看,當前的主要工作不是開發(fā)新功能,而是專注于增量式引入主線和特定架構的支持。
當前 openEuler 22.03 LTS 主線內(nèi)核版本為 Linux Kernel 5.10,有 180 把鎖無法搶占,其中 8 把鎖在 RT 補丁中強制修改成無法搶占。在最新的 5.17 內(nèi)核中,Preempt_RT 補丁大小為 265KB,有 189 把鎖仍然無法搶占,RT 補丁不再強制修改鎖為無法搶占。
當前 Preempt_RT 主要特性
- 臨界區(qū)可搶占
- 中斷處理程序可搶占
- 關中斷代碼序列可搶占
- 帶有優(yōu)先級繼承機制的內(nèi)核自旋鎖和信號量
- 線程化處理 RCU
- 降低延遲措施
部署方法
二進制部署
二進制部署可以安裝 openEuler 22.03 LTS 官方源中 rpm 包,需要 root 權限,命令如下:
#yuminstallkernel-rt
完成安裝后重啟設備,在 GRUB 引導界面選擇 Preempt_RT 內(nèi)核openEuler (5.10.0-60.18.0.rt62.52.oe2203.aarch64) 22.03 LTS
即可。啟動后查看內(nèi)核,即完成 openEuler 22.03 LTS Preempt_RT 二進制部署。
#uname-r
5.10.0-60.18.0.rt62.52.oe2203.aarch64
獲取源碼
openEuler 22.03LTS kernel-rt
源碼可以直接從官方源獲取,查詢命令如下:
#yumsearchkernel-rt
...
kernel-rt.src:LinuxKernel
若源里包含 kernel-rt
源碼,則可使用如下方式下載并安裝:
#yumdownloader--sourcekernel-rt.src
#rpm-ivhkernel-rt-5.10.0-60.18.0.rt62.52.oe2203.src.rpm&&cd~/rpmbuild
源碼目錄樹如下:
#tree
.
├──SOURCES
│├──cpupower.config
│├──cpupower.service
│├──extra_certificates
│├──kernel.tar.gz
│├──mkgrub-menu-aarch64.sh
│├──patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch
│├──patch-5.10.0-60.10.0-rt62.patch
│├──pubring.gpg
│├──sign-modules
│└──x509.genkey
└──SPECS
└──kernel-rt.spec
文件 | 說明 |
---|---|
kernel.tar.gz | 內(nèi)核源碼 |
patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch | openeuler_defconfig 文件補丁 |
patch-5.10.0-60.10.0-rt62.patch | Preempt_RT 補丁 |
kernel-rt.spec | Preempt_RT 內(nèi)核 spec 文件 |
源碼部署
源碼獲取后,復制以下文件到自定義目錄:
#ll
total186M
-rw-r--r--.1rootroot185MApr214:27kernel.tar.gz
-rw-r--r--.1rootroot4.5KApr214:27patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch
-rw-r--r--.1rootroot773KApr214:27patch-5.10.0-60.10.0-rt62.patch
補丁合入步驟如下:
#tar-xzfkernel.tar.gz&&cdkernel
#patch-p1../patch-5.10.0-60.10.0-rt62.patch
#patch-p1../patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch
源碼編譯安裝:
#makeopeneuler_defconfig&&make-j`nproc`
#makemodules_install&&makeinstall
#grub2-mkconfig-o$GRUB_CONFIG_PATH
嵌入式系統(tǒng)部署方法
嵌入式部署 Preempt_RT 方法參見:
https://openeuler.gitee.io/yocto-meta-openeuler/features/preempt_rt.html
實時性能測試
縮略語 | 英文全名 | 說明 |
---|---|---|
RT 內(nèi)核 | Realtime kernel |
實時內(nèi)核,本文指 openEuler 22.03LTS 發(fā)布的kernel-rt 內(nèi)核 |
非 RT 內(nèi)核 | / |
非實時內(nèi)核,實時內(nèi)核,本文指 openEuler 22.03LTS 發(fā)布的kernel 內(nèi)核 |
測試環(huán)境
版本名稱 | 來源 |
---|---|
openEuler 22.03 LTS kernel 內(nèi)核 |
openEuler 22.03 LTS 官方源 |
openEuler 22.03 LTS kernel-rt 內(nèi)核 |
openEuler 22.03 LTS 官方源 |
硬件型號 | 硬件配置信息 | 備注 |
---|---|---|
飛騰 D2000 | CPU:8 核 內(nèi)存:8GB 存儲設備:SSD | 臺式機 |
樹莓派 4B | CPU:Cortex-A72 * 4 內(nèi)存:8GB 存儲設備:SanDisk Ultra 16GB micro SD | 開發(fā)板 |
飛騰 2000 | CPU:4 核 內(nèi)存:16GB 存儲設備:SSD | 臺式機 |
測試軟件 | 功能 | 軟件版本 |
---|---|---|
rt-test(cyclictest) | 通過 cyclictest 工具,每項測試 1000 萬次,輸出平均延遲(Avg)和最大延遲(MAX) | 1.00 |
stress | 壓力測試工具,用于模擬測試 CPU 負載,內(nèi)存負載,IO 負載等 | 1.0.4 |
iperf3 | 網(wǎng)絡測試工具,用于模擬測試網(wǎng)絡負載 | 3.6 |
memtester | 內(nèi)存測試工具,用于模擬測試內(nèi)存負載 | 4.5.1 |
shell 腳本 | 用于輪詢測試,測試信息的收集整理 | — |
測試結果
基于上述硬件測試環(huán)境,在 CPU 隔離、空負載、CPU 負載、內(nèi)存負載、IO 負載和網(wǎng)卡負載等不同條件下的測試數(shù)據(jù):
「歸納如下:」
- 通過表 6 數(shù)據(jù)可以判斷,在五種負載情況下并且 CPU 不隔離,RT 內(nèi)核比非 RT 內(nèi)核實時性要強。非 RT 內(nèi)核與 RT 內(nèi)核在 CPU 不隔離情況下,五種負載對應峰值的比值如表 7(比值數(shù)據(jù)越大表明非 RT 內(nèi)核實時性越差):
平臺 | 空負載 | CPU 負載 | 內(nèi)存負載 | IO 負載 | 網(wǎng)卡負載 |
---|---|---|---|---|---|
飛騰 D2000 | 22.7 | 117.1 | 51.0 | 184.6 | 2.9 |
樹莓派 4B | 3.6 | 2.9 | 4.3 | 0.8 | 1.5 |
飛騰 2000 | 5.4 | 4.3 | 5.3 | 34.7 | 10.6 |
「以上數(shù)據(jù)表明,RT 內(nèi)核的峰值延遲普遍要優(yōu)于非 RT 內(nèi)核。」
- 結合四種設備的峰值延遲來看,CPU 負載對實時性影響一般小于 IO 和內(nèi)存負載,而網(wǎng)卡負載影響最小。四種設備在兩種內(nèi)核下,CPU、內(nèi)存、IO 和網(wǎng)卡負載與空負載比值如表 8(比值越小越穩(wěn)定):
平臺 | CPU 負載 | 內(nèi)存負載 | IO 負載 | 網(wǎng)卡負載 |
---|---|---|---|---|
飛騰 D2000(非 RT 內(nèi)核) | 5.2 | 43.1 | 212.8 | 2.7 |
樹莓派 4B(非 RT 內(nèi)核) | 0.8 | 2.7 | 1.0 | 0.7 |
飛騰 2000(非 RT 內(nèi)核) | 0.8 | 18 | 26.8 | 1.9 |
飛騰 D2000(RT 內(nèi)核) | 1.0 | 19.2 | 26.2 | 20.6 |
樹莓派 4B(RT 內(nèi)核) | 0.9 | 1.2 | 4.2 | 1.0 |
飛騰 2000(RT 內(nèi)核) | 1.0 | 2.2 | 4.5 | 1.7 |
「表 8 各項數(shù)據(jù)表明,RT 內(nèi)核在負載情況下,實時性較為穩(wěn)定。」
「為確保 Cyclictest 測試的有效性,經(jīng)過飛騰 2000 平臺空載測試 2 天,最大延遲為 58 微秒。」
實時性對系統(tǒng)影響測試
測試環(huán)境
版本名稱 | 來源 |
---|---|
openEuler 22.03 LTS kernel 內(nèi)核 |
openEuler 22.03 LTS 官方源 |
openEuler 22.03 LTS kernel-rt 內(nèi)核 |
openEuler 22.03 LTS 官方源 |
硬件型號 | 硬件配置信息 | 備注 |
---|---|---|
飛騰 D2000 | CPU:8 核 內(nèi)存:16GB 存儲設備:SSD | 臺式機 |
飛騰 2000/4 | CPU:4 核 內(nèi)存:16GB 存儲設備:SSD | 臺式機 |
測試軟件 | 功能 | 版本 |
---|---|---|
unixbench | 系統(tǒng)的基準測試工具,可用于測試 CPU、內(nèi)存、磁盤等。測試結果與硬件、系統(tǒng)、開發(fā)庫、編譯器等相關。 | 5.1.3 |
lmbench | 是一套簡易可移植的,符合 ANSI/C 標準為 UNIX/POSIX 而制定的微型測評工具。一般來說,它衡量兩個關鍵特征:反應時間和帶寬。Lmbench 旨在使系統(tǒng)開發(fā)者深入了解關鍵操作的基礎成本。 | 3alpha4 |
rt-test(cyclictest) | 通過 cyclictest 工具,每項測試 1000 萬次,輸出平均延遲(Avg)和最大延遲(MAX) | 1.00 |
測試結果
- 飛騰 D2000 平臺 unixbench 測試結果
使用unixbench
單個任務測試非 RT 內(nèi)核空負載、RT 內(nèi)核空負載、RT 內(nèi)核負載 cyclictest(cyclictest -m -h 100 -q -i100 -t 1 -p 99 -n),三種狀態(tài)詳細測試結果如下(表中“RT/非 RT”、“RT 負載/非 RT”為百分比值,數(shù)值越大說明 RT 內(nèi)核性能越好):
測試項 | 非 RT 內(nèi)核 | RT 內(nèi)核 | RT 內(nèi)核負載 | RT/非 RT | RT 負載/非 RT |
---|---|---|---|---|---|
Dhrystone 2 using register variables | 24920250.9 | 24994936.3 | 25463306.6 | 100.30% | 102.18% |
Double-Precision Whetstone | 4043.3 | 4042.8 | 4042.9 | 99.99% | 99.99% |
Execl Throughput | 2700.1 | 2112.1 | 2109.6 | 78.22% | 78.13% |
File Copy 1024 bufsize 2000 maxblock | 437294.1 | 307416.2 | 303652.3 | 70.30% | 69.44% |
File Copy 256 bufsize 500 maxblocks | 122072.4 | 88889.0 | 86090.9 | 72.82% | 70.52% |
File Copy 4096 bufsize 8000 maxblocks | 995255.5 | 809771.5 | 774228.3 | 81.36% | 77.79% |
Pipe Throughput | 612119.9 | 487314.9 | 482060.0 | 79.61% | 78.75% |
Pipe-based Context Switching | 79151.2 | 65953.5 | 65399.0 | 83.33% | 82.63% |
Process Creation | 5098.4 | 3481.7 | 3367.9 | 68.29% | 66.06% |
Shell Scripts (1 concurrent) | 3907.2 | 3311.8 | 3264.1 | 84.76% | 83.54% |
Shell Scripts (8 concurrent) | 1724.2 | 1199.9 | 1187.6 | 69.59% | 68.88% |
System Call Overhead | 478285.9 | 436596.3 | 434507.4 | 91.28% | 90.85% |
「System Benchmarks Index Score」 | 「773.4」 | 「626.4」 | 「618.5」 | 「80.99%」 | 「79.97%」 |
使用unixbench
多任務測試非 RT 內(nèi)核空負載、RT 內(nèi)核空負載、RT 內(nèi)核負載 cyclictest(cyclictest -m -h 100 -q -i100 -t 1 -p 99 -n),三種狀態(tài)詳細測試結果如下(表中“RT/非 RT”、“RT 負載/非 RT”為百分比值,數(shù)值越大說明 RT 內(nèi)核性能越好):
測試項 | 非 RT 內(nèi)核 | RT 內(nèi)核 | RT 內(nèi)核負載 | RT/非 RT | RT 負載/非 RT |
---|---|---|---|---|---|
Dhrystone 2 using register variables | 199461755.8 | 199159490.6 | 195978301.9 | 99.85% | 98.25% |
Double-Precision Whetstone | 32216.4 | 32308.6 | 32094.1 | 100.29% | 99.62% |
Execl Throughput | 14832.9 | 9786.4 | 9375.0 | 65.98% | 63.20% |
File Copy 1024 bufsize 2000 maxblock | 924225.9 | 107564.5 | 104520.3 | 11.64% | 11.31% |
File Copy 256 bufsize 500 maxblocks | 253687.9 | 27474.4 | 26157.9 | 10.83% | 10.31% |
File Copy 4096 bufsize 8000 maxblocks | 2523753.4 | 415702.5 | 395431.5 | 16.47% | 15.67% |
Pipe Throughput | 4848867.9 | 3771186.3 | 3822723.4 | 77.77% | 78.84% |
Pipe-based Context Switching | 657475.9 | 526984.6 | 522867.1 | 80.15% | 79.53% |
Process Creation | 29117.5 | 11881.7 | 11580.0 | 40.81% | 39.77% |
Shell Scripts (1 concurrent) | 17309.7 | 8265.0 | 8199.6 | 47.75% | 47.37% |
Shell Scripts (8 concurrent) | 2308.1 | 957.1 | 937.3 | 41.47% | 40.61% |
System Call Overhead | 2928882.1 | 2765649.3 | 2744875.5 | 94.43% | 93.72% |
「System Benchmarks Index Score」 | 「3406.4」 | 「1525.8」 | 「1494.4」 | 「44.79%」 | 「43.87%」 |
-
飛騰 D2000 平臺 lmbench 測試結果
使用
lmbench
測試非 RT 內(nèi)核空負載、RT 內(nèi)核空負載、RT 內(nèi)核負載 cyclictest(cyclictest -m -h 100 -q -i100 -t 1 -p 99 -n),三種狀態(tài)詳細,測試十次取平均值,結果如下:表14:多任務Lmbench測試結果 -
飛騰 2000 平臺測試結果
飛騰 2000 平臺測試結果與飛騰 D2000 平臺測試結果相似度較高,具體數(shù)據(jù)不在此處列出。
測試結論
「Preempt_RT 補丁可以有效提高系統(tǒng)實時性,且在多種負載場景下,實時性表現(xiàn)較為穩(wěn)定。」
「Preempt_RT 補丁對本地通訊吞吐率有一定影響,主要提現(xiàn)為管道讀寫、文件拷貝,對系統(tǒng)調(diào)用延遲影響大多在 2 微秒以內(nèi)。」
后續(xù)工作
-
跟隨內(nèi)核主線發(fā)布、維護 Preempt_RT 補丁
-
研發(fā)實時性性能分析工具
-
提升實時性
-
提升吞吐率
-
引入 RTLA、RTSL 機制等
主要參與者
特別感謝 Kernel SIG 組XieXiuQi、zhengzengkai,Embedded SIG 組wanming-hu,樹莓派 SIG 組woqidaideshi,QA SIG 組suhang給予我們的幫助。
姓名 | Gitee ID | 郵箱 |
---|---|---|
郭皓 | guohaocs2c | guohao@kylinos.cn |
馬玉昆 | kylin-mayukun | mayukun@kylinos.cn |
張遠航 | zhangyh1992 | zhangyuanhang@kylinos.cn |
原文標題:openEuler 22.03 LTS 新特性解讀 | Preempt_RT
文章出處:【微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
-
Linux
+關注
關注
87文章
11345瀏覽量
210389 -
實時系統(tǒng)
+關注
關注
0文章
38瀏覽量
14517 -
openEuler
+關注
關注
2文章
319瀏覽量
5939
原文標題:openEuler 22.03 LTS 新特性解讀 | Preempt_RT
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論