测量小百科 | 麒麟Linux RT的实时性测评
来源: | 作者:JYTEK | 发布时间: 2022-06-07 | 698 次浏览 | 分享到:

关键词:麒麟LinuxPreempt RT、实时性、闭环控制

 

导读

实时系统的主要特点是必须保证操作的时间确定性【1】,需要在确定的时间内完成确定的操作。比如,闭环控制应用,通常是以固定的周期进行循环,如果程序不能在下一个周期前完成需要的操作,则会影响到整个控制的效果。每周期具体操作消耗的时间主要由每周期程序开始执行的Latency和相关计算所需要的时间组成。相关计算所需要的时间与具体计算的复杂度等因素有关,一般比较确定,也比较容易评估。而每周期程序开始执行的Latency则与操作系统的实时性能有关,可以通过程序进行长时间的测试统计来进行评估。本文接下来将展示在使用了 Preempt RT 补丁的银河麒麟V10系统中,使用rt-tests中的cyclictest工具对系统进行实时性测评的结果。

 

测试环境和配置

  • 硬件环境:JYTEK PXIe-63985Intel® Core™ i7-4700EQ 2.4 GHz四核处理器)

  • 操作系统:银河麒麟V10

  • 内核版本:5.4.193

  • Preempt RT Patch版本:5.4.193-rt74

  • 测试的期望周期:200μs

  • 测试总的周期数:1080M次(60小时)

  • 进程优先级:最高优先级Realtime

  • 进程调度方式:Sched FIFO

  • 系统性能优化【2】:关闭超线程,隔离CPU3用于实时任务,中断优化等

 

实时性测评原理

周期任务运行的主要过程如下图所示:

图 1  周期任务的运行过程

 

衡量操作系统在指定时刻执行操作的Latency,可以采用定时循环的方式,统计每个周期程序开始执行的实际时刻与期望时刻的延迟来确定。图1中,从T0时刻开始,程序以期望周期进行循环,预期T1时刻会第二次执行具体的操作,而由于系统的调度,并不能刚好在T1时刻程序可以恢复执行,实际会多一个Latency时间后再开始执行具体操作。这个Latency的统计结果(包括最大值、最小值、平均值、直方图分布),在闭环控制的应用中可以决定最高闭环控制的频率。

 

在隔离CPU中运行的测评结果

按照我们测试的配置,CPU3被隔离出来,能够尽可能小的受到系统其它进程和中断的影响,测试的统计结果如下图所示:

图 2  隔离CPU上的测量结果

 

图中横坐标表示时间,单位μs,纵坐标表示对应时间统计到的次数,纵坐标采用对数显示(由于纵坐标各个时间对应的数值相差较大,线性坐标不能完整的看清楚各个时间对应的数值,所以采用对数坐标,下同)。

图中可见,在隔离CPU中运行定时循环,周期Latency的最大值为17μs,最小值为1μs,平均值为1μs。其中,1~4μs范围占了99.997326%1~8μs范围占了99.999969%,也就是有不到十万分之3的几率大于4μs,不到千万分之3的几率大于8μs100%17μs以内。

 

在非隔离CPU中运行的测评结果

按照我们测试的配置,CPU3被隔离出来,为了对比隔离CPU和非隔离CPU的差异,我们同时在CPU2运行另外一个测试,最大程序减少中断的影响,能配置的中断都配置到了CPU0CPU1了。测试的统计结果如图3所示。

图中可见,在非隔离CPU中运行定时循环,周期Latency的最大值为19μs,最小值为1μs,平均值为1μs。其中,1~4μs范围占了99.917870%1~8μs范围占了99.999925%,也就是有将近万分之8的几率大于4μs,不到千万分之8的几率大于5μs100%19μs以内。

 3  非隔离CPU上的测量结果

 

总结

从以上隔离/非隔离CPU运行的Latency测试结果可以得知:通过性能优化后,在隔离CPU上运行的程序每周期的Latency明显的更集中于低延迟,出现较大Latency的可能性更小。而在非隔离CPU中运行的程序,由于可能受到系统中其他进程的影响,相对来说Latency的集中度要差一点,但即便如此,最大的Latency也只有19μs

对于闭环控制应用,每周期除了固定的Latency以外,其他时间是用户做采集、输出和运算等操作可以使用的时间。从测试结果来看,如果以200μs的周期做闭环控制,用户可用的时间最少为181μs。因此,如果用户的采集、输出和运算的最大时间(Tμ_max)确定,根据以上测试的结果,我们可以得知这套实时系统能够做的最小闭环周期为:Tμ_max + MaxLatency

 

参考

1. 实时系统的性能时标评估:https://wenku.baidu.com/view/10078dd4fa0f76c66137ee06eff9aef8941e48a8.html

2. HOWTO: Build an RT-application:https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application

3. Preempt RThttps://wiki.linuxfoundation.org/realtime/documentation/start