?前 言
本文檔詳細介紹了Linux-RT實時內核的性能測試方法,以及使用Linux-RT內核進行系統開發和應用開發的使用說明。
開發環境
Windows開發環境:Windows1064bit、Windows764bit
Linux開發環境:VMware16.2.5、Ubuntu20.04.6 64bit
LinuxSDK:LinuxSDK-[版本號](基于rk3562_linux_sdk_release_v1.2.0)
系統版本:Tronlong-Desktop 20.04、Linux-5.10.209、Linux-RT-5.10.209、U-Boot-2017.09
交叉編譯工具鏈:
應用開發交叉編譯工具鏈:aarch64-linux-gnu-gcc(版本為9.4.0)
U-Boot開發、內核開發:gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf
備注:本文基于2GByte LPDDR4X、16GByte eMMC配置單板機進行演示。
術語表
為便于閱讀,下表對文檔出現的關鍵術語進行解釋;對于廣泛認同釋義的術語,在此不做注釋。

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

對比測試數據,可看到基于Linux-RT-5.10.209內核的系統的延遲更加穩定,平均延遲、最大延遲更低,系統實時性更佳。
Cyclictest命令參數解析可執行"cyclictest --help"查看,如下圖所示。
圖?7
2.2Linux-RT性能測試
本次測試分別在CPU空載、滿負荷(運行stress壓力測試工具)、隔離CPU核心的情況下,對比評估Linux-RT內核的系統實時性。
2.2.1CPU空載狀態
單板機上電啟動,進入單板機系統,執行如下命令修改內核printk日志等級,避免內核打印信息影響實時測試。
Target# echo 1 > /proc/sys/kernel/printk
圖?8
調整內存分配策略為"1",禁用內存過度使用。避免出現OOM(Out-of-Memory) Killer攻擊某些進程而產生延遲,影響測試結果。
Target# echo 1 > /proc/sys/vm/overcommit_memory
圖?9
執行如下命令,基于CPU空載狀況下測試系統的實時性。測試指令需運行12小時,請保持單板機長時間穩定工作,測試完成后將生成統計結果no_load_output文件。
Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > no_load_output
圖?10
參數解析:
-m:鎖定當前和將來的內存分配;
-n:使用clock_nanosleep;
-S:采用標準SMP測試;
-p:設置線程優先級;
-i:設置線程的基本間隔;
-h:運行后將延遲直方圖轉儲至標準輸出,亦可指定要跟蹤的最大延時時間(以微秒為單位);
-D:指定測試運行時長,附加m(分鐘)、h(小時)、d(天)指定;
-q:運行時不打印相關信息;
2.2.2CPU滿負荷狀態
單板機上電啟動,進入單板機系統執行如下命令,修改內核printk日志等級,避免內核打印信息影響實時測試。
Target# echo 1 > /proc/sys/kernel/printk
圖?11
調整內存分配策略為"1",禁用內存過度使用。避免出現OOM(Out-of-Memory) Killer攻擊某些進程而產生延遲,影響測試結果。
Target# echo 1 > /proc/sys/vm/overcommit_memory
圖?12
執行如下命令,運行stress壓力測試工具,使得CPU處于滿負荷狀態。
Target# stress-ng --cpu 4 --cpu-method=all --io 4 --vm 4 --vm-bytes 64M --timeout 43200s &
圖?13
參數解析:
--cpu:指定壓力測試的進程個數;
--cpu-method:指定CPU壓力測試的方式;
--io:指定I/O測試的進程個數;
--vm:指定內存測試的進程個數;
--vm-bytes:指定每個內存測試進程中分配內存的大小;
--timeout:指定測試時長;
使用cyclictest工具測試CPU滿負荷狀態下的系統實時性能。測試指令需運行12小時,請保持單板機長時間穩定工作,測試完成后將生成統計結果overload_output文件。
Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > overload_output
圖?14
2.2.3隔離CPU核心狀態
本次測試以隔離CPU3核心為例,通過降低系統上所運行的其他進程對隔離CPU3產生的延遲影響,確保CPU3進程的正常運行,進而評估Linux-RT內核的系統實時性。
單板機上電啟動后,在U-Boot倒計時結束之前長按"Ctrl + C"進入U-Boot命令行模式,執行如下命令,修改環境變量,隔離CPU3核心。
備注:若從板載eMMC啟動系統,請將命令中"sd"修改為"emmc"。
U-Boot# setenv bootargs "storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal isolcpus=3"
U-Boot# saveenv
U-Boot# reset
圖?15
如需恢復U-Boot環境變量,在U-Boot命令行模式執行以下命令。
U-Boot# env default -f -a
U-Boot# saveenv
U-Boot# reset
圖?16
進入單板機系統,執行如下命令,查看環境變量是否設置成功。
Target# cat /proc/cmdline
圖?17
執行如下命令,修改內核printk日志等級,避免內核打印信息影響實時測試。
Target# echo 1 > /proc/sys/kernel/printk
圖?18
調整內存分配策略為"1",禁用內存過度使用。避免出現OOM(Out-of-Memory) Killer攻擊某些進程而產生延遲,影響測試結果。
Target# echo 1 > /proc/sys/vm/overcommit_memory
圖?19
執行如下命令,運行stress壓力測試工具,使得CPU處于滿負荷狀態。
Target# stress-ng --cpu 4 --cpu-method=all --io 4 --vm 4 --vm-bytes 64M --timeout 43200s &
圖?20
因CPU3核心被隔離,程序默認不會運行在CPU3上,需使用taskset工具將cyclictest測試程序運行在所有核心上,測試cyclictest在滿負荷狀態的CPU3的實時性能。測試指令需運行12小時,請保持單板機長時間穩定工作,測試完成后將生成統計結果iso_overload_output文件。
Target# taskset -c 0-3 cyclictest -m -Sp99 -i1000 -h800 -D12h -q > iso_overload_output
圖?21
2.2.4統計結果分析
我司已提供腳本文件get_histogram.sh用于繪制統計結果直方圖,位于產品資料“4-軟件資料Demolinux-rt-demoscyclictest”目錄下,請將該腳本文件拷貝至Ubuntu工作目錄下。
圖?22
在Ubuntu系統執行如下命令,安裝gnuplot工具。
Host# sudo apt-get install gnuplot
圖?23
(1)CPU空載狀態
請將CPU空載狀態下的統計結果no_load_output文件拷貝至Windows工作目錄,使用Windows文本工具打開該文件并拖動至文件末尾,可查看Linux系統每個核心CPU0~CPU3的最小延遲(Min Latencies)、平均延遲(Avg Latencies)、最大延遲(Max Latencies)統計結果。
圖?24
請將CPU空載狀態下的統計結果no_load_output文件拷貝至Ubuntu,存放在get_histogram.sh同一目錄下。拷貝no_load_output文件為output文件。執行如下命令生成直方圖文件plot.png,請將其拷貝至Windows下并打開。
Host# cp no_load_outputoutput
Host# ./get_histogram.sh
圖?25
圖?26
根據測試結果output文件數據以及結合直方圖,可得主要數據如下表。本次測試中,CPU1核心Max Latencies值最大,為74us,CPU2核心的Max Latencies值最小,為49us。
備注:測試數據與實際測試環境有關,僅供參考。

(2)CPU滿負荷狀態
參考如上方法,分析CPU滿負荷狀態下的統計結果如下所示。本次測試中,CPU2核心Max Latencies值最大,為195us,CPU1核心的Max Latencies值最小,為135us。
圖?27

(3)隔離CPU核心狀態
參考如上方法,分析隔離CPU核心狀態下的統計結果如下所示。本次測試中,CPU0核心Max Latencies值最大,為284us,隔離CPU3核心的Max Latencies值最小,為76us。
圖?28

根據CPU空載、CPU滿負荷、隔離CPU核心三種狀態的測試結果可知:當程序指定至隔離的CPU3核心上運行時,Linux系統延遲最低,可有效提高系統實時性。故推薦對實時性要求較高的程序(功能)指定至隔離的CPU核心運行。
由于篇幅過長等原因,部分內容均不逐一展示,如需獲取完整版詳細資料,請關注Tronlong創龍科技微信公眾號或官網,或者評論區留言,感謝您的支持!
審核編輯 黃宇
-
系統開發
+關注
關注
2文章
119瀏覽量
10616 -
單板機
+關注
關注
1文章
42瀏覽量
18868 -
RK3562
+關注
關注
0文章
99瀏覽量
689
發布評論請先 登錄
RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(二)
延時僅33us,Linux-RT實時性能測試分享—基于瑞芯微RK3562J國產平臺
SBC8100單板機設計及使用指南
3562 單板機 Linux 系統固化完全指南:從 SD 卡啟動到 eMMC 永久部署
RK3562 單板機 Linux 應用開發實戰手冊:LED/CAN/TCP/UART 案例與 Python 開發(二)
RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(一)
RK3562 單板機 Linux-RT 系統開發指南:內核配置、實時性優化與案例詳解
評論