延时测量

有多种方法可以用来定义给定系统的延迟,也有多种方法来测量它。本研究选择了一种基于调度延迟来评估给定系统实时能力的方法,既简单又被广泛使用。这模拟了许多典型控制系统的行为,这些系统必须执行精确定时的周期性任务。此外,当系统对某些外部异步事件作出反应时,也会出现同样的情况。

Cyclictest(2.20版本)被用作延迟测量的主要测量工具。它最初是由PREEMPT_RT的作者构建的,旨在通过精确测量系统延迟来帮助开发工作,如Cyclictest延时测量所示。循环测试的工作原理是启动一个常规的主线程,它将启动几个实时测量线程。这些实时线程中的每一个都被设置为在一个定义的时间间隔之后定期唤醒。每次它们被唤醒时,预期和实际唤醒时间的时差将被记录并传递给主进程。主进程存储所有这些结果,一旦测试结束,它将输出汇总的结果。

1. Cyclictest延时测量

对于SMP系统,如昉·星光 2,cyclictest为每个核心分别提供统计数据。然而,拥有这些分开的结果对于总体延迟评估通常并不重要。因此,通过简单地将每个核的结果相加,得到整个系统的单个延迟数,简化了本文中给出的计算和图形。这使得所提供的测量结果更容易被可视化和理解。

应为每个系统和测量场景仔细配置cyclictest。最重要的是,需要根据测量情况来设置优先级和时间间隔。要测量系统延迟,优先级应该设置为高于系统上运行的负载。该间隔的最优值将略大于观察到的最大延迟。总的来说,多个选项被设置为特定的值,以获得最合适的延迟结果。

  • --priority=99:选择了相等于99的测量线程的实时优先级。
  • --interval=200:将测量线程的预期唤醒周期设置为200µs。
  • --duration=10m:测量的总持续时间设置为10分钟。
  • --Histogram=200:允许输出延迟在200µs以内的统计数据并生成直方图。
  • --smp:为每个可用的核启动单个固定线程。
  • --mlockall:内存分配完毕后锁定该内存页, 防止发生swap影响测试。

Cyclictest工具还会自动设置一些值得注意的参数,也可以手动设置,基于这些选择为默认值。需要注意的是,由于指定了直方图选项,测量线程唤醒时间的间隔参数被自动设置为零。此外,调度策略默认设置为SCHED_FIFO。总之,这些参数非常典型,非常适合测量实时应用程序将经历的延迟。