cyclictest 用周期线程测“该醒来的时间”和“真正开始运行的时间”相差多少。这个差值会受到定时器、中断、调度器、CPU 占用和系统噪声影响,所以能帮助判断实时线程有没有准时醒来。它测的是系统唤醒延迟,不等于业务任务已经满足端到端截止期。
它测到的数值是什么
若本次理应在 T_expected 醒来,实际开始执行的时刻是 T_actual,则可粗略写成:
1 | latency = T_actual - T_expected |
最小值说明系统在顺利时的表现,平均值说明典型负载,最大值和直方图尾部则暴露最坏情况。实时工程通常优先关心后两者:一次 2 ms 尖峰就可能让 1 kHz 控制任务错过两个周期,即使平均延迟只有 10 微秒。
一条可复现的起步命令
先明确测试 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 | 发现尖峰 |
cyclictest 最大值变小后,业务仍可能超时,因为传感器、队列、算法和执行器也会花时间。反过来,出现一个尖峰也不等于业务一定失败。它的作用是把系统唤醒延迟测出来,让排查有明确的时间窗口。