讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux cyclictest 的实时延迟测试与 PREEMPT_RT 补丁效果验证

梦宇同学_5579

梦宇同学_5579

发布时间:2026-02-13 20:29:03

|

962人浏览过

|

来源于php中文网

原创

cyclictest 的真实延迟抖动应关注直方图尾部累积值(如99.9%分位和>50μs占比),而非Max;需关闭CPU调频、隔离CPU、禁用timer_migration、使用RT内核并验证调度策略,同时排查C-state、内存分配等用户态瓶颈。

linux cyclictest 的实时延迟测试与 preempt_rt 补丁效果验证

怎么用 cyclictest 测出真实延迟抖动

直接跑 cyclictest -l 10000 -i 1000 -h 500 得到的 Max 值,大概率不是你系统的真实最差延迟——它受测量工具自身调度干扰、时钟源精度、CPU 频率跳变影响太大。

关键在于让测试尽可能“贴近硬件”:关闭 CPU 频率调节(cpupower frequency-set -g performance),绑定到隔离 CPU(isolcpus=2,3 内核启动参数),并用 taskset -c 2 运行 cyclictest。否则测出来的是“Linux 普通进程调度抖动”,不是实时线程能压到多低。

  • -i 1000 表示每 1ms 触发一次定时器,但若系统 HZ 是 250 或使用 NO_HZ_FULL,实际精度可能被限制;建议搭配 /proc/sys/kernel/timer_migration=0
  • -h 设置直方图上限,别设太小(如 -h 100),否则超限值全堆在最后一格,看不出分布尾部
  • 加 -q(quiet)减少输出开销,避免 printf 本身引入抖动

cyclictest 输出里哪个值真该盯住

别只看 Max。它只是 10000 次中的最大单次延迟,偶然性太强;真正反映系统稳定性的,是 Latency histogram 尾部累积值,尤其是 99.9% 分位(99.9%: ... us)和直方图中 >50μs 的计数占比。

PREEMPT_RT 补丁的作用,不是把 Max 从 200μs 压到 10μs,而是把 >50μs 的样本从几百次降到个位数——这意味着中断响应、锁竞争、内核抢占点这些“偶发长尾”被大幅收敛。

linux-performance-analyzer
linux-performance-analyzer

Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。

下载
  • 原始内核下,cyclictest 常见错误现象:Max 突然跳到 500–2000μs,伴随 dmesg 里 rcu_preempt detected stalls 或 watchdog: BUG: soft lockup
  • PREEMPT_RT 启用后,Max 可能仍偶尔冲高(比如触发 page fault 或 slab 重分配),但 99.9% 分位应稳定在 15–30μs 区间(X86-64 + Intel i7)
  • 注意 cyclictest 默认用 SCHED_FIFO,若没配 RLIMIT_RTPRIO,会静默降级为 SCHED_OTHER,输出里显示 policy=OTHER —— 这时所有数据都无效

为什么开了 PREEMPT_RT,cyclictest 还是飘高

PREEMPT_RT 不是万能开关。它解决的是内核态可抢占性,但用户空间的延迟瓶颈常来自别处:内存分配、文件 I/O、NUMA 跨节点访问、甚至 BIOS 中的 C-state 设置。

最容易被忽略的是 intel_idle.max_cstate=1 启动参数。现代 CPU 进入 C6/C7 状态要几十微秒唤醒,而 cyclictest 的 1ms 定时器刚好频繁触发唤醒-睡眠循环,导致周期性大延迟尖峰。

  • 检查是否真用了 RT 内核:uname -r 应含 rt(如 5.10.104-rt69),且 cat /sys/kernel/debug/sched_features | grep PREEMPT 显示 PREEMPT 开启
  • vmstat 1 看 cs(context switch)是否异常高,可能是其他进程持续抢占 CPU
  • 用 perf record -e 'sched:sched_switch' -C 2 -g 抓一段时间,看高延迟时刻是否切到了 ksoftirqd 或 kworker 上

cyclictest 和真实应用延迟的差距在哪

cyclictest 测的是“空载定时器精度”,而你的实时音视频或运动控制应用,往往带着 memcpy、浮点计算、DMA 同步、PCIe 设备轮询——这些操作会触发 cache miss、TLB miss、锁竞争,cyclictest 完全不覆盖。

它只能告诉你“底层调度有没有硬伤”。如果 cyclictest 99.9%

  • 验证驱动是否适配 RT:检查设备驱动是否用 spin_lock_irqsave 替代了 spin_lock,是否避免在中断上下文中调用 mutex_lock
  • cyclictest -a -t1 -n -i 1000(-n 表示 no-fork,单线程)更接近轻量应用行为;加 -t2 后若延迟翻倍,说明 SMP 锁争用严重
  • 别信“RT 补丁让 Linux 变成 VxWorks”——它只是把内核里几十个不可抢占点改成可抢占,其余机制(页表管理、内存回收、热插拔)依然存在软实时边界

真正难调的,永远是那个没打印日志、不抛异常、只在特定负载组合下才冒头的 100μs 毛刺。这时候 cyclictest 只是个起点,不是答案。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1031

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1357

2024.03.13

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

628

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1009

2023.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4667

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2128

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3538

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

3670

2023.06.21

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn