Cyclictest学习记录

 

Cyclictest是 rt-tests 下的一个测试工具,一般主要用来测试使用内核的延迟,从而判断内核的实时性。

1、cyclictest 安装

Debian / Ubuntu 系统下可以直接使用apt-get install rt-tests 来安装cyclictest。

2、cyclictest 的使用

在rt-tests的路径下,我们可以使用 ./cyclictest 来运行cyclictest, 而在别的目录下,我们就需要指定 cyclictest的路径来使用,比如说 /home/long/rt-tests/cyclictest ,或者你也可以直接将 rt-tests的路径下的 cyclictest 拷贝到 /bin/ 下,以后就可以直接使用 cyclictest 而不需要指定路径了

3、cyclictest 的参数介绍

关于cyclictest 的各个参数具体含义建议大家还是用时间具体看看 cyclictest --help 的信息

-p PRIO --prio=PRIO 最高优先级线程的优先级 使用时方法为: -p 90 / --prio=90 -m --mlockall 锁定当前和将来的内存分配

-c CLOCK --clock=CLOCK 选择时钟 cyclictest -c 1 0 = CLOCK_MONOTONIC (默认) 1 = CLOCK_REALTIME

-i INTV --interval=INTV 基本线程间隔,默认为1000(单位为us),下面介绍原理的时候会提到

-l LOOPS --loops=LOOPS 循环的个数,默认为0(无穷个),与 -i 间隔数结合可大致算出整个测试的时间, 比如 -i 1000 -l         1000000 ,总的循环时间为1000*1000000=1000000000 us =1000s ,所以大致为16分钟多。

-n --nanosleep 使用 clock_nanosleep

-h HISTNUM --histogram=US 在执行完后在标准输出设备上画出延迟的直方图(很多线程 有相同的权限) US为最大的跟踪时间限制,这个在下面介绍实例时可以用到,结合gnuplot 可以画出我们测试的结果图。

-q --quiet 使用-q 参数运行时不打印信息,只在退出时打印概要内容,结合-h HISTNUM参数会在退出时 打印HISTNUM 行统计信息以及一个总的概要信息。

-f --ftrace ftrace函数跟踪(通常与-b 配套使用,其实通常使用 -b 即可,不使用 -f )

-b USEC --breaktrace=USEC 当延时大于USEC指定的值时,发送停止跟踪。USEC,单位为谬秒(us)。

 

推荐参数以及结果实例:

sudo cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 1000000

使用 -p 90给cyclictest 赋优先级90,使用-m参数锁定内存分配,使用 -c 0指定使用默认的MONOTONIC 时钟, -i 200 指定一个循环为200us,结合 -l 1000000为总共1000000个循环,此外-n 为使用nanosleep 而不是简单的sleep,-q为在运行时不打印即时信息,-h 100 为总共统计100个信息在最后的结果中。

cyclictest用于测试定时器的精度,假定定时器时间间隔为 interval,定时器启动前记录下当前时间t1,定时器到时后记录下当前时间t2,则测出的时延为 t2 - (t1 + interval)。

 

4、cyclictest输出结果含义

T: 0 序号为0的线程

P: 0 线程优先级为0

C: 9397 计数器。线程的时间间隔每达到一次,计数器加1 I: 1000 时间间隔为1000微秒(us)

Min: 最小延时(us)

Act: 最近一次的延时(us)

Avg:平均延时(us)

Max: 最大延时(us)

 

在讨论 `cyclictest` 的用途和功能之前,先澄清关于 `NULL` 的概念以及其在 C/C++ 编程中的意义。 ### 关于 NULL #### 定义与使用场景 `NULL` 是一种特殊的指针常量,在 C 和 C++ 中通常被用来表示空指针[^2]。它的主要作用有以下几个方面: 1. **作为占位符** 当变量未分配有效内存地址时,可以将其初始化为 `NULL` 来表明当前状态为空。这有助于程序逻辑判断该指针是否已经指向有效的对象或数据结构。 2. **安全检查机制的一部分** 在操作任何可能含有非法值或者尚未赋初值的动态存储区域前,应该通过比较目标指针对应的内容是否等于零来验证合法性后再继续执行后续动作。例如下面这段代码展示了如何正确处理潜在危险情况下的访问请求: ```c #include <stdio.h> int main() { int* ptr = NULL; if (ptr != NULL) { // 防止尝试解引用空指针引发崩溃 printf("%d\n", *ptr); } } ``` 3. **资源管理工具之一** 使用完毕某块由 malloc/new 创建出来的堆空间之后立即将对应句柄置回至初始态即设成 null 可防止悬垂指针问题的发生并减少不必要的错误风险[^3]。 --- ### cyclictest 工具介绍 #### 基本概述 `cyclictest` 是 Linux 实时性能测试领域内的一个重要开源项目,主要用于评估系统的延迟特性及其稳定性表现。它能够创建一系列定时器事件,并测量这些预定时间间隔之间的实际偏差程度,从而帮助开发者分析操作系统内核调度策略的有效性和硬件平台支持能力等方面的信息[^4]。 #### 主要特点 - 支持多种同步方法(如 POSIX 信号、futexes 等) - 提供灵活配置选项满足不同实验需求 - 能够记录长时间运行过程中的最大最小平均抖动数值以便进一步统计研究 #### 应用场合 适用于需要高精度计时控制的应用开发阶段前期探索工作;也可以用于对比不同类型处理器架构下对于相同负载模式响应速度差异的研究课题当中去发现瓶颈所在位置进而优化整体方案设计思路[^5]。 ```bash # 示例命令行调用方式 ./cyclictest -p70 -i1000 -q ``` 上述例子设置了进程优先级为70, 测试周期长度定为了每秒触发一次中断(也就是频率设定成了Hz级别), 同时开启了静默输出模式仅保留最终汇总结果展示给用户查看. --- ### 结合 NULL 与 cyclictest 的思考 尽管两者看似毫无关联——一个是编程基础知识点代表符号型常数的概念解释说明文档片段摘录下来单独呈现出来看的话确实如此理解没错儿;但从更广义角度来看待事物之间可能存在联系的角度出发,则可以从如下几个维度展开联想探讨: - 如果考虑到了实时系统环境下频繁涉及大量复杂链表节点遍历查找删除重建等一系列典型算法实现细节的时候,那么合理运用好诸如 `NULL` 这样的辅助手段就显得尤为重要起来啦!因为只有这样才能更好地保障整个软件体系架构长期稳定可靠运转下去嘛~[^6] - 对于像 `cyclictest` 这样专注于探测低层次延时特性的专用诊断类应用程序而言,内部必然少不了各种精妙绝伦的数据结构组织形式配合巧妙构思而成的独特业务流程安排咯~而其中某些局部环节也许正好需要用到类似于前面提到过的那些有关指针操作方面的技巧哦~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值