cyclictest 的真实延迟抖动应关注直方图尾部累积值(如99.9%分位和>50μs占比),而非Max;需关闭CPU调频、隔离CPU、禁用timer_migration、使用RT内核并验证调度策略,同时排查C-state、内存分配等用户态瓶颈。
怎么用
测出真实延迟抖动
直接跑
得到的
值,大概率不是你系统的真实最差延迟——它受测量工具自身调度干扰、时钟源精度、CPU 频率跳变影响太大。
关键在于让测试尽可能“贴近硬件”:关闭 CPU 频率调节(
),绑定到隔离 CPU(
内核启动参数),并用
运行
。否则测出来的是“Linux 普通进程调度抖动”,不是实时线程能压到多低。
表示每 1ms 触发一次定时器,但若系统
是 250 或使用
,实际精度可能被限制;建议搭配
设置直方图上限,别设太小(如
),否则超限值全堆在最后一格,看不出分布尾部
加
(quiet)减少输出开销,避免 printf 本身引入抖动
输出里哪个值真该盯住
别只看
。它只是 10000 次中的最大单次延迟,偶然性太强;真正反映系统稳定性的,是
尾部累积值,尤其是 99.9% 分位(
)和直方图中 >50μs 的计数占比。
PREEMPT_RT 补丁的作用,不是把
从 200μs 压到 10μs,而是把 >50μs 的样本从几百次降到个位数——这意味着中断响应、锁竞争、内核抢占点这些“偶发长尾”被大幅收敛。
原始内核下,
常见错误现象:
突然跳到 500–2000μs,伴随
里
或
PREEMPT_RT 启用后,
可能仍偶尔冲高(比如触发 page fault 或 slab 重分配),但 99.9% 分位应稳定在 15–30μs 区间(X86-64 + Intel i7)
注意
默认用
,若没配
,会静默降级为
,输出里显示
—— 这时所有数据都无效
为什么开了 PREEMPT_RT,
还是飘高
PREEMPT_RT 不是万能开关。它解决的是内核态可抢占性,但用户空间的延迟瓶颈常来自别处:内存分配、文件 I/O、NUMA 跨节点访问、甚至 BIOS 中的 C-state 设置。
Trae linux
Trae Linux 官方版本现已全面上线,开发者可直接访问 Trae 官网(trae.cn 国内版或 trae.ai 国际版)获取专属安装包。该版本完美适配主流 Linux 发行版,提供 .deb(适配 Ubuntu/Debian)、.rpm(适配 RHEL/Fedora)以及通用 .tar.gz 格式,并全面支持 x64 与 ARM64 架构。
下载
最容易被忽略的是
启动参数。现代 CPU 进入 C6/C7 状态要几十微秒唤醒,而
的 1ms 定时器刚好频繁触发唤醒-睡眠循环,导致周期性大延迟尖峰。
检查是否真用了 RT 内核:
应含
(如
),且
显示
开启
看
(context switch)是否异常高,可能是其他进程持续抢占 CPU
用
抓一段时间,看高延迟时刻是否切到了
或
上
和真实应用延迟的差距在哪
测的是“空载定时器精度”,而你的实时音视频或运动控制应用,往往带着 memcpy、浮点计算、DMA 同步、PCIe 设备轮询——这些操作会触发 cache miss、TLB miss、锁竞争,
完全不覆盖。
它只能告诉你“底层调度有没有硬伤”。如果
99.9%
验证驱动是否适配 RT:检查设备驱动是否用
替代了
,是否避免在中断上下文中调用
(
表示 no-fork,单线程)更接近轻量应用行为;加
后若延迟翻倍,说明 SMP 锁争用严重
别信“RT 补丁让 Linux 变成 VxWorks”——它只是把内核里几十个不可抢占点改成可抢占,其余机制(页表管理、内存回收、热插拔)依然存在软实时边界
真正难调的,永远是那个没打印日志、不抛异常、只在特定负载组合下才冒头的 100μs 毛刺。这时候
只是个起点,不是答案。
cyclictestcyclictest -l 10000 -i 1000 -h 500Maxcpupower frequency-set -g performanceisolcpus=2,3taskset -c 2cyclictest-i 1000HZNO_HZ_FULL/proc/sys/kernel/timer_migration=0-h-h 100-qcyclictestMaxLatency histogram99.9%: ... usMaxcyclictestMaxdmesgrcu_preempt detected stallswatchdog: BUG: soft lockupMaxcyclictestSCHED_FIFORLIMIT_RTPRIOSCHED_OTHERpolicy=OTHERcyclictestintel_idle.max_cstate=1cyclictestuname -rrt5.10.104-rt69cat /sys/kernel/debug/sched_features | grep PREEMPTPREEMPTvmstat 1csperf record -e 'sched:sched_switch' -C 2 -gksoftirqdkworkercyclictestcyclictestcyclictestcyclictestspin_lock_irqsavespin_lockmutex_lockcyclictest -a -t1 -n -i 1000-n-t2cyclictest