前 言
本文檔主要介紹Linux-RT實時內(nèi)核的性能測試方法,以及使用Linux-RT內(nèi)核進(jìn)行系統(tǒng)開發(fā)和應(yīng)用開發(fā)的使用說明。
開發(fā)環(huán)境
Windows開發(fā)環(huán)境:Windows10 64bit
Linux開發(fā)環(huán)境:VMware16.2.5、Ubuntu22.04.4 64bit
LinuxSDK開發(fā)包:LinuxSDK-[版本號](基于SDK_2025.1)
交叉編譯工具鏈:
應(yīng)用開發(fā):gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
U-Boot、內(nèi)核開發(fā):gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
評估板系統(tǒng)版本:U-Boot-2021.01、Linux-6.1.111、Buildroot-2022.02
備注:本文基于8GByteeMMC、1GByteDDR配置核心板進(jìn)行演示。
術(shù)語表
為便于閱讀,下表對文檔出現(xiàn)的關(guān)鍵術(shù)語進(jìn)行解釋;對于廣泛認(rèn)同釋義的術(shù)語,在此不做注釋。

注意事項
我司默認(rèn)使用的是Linux內(nèi)核,同時提供了Linux-RT內(nèi)核,位于產(chǎn)品資料“4-軟件資料LinuxKernelimagelinux-6.1.111-[版本號]-[Git系列號]”目錄下。請按照《Linux系統(tǒng)開發(fā)手冊》替換Kernel鏡像章節(jié)中的方法替換Linux-RT內(nèi)核。
Linux-RT介紹
我司提供的Linux-RT內(nèi)核應(yīng)用了開源的RT PREEMPT機(jī)制進(jìn)行補丁。PREEMPT_RT補丁的關(guān)鍵是最小化不可搶占的內(nèi)核代碼量,同時最小化必須更改的代碼量,以便提供這種附加的可搶占性。Linux-RT內(nèi)核增加PREEMPT_RT補丁后,增加了系統(tǒng)響應(yīng)的確定性和實時性,但是代價是CPU性能降低。
Linux-RT內(nèi)核與普通Linux內(nèi)核相比,幾個主要的相同之處是:
(1)具有相同的開發(fā)生態(tài)系統(tǒng),包括相同工具鏈、文件系統(tǒng)和安裝方法,以及相同的POSIX API等。
(2)仍然存在內(nèi)核空間和用戶空間的劃分。
(3)Linux應(yīng)用程序在用戶空間中運行。
Linux-RT內(nèi)核與普通Linux內(nèi)核在常規(guī)編程方式上的幾個主要不同之處是:
(1)調(diào)度策略。
(2)優(yōu)先級和內(nèi)存控制。
(3)基于Linux-RT內(nèi)核的應(yīng)用程序使用了調(diào)度策略后,系統(tǒng)將根據(jù)調(diào)度策略對其進(jìn)行調(diào)優(yōu)。
Linux系統(tǒng)實時性測試
本章節(jié)主要介紹使用Cyclictest延遲檢測工具測試Linux系統(tǒng)實時性的方法。Cyclictest是rt-tests測試套件下的一個測試工具,也是rt-tests下使用最廣泛的測試工具,一般主要用來測試內(nèi)核的延遲,從而判斷內(nèi)核的實時性。
Cyclictest常用于實時系統(tǒng)的基準(zhǔn)測試,是評估實時系統(tǒng)相對性能的最常用工具之一。Cyclictest反復(fù)測量并精確統(tǒng)計線程的實際喚醒時間,以提供有關(guān)系統(tǒng)的延遲信息。它可測量由硬件、固件和操作系統(tǒng)引起的實時系統(tǒng)的延遲。
為了測量延遲,Cyclictest運行一個非實時主線程(調(diào)度類SCHED_OTHER),該線程以定義的實時優(yōu)先級(調(diào)度類SCHED_FIFO)啟動定義數(shù)量的測量線程。測量線程周期性地被一個到期的計時器(循環(huán)報警)所定義的間隔喚醒,隨后計算有效喚醒時間,并通過共享內(nèi)存將其傳遞給主線程。主線程統(tǒng)計延遲值并打印最小、最大和平均延遲時間。
Linux、Linux-RT實時性對比
本次測試結(jié)合Iperf和Cyclictest工具,對比測試基于Linux-RT-6.1.111內(nèi)核和Linux-6.1.111內(nèi)核的系統(tǒng)實時性能。此處使用Iperf工具不斷觸發(fā)系統(tǒng)中斷,提高中斷處理負(fù)載,以便更好測試系統(tǒng)實時特性。
在Ubuntu執(zhí)行如下命令查看IP地址,并以服務(wù)器模式啟動Iperf測試。
Host# ifconfig
Host# iperf3 -s
圖?1
分別使用Linux-RT-6.1.111內(nèi)核和Linux-6.1.111內(nèi)核啟動評估板進(jìn)行測試。執(zhí)行如下命令以客戶端模式啟動Iperf,并連接至服務(wù)器端(Ubuntu系統(tǒng))。"192.168.13.81"為Ubuntu的IP地址,"-t3600"設(shè)置測試時間為3600秒,"&"表示讓程序在后臺運行。
Target# iperf3 -c 192.168.13.81-d -t3600 > /dev/null 2>&1 &
圖 2
評估板文件系統(tǒng)默認(rèn)已提供Cyclictest工具,進(jìn)入評估板文件系統(tǒng),執(zhí)行如下命令使用Cyclictest工具測試系統(tǒng)實時性。
Target# cyclictest -t5 -p98 -m -D10m
圖?3?Linux-RT-6.1.111內(nèi)核測試結(jié)果
圖?4?Linux-6.1.111內(nèi)核測試結(jié)果

對比測試數(shù)據(jù),可看到基于Linux-RT-6.1.111內(nèi)核的系統(tǒng)的延遲更加穩(wěn)定,平均延遲、最大延遲更低,系統(tǒng)實時性更佳。
Cyclictest命令參數(shù)解析可執(zhí)行"cyclictest --help"查看,如下圖所示。
圖?5
圖?6
Linux-RT性能測試
本次測試分別在CPU空載、滿負(fù)荷(運行stress壓力測試工具)、隔離CPU核心的情況下,對比評估Linux-RT內(nèi)核的系統(tǒng)實時性。
CPU空載狀態(tài)
評估板上電啟動,進(jìn)入評估板文件系統(tǒng),執(zhí)行如下命令修改內(nèi)核printk日志等級,避免內(nèi)核打印信息影響實時測試。
Target# echo 1 > /proc/sys/kernel/printk
圖?7
調(diào)整內(nèi)存分配策略為"2",禁用內(nèi)存過度使用。避免出現(xiàn)OOM(Out-of-Memory) Killer攻擊某些進(jìn)程而產(chǎn)生延遲,影響測試結(jié)果。
Target# echo 2> /proc/sys/vm/overcommit_memory
圖?8
執(zhí)行如下命令,基于CPU空載狀況下測試系統(tǒng)的實時性。測試指令需運行12小時,請保持評估板長時間穩(wěn)定工作,測試完成后將生成統(tǒng)計結(jié)果no_load_output文件。
Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > no_load_output
圖?9
參數(shù)解析:
-m:鎖定當(dāng)前和將來的內(nèi)存分配;
-S:采用標(biāo)準(zhǔn)SMP測試;
-p:設(shè)置線程優(yōu)先級;
-i:設(shè)置線程的基本間隔;
-h:運行后將延遲直方圖轉(zhuǎn)儲至標(biāo)準(zhǔn)輸出,亦可指定要跟蹤的最大延時時間(以微秒為單位);
-D:指定測試運行時長,附加m(分鐘)、h(小時)、d(天)指定;
-q:運行時不打印相關(guān)信息;
CPU滿負(fù)荷狀態(tài)
評估板上電啟動,進(jìn)入評估板文件系統(tǒng)執(zhí)行如下命令,修改內(nèi)核printk日志等級,避免內(nèi)核打印信息影響實時測試。
Target# echo 1 > /proc/sys/kernel/printk
圖?10
調(diào)整內(nèi)存分配策略為"2",禁用內(nèi)存過度使用。避免出現(xiàn)OOM(Out-of-Memory) Killer攻擊某些進(jìn)程而產(chǎn)生延遲,影響測試結(jié)果。
Target# echo 2 > /proc/sys/vm/overcommit_memory
圖?11
執(zhí)行如下命令,運行stress壓力測試工具,使得CPU處于滿負(fù)荷狀態(tài)。
Target# stress-ng --cpu 2 --cpu-method=all --io 2 --vm 2 --vm-bytes 32M --timeout 43200s &
圖?12
參數(shù)解析:
--cpu:指定壓力測試的進(jìn)程個數(shù);
--cpu-method:指定CPU壓力測試的方式;
--io:指定I/O測試的進(jìn)程個數(shù);
--vm:指定內(nèi)存測試的進(jìn)程個數(shù);
--vm-bytes:指定每個內(nèi)存測試進(jìn)程中分配內(nèi)存的大??;
--timeout:指定測試時長;
使用cyclictest工具測試CPU滿負(fù)荷狀態(tài)下的系統(tǒng)實時性能。測試指令需運行12小時,請保持評估板長時間穩(wěn)定工作,測試完成后將生成統(tǒng)計結(jié)果overload_output文件。
Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > overload_output
圖?13
隔離CPU核心狀態(tài)
本次測試以隔離CPU1核心為例,通過降低系統(tǒng)上所運行的其他進(jìn)程對隔離CPU1產(chǎn)生的延遲影響,確保CPU1進(jìn)程的正常運行,進(jìn)而評估Linux-RT內(nèi)核的系統(tǒng)實時性。
評估板上電啟動后,在U-Boot倒計時結(jié)束之前長按"Ctrl + C"進(jìn)入U-Boot命令行模式,執(zhí)行如下命令,修改環(huán)境變量,隔離CPU1核心。
U-Boot# setenv mmc_boot 'if mmc dev ${devnum}; then devtype=mmc; if test ${devnum} -eq 0; then setenv bootargs '"'"'console=ttyS1,115200n8 earlycon=uart,mmio32,0xf8401000 loglevel=8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait isolcpus=1'"'"'; fi; if test ${devnum} -eq 1; then setenv bootargs '"'"'console=ttyS1,115200n8 earlycon=uart,mmio32,0xf8401000 loglevel=8 root=/dev/mmcblk1p2 rw rootfstype=ext4 rootwait isolcpus=1'"'"'; fi; ext4load mmc ${devnum}:2 ${kernel_addr_r} ${bootdir}/${kernel_image}; ext4load mmc ${devnum}:2 ${fdt_addr_r} ${bootdir}/${devicetree_image}; bootm ${kernel_addr_r} - ${fdt_addr_r}; run scan_dev_for_boot_part2; fi'
U-Boot# saveenv
U-Boot# reset
圖?14
如需恢復(fù)U-Boot環(huán)境變量,在U-Boot命令行模式執(zhí)行以下命令。
U-Boot# env default -a-f
U-Boot# saveenv
U-Boot# reset
圖?15
進(jìn)入評估板文件系統(tǒng),執(zhí)行如下命令,查看環(huán)境變量是否設(shè)置成功。
Target# cat /proc/cmdline
圖?16
執(zhí)行如下命令,修改內(nèi)核printk日志等級,避免內(nèi)核打印信息影響實時測試。
Target# echo 1 > /proc/sys/kernel/printk
圖?17
調(diào)整內(nèi)存分配策略為"2",禁用內(nèi)存過度使用。避免出現(xiàn)OOM(Out-of-Memory) Killer攻擊某些進(jìn)程而產(chǎn)生延遲,影響測試結(jié)果。
Target# echo 2> /proc/sys/vm/overcommit_memory
圖?18
執(zhí)行如下命令,運行stress壓力測試工具,使得CPU處于滿負(fù)荷狀態(tài)。
Target# stress-ng --cpu 2 --cpu-method=all --io 2 --vm 2 --vm-bytes 32M --timeout 43200s &
圖?19
因CPU1核心被隔離,程序默認(rèn)不會在CPU1上運行,需使用taskset工具將cyclictest測試程序運行在所有核心上,測試cyclictest在滿負(fù)荷狀態(tài)的CPU0和被隔離的CPU1的實時性能。測試指令需運行12小時,請保持評估板長時間穩(wěn)定工作,測試完成后將生成統(tǒng)計結(jié)果iso_overload_output文件。
Target# taskset -c 0-1 cyclictest -m -Sp99 -i1000 -h800 -D12h -q > iso_overload_output
圖?20
統(tǒng)計結(jié)果分析
我司已提供腳本文件get_histogram.sh用于繪制統(tǒng)計結(jié)果直方圖,位于產(chǎn)品資料“4-軟件資料Demolinux-rt-demoscyclictestbin”目錄下,請將該腳本文件拷貝至Ubuntu工作目錄下。
圖?21
在Ubuntu系統(tǒng)執(zhí)行如下命令,安裝gnuplot工具。
Host# sudo apt-get install gnuplot
圖?22
(1)CPU空載狀態(tài)
請將CPU空載狀態(tài)下的統(tǒng)計結(jié)果no_load_output文件拷貝至Windows工作目錄,使用Windows文本工具打開該文件并拖動至文件末尾,可查看Linux系統(tǒng)每個核心CPU0~CPU1的最小延遲(Min Latencies)、平均延遲(Avg Latencies)、最大延遲(Max Latencies)統(tǒng)計結(jié)果。
圖?23
請將CPU空載狀態(tài)下的統(tǒng)計結(jié)果no_load_output文件拷貝至Ubuntu,存放在get_histogram.sh同一目錄下??截恘o_load_output文件為output文件。執(zhí)行如下命令生成直方圖文件plot.png,請將其拷貝至Windows下并打開。
Host# cp no_load_output output
Host# ./get_histogram.sh
圖?24
圖?25
根據(jù)測試結(jié)果output文件數(shù)據(jù)以及結(jié)合直方圖,可得主要數(shù)據(jù)如下表。本次測試中,CPU1核心Max Latencies值最大,為44us,CPU0核心的Max Latencies值最小,為42us。
備注:測試數(shù)據(jù)與實際測試環(huán)境有關(guān),僅供參考。

(2)CPU滿負(fù)荷狀態(tài)
參考如上方法,分析CPU滿負(fù)荷狀態(tài)下的統(tǒng)計結(jié)果如下所示。本次測試中,CPU1核心Max Latencies值最大,為100us,CPU0核心的Max Latencies值最小,為78us。
圖?26

(3)隔離CPU核心狀態(tài)
參考如上方法,分析隔離CPU核心狀態(tài)下的統(tǒng)計結(jié)果如下所示。本次測試中,CPU0核心Max Latencies值最大,為42us,隔離CPU1核心的Max Latencies值最小,為28us。


根據(jù)CPU空載、CPU滿負(fù)荷、隔離CPU核心三種狀態(tài)的測試結(jié)果可知:當(dāng)程序指定至隔離的CPU1核心上運行時,Linux系統(tǒng)延遲最低,可有效提高系統(tǒng)實時性。故推薦對實時性要求較高的程序(功能)指定至隔離的CPU核心運行。
外設(shè)使用說明
我司提供的Linux-RT內(nèi)核與普通Linux內(nèi)核測試方法一致,請參考《評估板測試手冊》進(jìn)行測試即可。Linux-RT內(nèi)核支持的外設(shè)接口及測試結(jié)果匯總?cè)缦卤硭尽?/p>

系統(tǒng)使用說明
Linux-RT內(nèi)核與普通Linux內(nèi)核在系統(tǒng)使用上保持一致,具體操作方法請參考《Linux系統(tǒng)使用手冊》。
?審核編輯 黃宇
-
Linux
+關(guān)注
關(guān)注
88文章
11756瀏覽量
218997 -
編譯
+關(guān)注
關(guān)注
0文章
694瀏覽量
35154 -
GPIO
+關(guān)注
關(guān)注
16文章
1328瀏覽量
56212
發(fā)布評論請先 登錄
基于安路DR1M90 FPSoC的Linux系統(tǒng)全流程開發(fā)指南(4)
RK3562 單板機(jī) Linux-RT 系統(tǒng)開發(fā)指南:內(nèi)核配置、實時性優(yōu)化與案例詳解
實測14us,Linux-RT實時性能及開發(fā)案例分享—基于全志T507-H國產(chǎn)平臺
實測14us,Linux-RT實時性能及開發(fā)案例分享—基于全志T507-H國產(chǎn)平臺
米爾國產(chǎn)FPGA SoC芯選擇,安路飛龍DR1M90核心板重磅發(fā)布
Linux-RT特點及簡單應(yīng)用
基于全志A40i開發(fā)板——Linux-RT內(nèi)核應(yīng)用開發(fā)教程(1)
全志A40i開發(fā)板——Linux-RT內(nèi)核應(yīng)用開發(fā)教程(2)
基于全志A40i開發(fā)板——Linux-RT內(nèi)核應(yīng)用開發(fā)教程(3)
創(chuàng)龍科技DR1M90工業(yè)評估板的關(guān)鍵優(yōu)勢
創(chuàng)龍 瑞芯微 RK3588 國產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—Linux-RT應(yīng)用開發(fā)案例
安路DR1M90評估板:從基礎(chǔ)外設(shè)到通信模塊測試指南
基于安路DR1M90 FPSoC 的Linux 系統(tǒng)全流程開發(fā)指南(1)
基于安路DR1M90 FPSoC 的Linux 系統(tǒng)全流程開發(fā)指南(3)
DR1M90 開源 IgH EtherCAT 主站案例:伺服電機(jī)正反轉(zhuǎn)實時控制方案
基于 DR1M90 的 Linux-RT 內(nèi)核開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實現(xiàn)(1)
評論