如何测试prmmpt-rt 性能
一、测试目标(测什么)
Preempt-RT 核心是延迟确定性,重点测:
- 调度延迟(中断→任务响应时间,μs 级)
- 最坏 / 平均 / 抖动(max/avg/jitter,工业关键看 max)
- 压力下稳定性(CPU/IO/ 内存满载时延迟是否可控)
- 优先级反转(高优先级是否被低优先级阻塞)
二、环境准备(必做)
1. 确认内核
bash
运行
uname -a # 输出带 PREEMPT RT、CONFIG_PREEMPT_RT=y 才算生效2. 安装工具(rt-tests 套件)
bash
运行
# Ubuntu/Debian sudo apt install rt-tests # 源码编译(最新版) git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git cd rt-tests make sudo make install3. 系统调优(减少干扰)
bash
运行
# 1. 隔离CPU核心(如隔离核心3) # 启动参数加:isolcpus=3 nohz_full=3 rcu_nocbs=3 # 2. 关闭节能、Turbo、省电策略 echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 3. 禁用NUMA平衡、IRQ均衡 sudo sysctl -w kernel.numa_balancing=0 sudo service irqbalance stop # 4. 关闭Swap sudo swapoff -a三、核心工具与测试命令
1. cyclictest(最核心:测调度延迟)
作用:高精度测量周期性任务的调度延迟。
bash
运行
# 基础测试(1线程、优先级99、1000μs周期、1小时) sudo cyclictest -p 99 -t 1 -i 1000 -D 1h -m -n # 多核隔离测试(绑核心3、4线程、优先级99) sudo cyclictest -p 99 -t 4 -a 3 -i 500 -D 30m -m # 参数说明: # -p 99:最高实时优先级 # -t N:N个线程 # -a X:绑定到CPU X # -i T:周期T μs # -D T:测试时长 # -m:锁定内存(避免swap) # -n:显示统计2. stress-ng(压力负载)
作用:模拟 CPU/IO/ 内存 满载,测极端工况延迟。
bash
运行
# 后台跑压力(4核CPU、IO、内存) stress-ng --cpu 4 --io 4 --vm 50 --fork 4 & # 再跑 cyclictest 测压力下延迟 sudo cyclictest -p 99 -t 1 -i 1000 -D 30m -m3. hackbench(调度器压力)
作用:测进程 / 线程频繁创建销毁的调度性能。
bash
运行
hackbench -s 1000 -l 10000 -g 4 # -s:消息大小 # -l:循环次数 # -g:线程组数量4. pi_stress(优先级反转测试)
作用:验证优先级继承是否有效,避免高优先级被阻塞。
bash
运行
sudo pi_stress -p 99 -t 4 -D 10m四、关键指标与合格标准(工业常用)
1. cyclictest 输出解读
plaintext
# 典型输出: T: 0 ( 1234) P:99 I:1000 C: 100000 Min: 12 Avg: 15 Max: 45 # Min/Avg/Max:最小/平均/最大延迟(μs) # Jitter = Max - Min(抖动,越小越好)2. 合格参考(x86 工业机)
- 空载:Max <50μs,Avg <20μs
- 满载:Max <100μs(严格场景 <80μs)
- 抖动:<30μs
- 优先级反转:无(pi_stress 无异常)
五、结果分析与瓶颈定位
- Max 延迟大:
- 检查是否隔离 CPU、关闭节能
- 查看中断是否落在隔离核(
cat /proc/interrupts)
- 抖动大:
- 关闭 NUMA 平衡、RCU 回调
- 检查驱动是否有非实时锁
- 压力下延迟飙升:
- 优化 IRQ 亲和性,把网卡 / 磁盘中断绑到非实时核
六、自动化脚本(一键测试)
bash
运行
#!/bin/bash # preempt-rt 性能测试脚本 # 1. 系统调优 echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor sudo sysctl -w kernel.numa_balancing=0 sudo service irqbalance stop sudo swapoff -a # 2. 空载测试 echo "=== 空载测试 ===" sudo cyclictest -p 99 -t 1 -i 1000 -D 30m -m -n > idle.log # 3. 压力测试 echo "=== 压力测试 ===" stress-ng --cpu 4 --io 4 --vm 50 --fork 4 & sudo cyclictest -p 99 -t 1 -i 1000 -D 30m -m -n > stress.log killall stress-ng echo "测试完成,日志:idle.log / stress.log"七、常见误区
- ❌ 只看平均延迟:最大延迟才是实时系统的关键
- ❌ 不隔离 CPU:内核线程 / 中断会抢占实时任务
- ❌ 开节能 / Turbo:动态频率导致延迟波动大
