8.1 延迟测量工具 latency 详解
为了帮助用户评估和检测系统的定时器延迟,Xenomai 提供了一个名为 latency 的测试工具。本文将详细介绍 latency 工具的功能、选项,以及如何使用它来测试系统的定时器延迟性能。
latency 工具是一个定时器延迟基准测试程序。它可以帮助用户测量实时任务在不同条件下的执行延迟,这对于评估系统的实时性能至关重要。通过运行 latency 工具,我们可以获取关于最小、平均和最大延迟的统计信息,并且生成可视化的延迟直方图。
8.1.1 latency 工具默认设置及其输出
在了解复杂的选项之前,我们先来看一下 latency 工具的默认设置及其输出。
$ latency
== Sampling period: 1000 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up…
RTT| 00:00:01 (periodic user-mode task, 1000 us period, priority 99)
RTH|—-lat min|—-lat avg|—-lat max|-overrun|—msw|—lat best|–lat worst
RTD| -1.241| -0.637| 4.942| 0| 0| -1.241| 4.942
RTD| -1.529| -0.897| 9.046| 0| 0| -1.529| 9.046
RTD| -1.527| -1.007| 8.687| 0| 0| -1.529| 9.046
RTD| -1.533| -1.043| 2.121| 0| 0| -1.533| 9.046
RTD| -1.523| -0.662| 7.937| 0| 0| -1.533| 9.046
RTD| -1.535| -0.980| 3.016| 0| 0| -1.535| 9.046
RTD| -1.533| -0.946| 5.479| 0| 0| -1.535| 9.046
RTD| -1.536| -0.992| 6.439| 0| 0| -1.536| 9.046
RTD| -1.534| -0.986| 5.055| 0| 0| -1.536| 9.046
—|———–|———–|———–|——–|——|————————-
RTS| -1.536| -0.905| 9.046| 0| 0| 00:00:10/00:00:10
默认情况下,latency 工具会创建一个采样线程,和一个打印线程。
采样线程是一个周期为 1000 微秒(us), 优先级为 99 的周期性用户任务。在完成 warming up 之后,latency 工具会开始正式测试,每间隔 1 秒计算一次 1 秒内所有的延迟信息。因为用户任务的周期为 1000 us,那么 1 秒内会有 1000 个采样点。采样线程还会汇总线程运行期间的所有延迟信息,得到历史最佳和最差延迟。
打印线程会根据采样线程的节奏,每隔 1 秒打印一次不断逐行打印测试结果。所有的延迟数据的单位都是微秒。根据每一行的第一列,我们可以把输出分成 4 中类型:RTT(RT time)、RTH(RT header)、RTD(RT data)还是 RTS(RT summary)。
- RTT 行包含测试的基本信息,包括测试模式、测试周期、任务优先级等。
- RTH 行包含延迟的统计信息:
- 1 秒内最小延迟:latency min。
- 1 秒内平均延迟:latency avg
- 1 秒内最大延迟:latency max
- 历史超时次数: overrun
- 历史切换到次模式的次数:msw(参考实时任务状态与统计信息章节)
- 历史最佳延迟:latency best
- 历史最差延迟:latency worst
- RTD 行包含与 RTH 对应的每个数据值。
- RTS 行包含测试的总结信息
- 历史最佳延迟:latency best
- 历史平均延迟:latency avg
- 历史最差延迟:latency worst
- 历史超时次数: overrun
- 历史切换到次模式的次数:msw
- 实际测试运行时间:时:分:秒
- 指定测试运行时间:时:分:秒(如果未指定,则等于实际测试运行实际时间)
如果出现负数,则表示延迟补偿 Gravity 值过大。如何调整可参考延迟补偿 Gravity 章节。
如果 latency 中的采样线程在运行过程中出现了切换到次模式的情况,即 msw 值大于 0,在结束运行时会出现如下警告信息:
Warning! some latency peaks may have been due to involuntary mode switches.
Please contact xenomai@xenomai.org
8.1.2 latency 工具选项
latency 工具提供了多个选项供用户选择,可以根据具体的测试需求调整参数。下面是一些常用的选项说明:
-
采样模式与参数
- -p <period_us>:设置采样周期(单位:微秒)。
- -T <test_duration_seconds>:设置测试持续时间(单位:秒),默认值为0,表示需要手动终止测试(通过按 Ctrl+C)。
- -t <test_mode>:设置测试模式,0 表示用户任务模式(默认),1 表示内核任务模式,2 表示定时器中断模式。
- -P <priority>:设置任务的优先级(仅在测试模式0和1中有效)。
- -c <cpu>:将采样任务绑定到指定的CPU上。
-
打印输出
- -s:打印最小、平均、最大延迟的统计信息。
- -l <data-lines per header>:每隔多少 RTD 数据行打一次标题行(RTS + RTH)。默认值为21,即每间隔 21 个数据行打印一次标题。设置为0可以禁止打印标题。
- -q:即安静模式。当使用 -T 选项时,可以禁止打印 RTD 和 RTH 行。
-
直方图输出与导出
- -h:打印最小、平均、最大延迟的直方图。
- -H <histogram-size>:设置直方图的大小,默认值为200。如果最后一个桶被填满,可以增加这个值。
- -B <bucket-size>:设置直方图中每个桶的大小(单位:纳秒),默认值为1000纳秒。减小这个值可以得到更精细的延迟测量结果。
- -g <file>:将直方图数据导出到指定文件中,方便使用 gnuplot 进行可视化。Xenomai 源码中的 scripts/histo.gp 是使用 gnuplot 的示例脚本。
-
调试选项
- -f:当检测到新的最大延迟时,冻结当前的跟踪信息。
- -b:当采样线程发生切换到次模式的情况时,立即中断测试。此时查看/proc/xenomai/debug/relax可定位到切换的原因。
8.1.3 latency 工具的 3 种测试模式
latency 工具提供了 3 种测试模式,分别为:
- 用户任务模式:测试周期性用户任务的延迟。
- 内核任务模式:测试周期性内核任务的延迟。
- 定时器中断模式:测试定时器中断的延迟。
用户任务模式在上文已经详细介绍了原理,这里不再赘述。
内核任务和定时器中断都需要运行在内核态,因此并不需要在用户态建立采样线程,反而依赖于 RTDM 驱动 xeno_timerbench,此模块默认会编译进内核。
[*] Xenomai/cobalt —>
Drivers —>
Testing drivers —>
<*> Timer benchmark driver
如果选择了后两种模式:
-
latency 工具启动后,会打开 /dev/rtdm/timerbench 设备文件。如果打开失败,会报错并提示加载 RTDM 驱动 xeno_timerbench。
benchdev = open("/dev/rtdm/timerbench", O_RDWR);
-
使用 ioctl 系统调用来配置并启动实时测试。根据测试模式的不同,设置模式为 RTTST_TMBENCH_TASK 或 RTTST_TMBENCH_HANDLER。
err = ioctl(benchdev, RTTST_RTIOC_TMBENCH_START, &config);
-
周期性使用 ioctl 系统调用来获取测试结果,有打印线程输出。
err = ioctl(benchdev, RTTST_RTIOC_INTERM_BENCH_RES,
&result); -
停止测试时,使用 ioctl 系统调用来停止测试。
ioctl(benchdev, RTTST_RTIOC_TMBENCH_STOP, &overall);
8.1.4 延迟直方图
latency 工具提供了直方图功能,使用 -h 选项可以打印延迟直方图,直观地展示延迟的分布情况。
下面是一个示例输出,latency -T 10 -h 运行 10 秒,并打印延迟直方图:

- param:
- min: 最小延迟直方图
- avg: 平均延迟直方图
- max: 最大延迟直方图
- range: 延迟范围
- 延迟范围也称为桶,其大小由 -B 选项设置。
- samples:
- 采样延迟值落入本行对应的延迟范围内的次数
- 对于平均延迟直方图来说,本列所有的采样次数累加起来等于总的采样次数。因为用户任务的周期为 1000 us,那么 1 秒内会有 1000 个采样点。在 10 秒内,采样次数累计共 10000 个。
为了更好的理解延迟直方图,我们可以用 gnuplot 绘制延迟直方图。Xenomai 源码中的 scripts/histo.gp 是使用 gnuplot 的示例脚本。
首先,添加 -g 选项,将延迟直方图数据导出到文件 latency10s.txt。
latency -T 10 -h -g latency10s.txt
然后,使用 gnuplot 绘制延迟直方图。
gnuplot -e 'input_file="./latency10s.txt";output_file="./latency10s.png";graph_title="latency 10s ARM64"' ./xenomai-v3.2.4/scripts/histo.gp
最终得到了延迟直方图如下:

