该教程和源代码参考应用程序定义了多个命令行参数,用于控制执行流程。这允许通过不同选项来实验,影响实时操作。这些选项包括:采样和工作负载迭代的次数、要分配的内存块大小、是否作为实时优先级线程运行、是否锁定内存、让出系统事件的时间间隔,以及是否通过改变间隔来建立固定的循环时间节奏。
应用程序的输出包括:最小和最大工作负载执行时间(以微秒和时钟周期为单位)、抖动(jitter)以及启用时错过的循环次数。输出可以格式化为易于阅读的文本,或者以逗号分隔值(CSV)的形式输出,便于导入其他应用程序中。
可以使用 -h 标志执行教程应用程序以查看帮助信息。
sinsegye@sinsegye-sx21:~$ sudo ./latency --help
based on xkernel/cobalt v3.2.3
µsage: latency [options]:
-h                              print histograms of min, avg, max latencies
-g <file>                       dump histogram to <file> in gnuplot format
-s                              print statistics of min, avg, max latencies
-H <histogram-size>             default = 200, increase if your last bucket is full
-B <bucket-size>                default = 1000ns, decrease for more resolution
-p <period_µs>                  sampling period
-l <data-lines per header>      default=21, 0 to supress headers
-T <test_duration_seconds>      default=0, so ^C to end
-q                              supresses RTD, RTH lines if -T is µsed
-D <testing_device_no>          number of testing device, default=0
-t <test_mode>                  0=µser task (default), 1=kernel task, 2=timer IRQ
-f                              freeze trace for each new max latency
-c <cpu>                        pin measuring task down to given CPU
-P <priority>                   task priority (test mode 0 and 1 only)
-b                              break upon mode switch
--main-prio=<prio>		main thread priority
--print-buffer-size=<bytes>	size of a print relay buffer (16k)
--print-buffer-count=<num>	number of print relay buffers (4)
--print-sync-delay=<ms>	max delay of output synchronization (100 ms)
--cpu-affinity=<cpu[,cpu]...>	set CPU affinity of threads
--[no-]sanity			disable/enable sanity checks
--verbose[=level] 		set verbosity to desired level [=1]
--silent, --quiet 		same as --verbose=0
--trace[=level] 		set tracing to desired level [=1]
--version			get version information
--dump-config			dump configuration settings
--help				display help
        示例如下:
sinsegye@sinsegye-sx21:~$ sudo ./latency -c1 -t0 -p 100 -P 99 -h
== Sampling period: 100 µs
== Test mode: periodic µser-mode task
== All results in microseconds
warming up...
RTT|  00:00:01  (periodic µser-mode task, 100 µs period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|     -2.070|     -1.332|      2.250|       0|     0|     -2.070|      2.250
RTD|     -2.090|     -1.335|      2.708|       0|     0|     -2.090|      2.708
RTD|     -1.995|     -1.336|      2.440|       0|     0|     -2.090|      2.708
RTD|     -1.998|     -1.334|      2.412|       0|     0|     -2.090|      2.708
RTD|     -2.081|     -1.339|      1.893|       0|     0|     -2.090|      2.708
RTD|     -1.959|     -1.335|      2.392|       0|     0|     -2.090|      2.708
RTD|     -2.021|     -1.339|      2.162|       0|     0|     -2.090|      2.708
RTD|     -2.056|     -1.336|      2.341|       0|     0|     -2.090|      2.708
---|--param|----range-|--samples
HSD|    min|   1 -  2 |        3
HSD|    min|   2 -  3 |        5
---|--param|----range-|--samples
HSD|    avg|   0 -  1 |     7598
HSD|    avg|   1 -  2 |    74213
HSD|    avg|   2 -  3 |       21
---|--param|----range-|--samples
HSD|    max|   1 -  2 |        1
HSD|    max|   2 -  3 |        7
HSH|--param|--samples-|--average--|---stddev--
HSS|    min|         8|      1.625|      0.518
HSS|    avg|     81832|      0.907|      0.291
HSS|    max|         8|      1.875|      0.354
---|-----------|-----------|-----------|--------|------|-------------------------
RTS|     -2.090|     -1.335|      2.708|       0|     0|    00:00:08/00:00:08
        
打印最小、平均、最大延迟的直方图
选项是指在执行 latency 测试工具时,程序将输出一份关于实时系统延迟的统计直方图,显示系统的 最小延迟、平均延迟 和 最大延迟 的分布情况。
生成的直方图如下:
---|--param|----range-|--samples
HSD|    min|   1 -  2 |        6
---|--param|----range-|--samples
HSD|    avg|   0 -  1 |    21441
HSD|    avg|   1 -  2 |    44170
HSD|    avg|   2 -  3 |       19
---|--param|----range-|--samples
HSD|    max|   2 -  3 |        6
HSH|--param|--samples-|--average--|---stddev--
HSS|    min|         6|      1.000|      0.000
HSS|    avg|     65630|      0.674|      0.470
HSS|    max|         6|      2.000|      0.000
---|-----------|-----------|-----------|--------|------|-------------------------
RTS|     -1.501|     -1.097|      2.580|       0|     0|    00:00:06/00:00:06
        第一部分:最小延迟统计 (min)
---|--param|----range-|--samples
HSD|    min|   1 -  2 |        6
        Histogram Data。第二部分:平均延迟统计 (avg)
---|--param|----range-|--samples
HSD|    avg|   0 -  1 |    21441
HSD|    avg|   1 -  2 |    44170
HSD|    avg|   2 -  3 |       19
        Histogram Data。第三部分:最大延迟统计 (max)
---|--param|----range-|--samples
HSD|    max|   2 -  3 |        6
        第四部分:整体统计 (HSH)
HSH|--param|--samples-|--average--|---stddev--
HSS|    min|         6|      1.000|      0.000
HSS|    avg|     65630|      0.674|      0.470
HSS|    max|         6|      2.000|      0.000
        Histogram Summary Header。统计的是整体情况。第五部分:系统实时性统计 (RTS)
---|-----------|-----------|-----------|--------|------|-------------------------
RTS|     -1.501|     -1.097|      2.580|       0|     0|    00:00:06/00:00:06
        选项 -g 
使用 gnuplot 可视化数据:
gnuplot
        在 gnuplot 控制台中,使用如下命令来绘制数据:
plot 'latency_histogram.gnuplot' µsing 1:2 with lines title 'Latency Histogram'
        这条命令会读取 latency_histogram.gnuplot 文件中的数据并将其绘制为一条折线图,表示延迟分布。如下图所示

打印最小、平均、最大延迟的统计信息。这意味着,当你运行带有 -s 选项的 latency 工具时,它将输出系统在实时任务执行期间的 最小延迟、平均延迟 和 最大延迟 的具体数值,而不是生成直方图或其他详细的分布数据。
如下数据:
HSH|--param|--samples-|--average--|---stddev--
HSS|    min|         6|      1.000|      0.000
HSS|    avg|     65630|      0.674|      0.470
HSS|    max|         6|      2.000|      0.000
        Histogram Summary Header。统计的是整体情况。参数在 latency 工具中用于设置 直方图的桶(bucket)数量,即记录延迟数据时,用来划分延迟范围的区间数量。
假设你正在测量一个实时系统的延迟,并且设置了 200 个桶。如果测量的延迟从 0 微秒到 1000 微秒,这 1000 微秒的范围将被划分成 200 个区间(每个区间大约为 5 微秒),并将每个延迟样本放入对应的区间中。
参数在 latency 工具中用于设置每个桶(bucket)在直方图中的延迟范围(即每个桶的大小)。具体来说,它定义了每个桶可以记录的延迟值的范围大小,默认为1000纳秒(ns)。
假设你使用默认的 bucket-size,即 1000 纳秒。如果某次延迟测量结果是 1500 纳秒,那么这个值将会落在第 2 个桶(1000-1999ns)。这样,如果有多个延迟值落在这个区间内,它们都会记录在同一个桶中。
latency -B 500
        这会将每个桶的大小设置为 500 纳秒,相比默认的 1000 纳秒 提供了更高的分辨率。也就是说,延迟会被记录在 500ns 的区间内,而不是 1000ns。
在 latency 工具中用于设置 采样周期,单位是 微秒(µs)。它定义了延迟测量之间的时间间隔,即两次延迟采样的时间间隔。
latency -p 1000
        这个命令表示将采样周期设置为 1000 微秒,即每隔 1000 微秒(1 毫秒)采集一次延迟数据。这意味着 latency 工具每 1 毫秒对系统的延迟情况进行一次采样并记录数据。
在 latency 工具中用于设置终端输出不包含打印头信息。具体展示如下:
== Sampling period: 100 µs
== Test mode: periodic µser-mode task
== All results in microseconds
warming up...
RTD|     -1.477|     -0.937|      4.687|       0|     0|     -1.477|      4.687
RTD|     -1.485|     -0.940|      4.476|       0|     0|     -1.485|      4.687
RTD|     -1.485|     -0.929|      3.963|       0|     0|     -1.485|      4.687
RTD|     -1.468|     -0.929|      3.752|       0|     0|     -1.485|      4.687
RTD|     -1.467|     -0.939|      3.767|       0|     0|     -1.485|      4.687
RTD|     -1.466|     -0.932|      4.254|       0|     0|     -1.485|      4.687
        在 latency 工具中用于设置测试的持续时间,默认为0,0代表直到遇到Ctrl+C才终止。
在 latency 工具中用于设置隐藏RTD与RTH行的输出,但是要与 -T 选项结合使用才生效。
在 latency 工具中用于指定延迟测试的 测试模式。该参数决定了 latency 工具用哪种方式来生成和测量延迟。可以选择以下三种测试模式:
在 latency 工具中的作用是 将延迟测量任务绑定到指定的 CPU 核心上运行,也就是将测量任务的 CPU 亲和性 固定到特定的一个或多个 CPU 核心。通过这个参数,你可以确保延迟测量任务只在指定的 CPU 上运行,不会被其他 CPU 核心处理,这样有助于更精确地测量特定 CPU 核心上的延迟情况。
在 latency 工具中的作用是 设置测量任务的优先级。这个参数指定延迟测量任务在系统调度中的优先级,以确保任务能够按照指定的优先级进行调度。该参数仅适用于测试模式 0(用户任务)和测试模式 1(内核任务),因为这两种模式下任务的调度是受优先级影响的。
MetaOS 中,优先级决定了任务被调度的顺序。高优先级任务将优先于低优先级任务执行,因此为测量任务设置较高的优先级可以避免被其他任务抢占,获得更准确的延迟数据。应用程序如何自动识别一组标准的命令行选项,以及如何使用这些选项来调试和配置应用程序。这些选项可以在不需要修改应用程序代码的情况下被解释和执行。例如,使用 --dump-config 选项,应用程序会自动输出其链接的 Cobalt 库的构建设置。
| Option | Description | 
|---|---|
--main-prio=<prio> | 
Sets the priority of the main thread | 
--print-buffer-size=<bytes> | 
Sets the size of the print buffer µsed for output, default is 16k | 
--print-buffer-count=<num> | 
Sets the total number of buffers in the output ring, default is 4 | 
--print-sync-delay=<ms> | 
Sets the maximum delay before synchronizing the output buffers, default is to refresh every 100 ms | 
--cpu-affinity=<cpu[,cpu]...> | 
Sets the CPU affinity for threads | 
--[no-]sanity | 
Turns on/off sanity checks | 
--verbose[=level] | 
Sets verbosity to the desired level, default is 1 | 
--silent, --quiet | 
Same as --verbose=0 | 
--trace[=level] | 
Sets tracing to the desired level, default is 1 | 
--version | 
Gets version information of the real-time core | 
--dump-config | 
Dumps the settings µsed for building the Cobalt library linked to the application | 
--help | 
Displays help | 
用于这是主线程的线程优先级,通常是在 main() 函数内部进行。
参数 
SCHED_OTHER 调度策略。这是标准的非实时调度策略,通常用于普通的后台处理。SCHED_FIFO 调度策略,并设置为给定的优先级。SCHED_FIFO(先进先出)是一种实时调度策略,确保了更高优先级的线程总是能够在低优先级线程之前运行。标准输出函数(如 printf(3), fprintf(3), 和 puts(3))背后的缓冲机制。
当启用符号封装时,Cobalt 会介入常见的 stdio 输出调用。这意味着,即便是在实时线程中调用如 printf 等函数,也不会因为等待 I/O 操作而阻塞,从而保证了实时性。
这些 stdio 调用使用一种缓冲区的机制。这些缓冲区组成一个输出环,由实时线程无锁地填充,然后定期由一个常规的(非实时)Linux 帮助线程刷新到进程的目的输出流(如 stdout、stderr 或其他特定的流)。
参数用途:
--print-buffer-size 参数,开发者可以设置每个缓冲区的大小。默认情况下,每个缓冲区大小为 16 KB。用于设置输出环中缓冲区的总数量。这些缓冲区与之前提到的 --print-buffer-size 参数密切相关,后者定义了单个缓冲区的大小。
参数用途:
Linux 帮助线程定期清空,将数据刷新到如 stdout 或 stderr 这样的目的输出流。通过增加缓冲区的数量,可以提高在高负载下处理输出请求的能力,因为这样可以在输出流被阻塞或延迟时存储更多的输出数据。此参数用于设置输出环中缓冲区内容在被同步到最终输出流之前的最大延迟时间,单位为毫秒(ms),这与之前提到的 --print-buffer-size 和 --print-buffer-count 参数配合使用,共同管理输出数据的处理。
参数用途:
用于指定 Cobalt 应用程序创建的线程可以运行的 CPU 集合。这个参数在没有明确指定线程应该固定运行在特定 CPU 上时非常有用。默认情况下,线程可以在任何在线的 CPU 上运行。
参数用途:
用于在 Cobalt 库中开启或关闭启动期间的健全性检查。这是一个开关选项,其中 --sanity 表示开启检查,而 --no-sanity 表示关闭检查。这些检查主要在应用程序启动时进行,以确保运行环境符合预期的配置和健康状态。
检查的内容:
这些健全性检查包括但不限于:
Cobalt 库的系统配置是否正确。用于设置 Cobalt 应用程序的输出详细级别。这个参数允许应用程序在运行时显示多少详细的日志或调试信息。
参数用途:
与参数 --verbose=0 相同
用来调整和控制应用程序的跟踪详细度,有助于监控和调试内部操作。