cyclictest 用周期线程测“该醒来的时间”和“真正开始运行的时间”相差多少。这个差值会受到定时器、中断、调度器、CPU 占用和系统噪声影响,所以能帮助判断实时线程有没有准时醒来。它测的是系统唤醒延迟,不等于业务任务已经满足端到端截止期。

设置实时优先级与 CPU绝对时间睡眠定时器到期唤醒计算实际偏差长期记录最大值

它测到的数值是什么

若本次理应在 T_expected 醒来,实际开始执行的时刻是 T_actual,则可粗略写成:

1
latency = T_actual - T_expected

最小值说明系统在顺利时的表现,平均值说明典型负载,最大值和直方图尾部则暴露最坏情况。实时工程通常优先关心后两者:一次 2 ms 尖峰就可能让 1 kHz 控制任务错过两个周期,即使平均延迟只有 10 微秒。

测量图周期、CPU、运行时长和对照负载共同定义了一次可比较的延迟测试。
周期测试线程多久被期望唤醒一次,例如 1 ms优先级决定测试线程与普通工作谁先得到 CPU亲和性决定测试在什么 CPU 上观测系统噪声运行时长越长越可能捕获低频固件和热相关尖峰直方图观察长尾分布,避免只盯一条最大值对照负载CPU、内存、I/O、网络同时施压才有参考价值

一条可复现的起步命令

先明确测试 CPU、周期、运行时长和日志路径。下面示例将单个测试线程固定到 CPU 2、优先级设为 90、间隔设为 1000 微秒,并运行十分钟;参数必须按你的 CPU 规划与权限限制调整。

1
sudo cyclictest -p 90 -t 1 -a 2 -i 1000 -D 10m -m -h 100

-m 会尝试锁定测试进程内存,可能因 RLIMIT_MEMLOCK 失败;-h 生成直方图,便于观察尾部。运行前应记录内核版本、PREEMPT_RT 状态、启动参数、功耗模式、CPU 亲和性、IRQ 布局和当前温度,否则两次数字没有可比性。

别让空闲测试骗过你

一轮完整测试至少应有四组:空闲基线、CPU 压力、内存/页回收压力、网络和磁盘 I/O 压力;有 GPU 或相机的机器人还要加入实际推理和采集负载。每组都跑到足以覆盖定时任务、温控和后台维护周期,并保留原始直方图。

1
2
3
4
5
发现尖峰
-> 记录发生时刻和 CPU
-> 关联 /proc/interrupts、ftrace、rtla osnoise/timerlat
-> 判断来自 IRQ、锁、缺页、频率、固件还是应用自身
-> 修改一个变量后在同一负载下复测

cyclictest 最大值变小后,业务仍可能超时,因为传感器、队列、算法和执行器也会花时间。反过来,出现一个尖峰也不等于业务一定失败。它的作用是把系统唤醒延迟测出来,让排查有明确的时间窗口。

参考:rt-tests · cyclictest man page