工具是什么
cyclictest 属于 rt-tests 套件,用高精度定时器做周期性唤醒,测量「应当醒来的时刻」与「实际被调度执行的时刻」之间的差值,是量化系统调度抖动最常用的手段。它按线程输出 Min/Avg/Max 以及可选的直方图,其中 Max(最坏情况延迟)决定系统能否满足实时性要求——平均值好看而 Max 很差,说明存在偶发尖峰,对实时业务是致命问题。
基本信息
| 安装包 | rt-tests(各发行版同名包) |
|---|---|
| 权限要求 | 通常需 root 或具备实时调度权限,否则只能用普通策略 |
| 常用参数 | -m 锁定内存、-p 优先级、-t 线程数、-i 间隔(us)、-d 时长(秒) |
| 输出控制 | -h 直方图、-q 精简输出、-S 每 CPU 一个线程、-a 绑定 CPU |
| 关键指标 | Max 与直方图尾部,而不是单独看 Avg |
| 前提 | 测量环境需与生产一致,并在测试时叠加代表性负载 |
典型使用场景
- 评估服务器能否承载实时任务(工业控制、交易撮合、音视频采集)
- 对比内核参数变更(PREEMPT、threadirqs、isolcpus、绑核)对最坏延迟的影响
- 定位延迟尖峰:叠加磁盘回写、网络流量、THP 合并等负载后复测
- 内核或 BIOS 升级前后的回归验证,用同一套参数做前后对照
- 为 SLA 提供数据支撑,例如「在指定负载下 Max 小于某个微秒数」
实测示例
实测示例
sudo cyclictest -m -p 80 -t 4 -i 200 -d 60 # 4 线程、200 微秒周期、跑 60 秒并锁定内存
sudo cyclictest -m -p 99 -t 8 -i 100 -d 300 -h 400 -q # 长时运行并输出直方图,重点看尾部
sudo cyclictest -m -p 80 -S -i 200 -d 60 # 每个 CPU 一个线程,判断是否为单核抖动
sudo cyclictest -m -p 80 -a 2-3 -t 2 -i 200 -d 60 # 绑定到 CPU2-3,验证绑核是否降低延迟
# 判读要点:Max 明显高于 Avg 说明存在尖峰;短时间测试容易漏掉偶发极值输出读法
| 输出项 | 含义 | 判读要点 |
|---|---|---|
| T | 线程编号 | 与 -t/-S 的线程规划对应 |
| Min | 最小延迟 | 受硬件与内核配置的下限影响 |
| Avg | 平均延迟 | 反映常态,不能单独作为达标依据 |
| Max | 最大延迟 | 实时性判断的核心,必须结合测试时长看 |
| Act | 当前值 | 便于观察抖动形态 |
| -h 直方图 | 各延迟区间的命中次数 | 看尾部区间是否有异常聚集 |
一定要在叠加代表性负载的情况下测量:空载结果几乎必然好看。真实环境里的磁盘回写、网络中断、内存回收与大页合并都会制造尖峰,测完再决定要不要动内核参数。
测试时长越长越可能抓到最坏情况,用十几秒的结果去承诺 SLA 会漏掉偶发尖峰。做对比实验时线程数、周期、优先级、时长与负载都要保持一致,否则数据不可比。