百科
https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start 引用如下 Cyclictest is most commonly used for benchmarking RT systems. It is one of the most frequently used tools for evaluating the relative performance of real-time systems. Some performance tests which use Cyclictest are listed below as well as some other uses for Cyclictest.
System benchmarking: RTEval, Worst case latency test scenarios
RT-Linux的核心是Linux内核的一个实时扩展,它为实时任务提供了必要的调度机制和时间管理。 通过采用抢占式调度策略,高优先级的实时任务可以打断低优先级的任务,确保实时任务能够及时响应。 RT-Linux对任务的调度和中断处理进行了改进,使得任务能够按照预定的时间要求执行。
RT-Linux适用于对时间要求敏感的应用领域,例如工业自动化、机器人控制、航空航天系统等。 它可以提供精确的任务调度和快速的响应时间,以确保系统能够在实时任务的要求下正常运行。
与传统的Linux内核相比,RT-Linux在实时性能方面有所提升,但它并不是一个硬实时系统,无法保证任务的执行时间绝对精确。 对于对时间要求极高的应用,可能需要采用更专门的实时操作系统。
RT-Linux兼容Linux操作系统的通用性,可以利用Linux生态系统中的各种工具和库进行开发。 开发者可以使用广泛的开发工具和资源来构建实时应用程序,从而提高开发效率。
原理
通过启动一个master的普通进程,然后master进程再启动指定数量指定优先级的实时进程,实时进程会设置一个timer周期性的唤醒自己(从timer溢出触发中断并进入ISR调用wake_up_process()唤醒实时进程,到进程真正能被运行,这中间的时间即我们需要测量的延时)。实时进程得到运行后会再次获取当前系统时间,减去睡眠时间时的时间以及睡眠的时间即可得到延时时间,并通过共享内存将该值传递给master进程进行统计,如此周而复始,最终由master进程将结果输出。
注意:当造成延时的事件发生在timer溢出之前,那么这样的延时将不会被捕捉到,所以我们需要足够久的运行cyclictest才能更大概率的抓取全面的延时数据。
- 源码解析:请关注上面的知乎链接和代码仓库
- ISR:中断服务程序
- 技术|Linux 内核如何处理中断
使用
1、简介
cyclictest是一个高精度的测试程序, 是 rt-tests 下的一个测试工具,也是rt-tests 下使用最广泛的测试工具,一般主要用来测试使用内核的延迟,从而判断内核的实时性。
2、安装
默认需要从git仓库下载代码进行安装: git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git。
step 1: 解压 rt-tests.zip包
step 2: 切换到解压后的目录,执行make all
如遇到错误”compile failure because numa.h can't be found“, 需要yum安装 numactl-devel
step 3: 成功安装后如下图所示
注:在rt-tests的路径下,我们可以使用 ./cyclictest 来运行cyclictest, 而在别的目录下,我们就需要指定 cyclictest的路径来使用,比如说 /home/secure/rt-tests/cyclictest ,或者你也可以直接将 rt-tests的路径下的 cyclictest 拷贝到 /bin/ 下,以后就可以直接使用 cyclictest 而不需要指定路径了!!
3、使用
- 可不加任何参数直接跑cyclictest,会输出实时结果
输出结果含义:
T: 0 序号为0的线程
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg:平均延时(us)
Max: 最大延时(us)
# cyclictest -t1 -p 80 -n -i 10000 -l 8640000 -q
-t1:序号为1的线程
-p 80:线程优先级为80
-n:用clock_nanosleep
-i:指定一个循环为10000us的时间间隔
-l:循环的次数为8640000
-q:quiet,在运行时不打印即时信息,只输出最后结果
options value
-a N 在处理器N上运行
-A USEC 将线程唤醒对齐到特定的偏移量USEC
-b USEC 当延时>USEC时 发送中断
-c CLOCK 选择时钟 0 = CLOCK_MONOTONIC (默认) 1 = CLOCK_REALTIME
-d DIST 线程间隔的距离DIST,默认为500
-D 指定运行时常,附加m、h、d 来指定分钟、小时、天
-F 在path上创建一个命名管道并向其写入统计信息
-h 运行后将延迟直方图转储到标准输出
-H 与-h相同,只是增加了一个汇总列
-i INTV 线程的基本间隔INTV。默认为1000us
-l LOOPS 循环次数LOOPS,默认=0(无限)
-m 锁定当前和未来的内存分配
-M 延迟更新屏幕,直到新的最大延迟被击中。适用于低带宽
-N 使用单位为ns 默认为us
-o RED 示波器模式,减少RED输出的冗余
-p PRIO 设置线程优先级为PRIO
-q 仅在退出时打印
-r 使用相对计时器而不是绝对计时器
-t N 使用CPU的数量,默认为1
-S 标准SMP测试:选项-a -t和所有线程的相同优先级
评论区