G8701 RK3576 RealTime Linux 测试报告

概述

标准Linux系统目的是构建一个完整、稳定的开源操作系统,尽量缩短系统的平均响应时间,提高吞吐量,注重操作系统的整体功能需求,达到更好地平均性能,所以标准Linux并不提供硬实时性。

芯片 内核版本 系统
RK3576 6.1.99 buildroot

测试设备

改进方法:PREEMPT_RT Patch

直接修改Linux内核源代码。

对Linux内核代码进行细微修改并不对内核作大规模的变动,在遵循 GPL协议的情况下,直接修改内核源代码将Linux改造成一个完全可抢占的实时系统。

其缺点是: 通过修改Linux内核,难以保证实时进程的执行不会遭到非实时进程所进行的不可预测活动的干扰。该方法的代表是RT-patch(Real Preemption Patch)。

改进后的系统:

复制代码
root@hw3576-core:/# uname -a
Linux hw3576-core 6.1.99-rt36-rk3576 #4 SMP PREEMPT_RT Fri Feb  6 11:51:05 CST 2026 aarch64 GNU/Linux
root@hw3576-core:/#

不带桌面的系统实时性能比带桌面的系统要好,推荐使用buildroot系统。

实时性能测试

空载测试

命令:cyclictest -c 0 -m -t 8 -p 99

说明:

-t 8 表示8个线程进行测试,每个线程将创建一个周期性负载。

-p 99 表示 线程优先级为99,这是最高的实时优先级。使用最高优先级可以更好地测试系统的实时性能。

-m 运行测试前锁定内存。

-c 0 使用单调递增的时钟,不受系统时间调整影响。

复制代码
root@hw3576-core:/# cyclictest -c 0 -m -t 8 -p 99
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 1.07 1.26 1.25 3/291 1157
​
T: 0 ( 1126) P:99 I:1000 C:2871693 Min:      0 Act:    0 Avg:    0 Max:       3
T: 1 ( 1127) P:99 I:1500 C:1914458 Min:      0 Act:    0 Avg:    0 Max:       4
T: 2 ( 1128) P:99 I:2000 C:1435841 Min:      0 Act:    0 Avg:    0 Max:       3
T: 3 ( 1129) P:99 I:2500 C:1148671 Min:      0 Act:    0 Avg:    0 Max:       4
T: 4 ( 1130) P:99 I:3000 C: 957224 Min:      0 Act:    0 Avg:    0 Max:       3
T: 5 ( 1131) P:99 I:3500 C: 820477 Min:      0 Act:    0 Avg:    0 Max:       3
T: 6 ( 1132) P:99 I:4000 C: 717916 Min:      0 Act:    0 Avg:    0 Max:       3
T: 7 ( 1133) P:99 I:4500 C: 638146 Min:      0 Act:    0 Avg:    0 Max:       3
(测试1小时)

输出结果中关键字段的含义是:

  • T:线程序号。

  • P :该线程的实时优先级。请注意,从第二个线程开始,优先级会逐级递减(如99, 98, 97...),这是cyclictest的默认行为。

  • I:线程的唤醒间隔,单位是微秒(µs),默认通常是1000µs(1毫秒)。

  • C:循环计数器,表示该线程已经完成的测试周期数。

  • Min:当前测到的最小延迟。

  • Act:最近一次测量到的延迟。

  • Avg:平均延迟。

  • Max :当前测到的最大延迟。这是评估系统实时性能的一个关键指标,需要重点关注其数值和稳定性

压力测试

命令:stress-ng压力测试的同时测试实时性。

stress-ng -c 4 --io 2 --vm 1 --vm-bytes 1024M --timeout 1000000s

cyclictest -c 0 -m -n -t 8 -p 99

复制代码
root@hw3576-core:/# stress-ng -c 4 --io 2 --vm 1 --vm-bytes 1024M --timeout 1000
[1] 1116
 stress-ng: info:  [1116] setting to a 1000000 second (11 days, 13 hours, 46 mins, 40.00 secs) run per stressor
stress-ng: info:  [1116] dispatching hogs: 4 cpu, 2 io, 1 vm
stress-ng: info:  [1122] io: this is a legacy I/O sync stressor, consider using iomix instead
# 
root@hw3576-core:/# cyclictest -c 0 -m -t 8 -p 99
/dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 9.40 9.34 8.59 8/305 1187
​
T: 0 ( 1129) P:99 I:1000 C:2315187 Min:      0 Act:    1 Avg:    1 Max:      11
T: 1 ( 1130) P:99 I:1500 C:1543454 Min:      0 Act:    0 Avg:    1 Max:       9
T: 2 ( 1131) P:99 I:2000 C:1157587 Min:      0 Act:    1 Avg:    1 Max:      10
T: 3 ( 1132) P:99 I:2500 C: 927313 Min:      0 Act:    1 Avg:    1 Max:       8
T: 4 ( 1133) P:99 I:3000 C: 772759 Min:      0 Act:    1 Avg:    2 Max:       8
T: 5 ( 1134) P:99 I:3500 C: 662363 Min:      0 Act:    1 Avg:    1 Max:       8
T: 6 ( 1135) P:99 I:4000 C: 579566 Min:      0 Act:    1 Avg:    1 Max:       9
T: 7 ( 1136) P:99 I:4500 C: 515168 Min:      0 Act:    3 Avg:    2 Max:      15
root@hw3576-core:/#
(测试1小时)

隔离核心

bootargs添加 isolcpus=2,3 ,将核心cpu2,cpu3隔离出来,不参与系统任务调度,并作为实时核心。

修改/boot/uEnv/uEnv.txt ,在cmdline中添加isolcpus=2,3,保存,并重启设备。

查看CPU核心是否被隔离

复制代码
#查看指定进程pid绑定到哪些CPU核心上
root@hw3576-core:/# taskset -cp 1
​
#信息输出如下
pid 1's current affinity list: 0,1,4-7

从输出信息可见,pid 1进程运行在0,1,4-7核上,没有运行在2、3核,也就是成功对CPU核心进行隔离。

相关推荐
小白同学_C8 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖8 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
2601_949146538 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天9 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师10 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp10 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
不做无法实现的梦~10 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
Elastic 中国社区官方博客10 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸10 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器