Cyclictest 是一个用于测量和分析Linux操作系统实时性能的工具。它主要用于评估系统调度延迟,即从任务被唤醒到任务实际开始执行所需的时间,从而判断内核的实时性。

安装

Cyclictest是rt-tests测试组件中的一个工具,我开始下载了最新的rt-tests-2.5.tar.gz,但是编译时候报错,查询发现新版要求比较新的内核版本。于是下载rt-tests-1.8.tar.gz版本,成功安装

tar -zvxf rt-tests-1.8.tar.gz
cd rt-tests-1.8/
make
make install

测试

#使用 Cyclictest 进行实时性能测试
cyclictest -p 80 -t 5 -d 500 -i 1000 -D 1m

这个命令的各个参数以及它们的含义:

  • -p 80:设置抢占优先级为 80。这将影响任务调度的优先级,数值越高,优先级越高。
  • -t 5:创建 5 个测试线程,每个线程将在一个单独的 CPU 核心上运行。
  • -d 500:设置每个线程的调度延迟(即唤醒任务所需的时间)为 500 微秒。
  • -i 1000:设置循环间隔为 1000 微秒。这意味着每个线程将每隔 1000 微秒唤醒一次。
  • -D 1m:设置测试持续时间为 1分钟。在这段时间内,Cyclictest 将持续执行测试。

测试结果输出: image.png 结果中的各个部分:

  • /dev/cpu_dma_latency set to 0us:这表示将 CPU DMA(直接内存访问)延迟设置为 0 微秒。这有助于确保 DMA 传输不会影响实时性能。
  • policy: fifo: loadavg: 0.05 0.03 0.05 1/164 30581:这部分包含了一些关于系统的信息:
    • policy: fifo:表示使用的调度策略是先进先出 (FIFO)。
    • loadavg: 0.05 0.03 0.05:表示系统负载平均值,分别对应 1 分钟、5 分钟和 15 分钟的负载平均值。
    • 1/164:表示当前运行的进程数/总进程数。
    • 30581:表示最近创建的进程的进程 ID。

以下是针对每个线程的测试结果:

  • T: 0 (30343) P:80 I:1000 C: 59888 Min: 4 Act: 11 Avg: 13 Max: 15920
    • T: 0:线程编号。
    • (30343):线程的进程 ID。
    • P:80:抢占优先级为 80。
    • I:1000:循环间隔为 1000 微秒。
    • C: 59888:已完成的循环数。
    • Min: 4:最小调度延迟为 4 微秒。
    • Act: 11:当前(最后一个)循环的调度延迟为 11 微秒。
    • Avg: 13:平均调度延迟为 13 微秒。
    • Max: 15920:最大调度延迟为 15,920 微秒。

类似地,其他线程的结果也包含了相同的信息。