,," /> " />

目 录CONTENT

文章目录

内核延时测试:cyclictest 使用手册

Administrator
2024-03-01 / 0 评论 / 0 点赞 / 19 阅读 / 4611 字

百科

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.

RT-Linux的核心是Linux内核的一个实时扩展,它为实时任务提供了必要的调度机制和时间管理。 通过采用抢占式调度策略,高优先级的实时任务可以打断低优先级的任务,确保实时任务能够及时响应。 RT-Linux对任务的调度和中断处理进行了改进,使得任务能够按照预定的时间要求执行。

RT-Linux适用于对时间要求敏感的应用领域,例如工业自动化、机器人控制、航空航天系统等。 它可以提供精确的任务调度和快速的响应时间,以确保系统能够在实时任务的要求下正常运行。

与传统的Linux内核相比,RT-Linux在实时性能方面有所提升,但它并不是一个硬实时系统,无法保证任务的执行时间绝对精确。 对于对时间要求极高的应用,可能需要采用更专门的实时操作系统。

RT-Linux兼容Linux操作系统的通用性,可以利用Linux生态系统中的各种工具和库进行开发。 开发者可以使用广泛的开发工具和资源来构建实时应用程序,从而提高开发效率。

原理

实时性测试:cyclictest详解 - 知乎

通过启动一个master的普通进程,然后master进程再启动指定数量指定优先级的实时进程,实时进程会设置一个timer周期性的唤醒自己(从timer溢出触发中断并进入ISR调用wake_up_process()唤醒实时进程,到进程真正能被运行,这中间的时间即我们需要测量的延时)。实时进程得到运行后会再次获取当前系统时间,减去睡眠时间时的时间以及睡眠的时间即可得到延时时间,并通过共享内存将该值传递给master进程进行统计,如此周而复始,最终由master进程将结果输出。

注意:当造成延时的事件发生在timer溢出之前,那么这样的延时将不会被捕捉到,所以我们需要足够久的运行cyclictest才能更大概率的抓取全面的延时数据。

  1. 源码解析:请关注上面的知乎链接和代码仓库
  2. ISR:中断服务程序
  3. 技术|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和所有线程的相同优先级

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区