0

0

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

舞姬之光

舞姬之光

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

|

861人浏览过

|

来源于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 的样本从几百次降到个位数——这意味着中断响应、锁竞争、内核抢占点这些“偶发长尾”被大幅收敛。

  • 原始内核下,cyclictest 常见错误现象:Max 突然跳到 500–2000μs,伴随 dmesgrcu_preempt detected stallswatchdog: 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 1cs(context switch)是否异常高,可能是其他进程持续抢占 CPU
  • perf record -e 'sched:sched_switch' -C 2 -g 抓一段时间,看高延迟时刻是否切到了 ksoftirqdkworker

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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

550

2023.09.21

Java switch的用法
Java switch的用法

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

432

2024.03.13

printf用法大全
printf用法大全

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

76

2023.06.20

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

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

296

2023.11.28

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

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

414

2023.07.18

堆和栈区别
堆和栈区别

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

588

2023.08.10

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

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

673

2023.08.10

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

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

1500

2023.06.21

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9万人学习

Git 教程
Git 教程

共21课时 | 3.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号