一、抖动定义
实时抖动 = 最大调度延迟 − 最小调度延迟 单位:μs / ns抖动越小 → 时序越稳、伺服 / 运动控制越顺滑
二、核心测试工具:cyclictest 专属测抖动
1. 最简测抖动命令(最常用)
bash
运行
# 绑定隔离核、最高优先级、锁内存、10分钟、输出微秒
sudo cyclictest -p 99 -a 3 -i 1000 -D 10m -m
输出字段:Min 最小延迟 Act 当前 Avg 平均 Max 最大
抖动 Jitter = Max − Min 例:空载 Min=2 Max=42 → 抖动 40μs
2. 纳秒高精度测抖动(更精准)
bash
运行
sudo cyclictest -p 99 -a 3 -i 500 -D 10m -m -N
-N 结果单位:纳秒 ns
3. 输出延迟直方图(看抖动分布)
bash
运行
# 统计最大200μs内所有延迟分布
sudo cyclictest -p 99 -a 3 -i 1000 -D 5m -m -h 200
跑完直接打印延迟区间数量,直观看出抖动集中区间。
4. 只打印最终汇总(安静模式)
bash
运行
sudo cyclictest -p 99 -a 3 -i 1000 -D 15m -m -q
三、分场景测抖动(标准流程)
场景 1:空载抖动(基准值)
关闭所有后台程序、关闭压力
bash
运行
killall stress-ng
sudo cyclictest -p 99 -a 3 -i 1000 -D 20m -m
合格标准
- 平均抖动:<30μs
- 极限抖动:<50μs
场景 2:满负载压力抖动(实战最关键)
bash
运行
# 开整机压力
stress-ng --cpu 8 --io 4 --vm 32 &
# 测高压下实时抖动
sudo cyclictest -p 99 -a 3 -i 1000 -D 20m -m
工控合格标准
- 满载抖动 <80μs 优秀
- 满载抖动 <100μs 可用
场景 3:多线程并发抖动(多核实时)
bash
运行
# 4线程实时任务同时跑,测并发抖动
sudo cyclictest -p 99 -t 4 -a 3-6 -i 500 -D 15m -m
四、专业抖动分析工具
1. rt-migrate-test 测线程迁移抖动
检测内核线程抢占导致的抖动漂移
bash
运行
sudo rt-migrate-test -p 99 -a 3
2. pi_stress 测优先级反转抖动
排查高优先级被低优先级阻塞带来的异常大抖动
bash
运行
sudo pi_stress -D 10m
五、降低实时抖动必做优化(立刻见效)
- 内核启动参数(最关键)
plaintext
isolcpus=3,4 nohz_full=3,4 rcu_nocbs=3,4
隔离实时核心,不让系统进程抢占
- 固定 CPU 主频
bash
运行
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
- 关闭干扰服务
bash
运行
sudo systemctl stop irqbalance
sudo sysctl -w kernel.numa_balancing=0
sudo swapoff -a
- 网卡 / 磁盘中断绑非实时核避免硬件中断瞬间拉高抖动
六、抖动结果判定表
表格
| 抖动范围 | 等级 | 适用场景 |
|---|---|---|
| <20μs | 极佳 | 高精度伺服、激光焊接、高速闭环 |
| 20~50μs | 优秀 | 通用机器人、AGV、视觉跟随 |
| 50~100μs | 合格 | 普通工控、数据采集 |
| >150μs | 不合格 | 不适合硬实时业务 |
七、一键抖动测试脚本
bash
运行
#!/bin/bash
sudo killall stress-ng
echo "===== 开始空载实时抖动测试 ====="
sudo cyclictest -p 99 -a 3 -i 1000 -D 10m -m -q
echo "===== 开始压力实时抖动测试 ====="
stress-ng --cpu 4 --io 2 --vm 16 &
sleep 3
sudo cyclictest -p 99 -a 3 -i 1000 -D 10m -m -q
killall stress-ng