This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] [参考译文] [常见问题解答] AM625:如何使用 cyclictest 测量多核 Sitara 器件上的中断延迟?

Guru**** 656470 points
Other Parts Discussed in Thread: AM3357, AM625, AM6442
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1172055/faq-am625-how-to-measure-interrupt-latency-on-multicore-sitara-devices-using-cyclictest

器件型号:AM625
主题中讨论的其他器件:AM3357AM6442

如何测量 AM625等 Sitara 多核器件上的中断延迟并将结果与 AM3357等单核器件进行比较?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Cyclictest (https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start )是用于在 Linux 中测量中断延迟的典型实时测试工具。 OSADL ( https://www.osadl.org/Realtime-Preempt-Kernel.kernel-rt.0.html#externaltestingtool )页面提供了很多有关如何运行测试的详细信息和示例,而且它们拥有大量的硬件,其中公开详细介绍了运行的 Linux 内核以及产生的中断延迟。 通常、最大或最坏情况下的延迟是比平均值更重要的度量。

    cyclictest -l100000000 -m -Sp90 -i200 -h400 -q >output

    是 OSADL 示例或默认参数:

     -m 表示锁定所有内存分配、在实时嵌入式系统中、您不想将内存分页到磁盘

     -l100000000用于100M 迭代。 大多数最坏情况的异常值仅发生在每1M 一次或每小时一次,因此需要长时间运行(请注意,这意味着大于5h 的实时时间)

    - S 是 SMP 或每个内核启动一个线程。 通常、每个内核只启动一个、而不是仅在一个内核上进行测量是最简单的(-T1 -A2是在内核2上启动一个线程的替代方案)

    -P90以实时优先级90 (99是最高)运行中断。 因此、这是您要测量的其他项目的相对优先级选择。

    -i200用于每200微秒测量一次延迟(每个内核的线程计划每200us 运行一次)

    -h400用于收集观察到的中断延迟直方图、直方图高达400us、400桶

    -q 将保持安静、直到结束

    一般而言、还必须考虑正在运行的其他内容以及它在最终系统中的代表性。 以太网文件系统(NFS)等操作将影响结果。 在其他空闲系统中、只是循环测试可能具有有限的值、通常启动后台负载来表示实际系统的非实时性是很有意义的。 一种可能的方法是使用应力- ng 等合成测试程序。

    在单核系统上、后台和实时都将共存在同一个内核上、但将以串行方式执行。 在 SMP 多核系统上、后台线程可以在另一个内核上并行运行。 为了控制此变量并保证在实际应用和循环测试中降低最大延迟、可以使用内核关联性和隔离内核。 在 Sitara 多核处理器上,您可以使用 kernel 命令行参数 isolcpus 将一个(或多个)内核与内核调度隔离。 例如、下面我在 uboot 停止引导并隔离 CPU 3、因此内核在调度或调度任何内容时不会考虑它

    U-Boot 2021.01-g2dd2e1d366 (Sep 27 2022 - 16:43:29 +0000)
     
    SoC:   AM62X SR1.0 GP
    Model: Texas Instruments AM625 SK
    EEPROM not available at 0x50, trying to read at 0x51
    Board: AM62-SKEVM rev E2
    DRAM:  2 GiB
    MMC:   mmc@fa10000: 0, mmc@fa00000: 1, mmc@fa20000: 2
    Loading Environment from MMC... OK
    In:    serial@2800000
    Out:   serial@2800000
    Err:   serial@2800000
    Net:   eth0: ethernet@8000000port@1
    Hit any key to stop autoboot:  0
    =>
    =>
    =>
    => optargs="isolcpus=3"
    =>
    =>
    => boot
    switch to partitions #0, OK
    mmc1 is current device

    然后、您可以开始后台加载、在这种情况下、您需要进行内存密集型测试(memrate 会以请求的速率进行1MB 突发、以满足每秒参数要求):

    stress-ng --memrate 1 --memrate-rd-mbs 70 --memrate-wr-mbs 140 --taskset 0 &

    这是对内核0的一次读取和一次写入。 您还可以为其提供一个列表、如0、2个及更多线程。 这表示后台负载。

    然后启动实际的循环测试。 只需在内核上使用-t1 -A3隔离(3)、或者像我在所有内核上执行的以下操作:

    cyclictest -l100000000 -m -Sp90 -i200 -h400 -q > output

    这将运行不到5个半小时。 文件输出将具有直方图和基本统计信息。 我在下面附加了3个照射行程。 该图是 按照 https://www.osadl.org/Create-a-latency-plot-from-cyclictest-hi.bash-script-for-latency-plot.0.html 中的建议绘制的 

    AM625 SDK 8.4 isolcpu=3、默认文件系统、所有文件都在运行。 内核0上的应力- ng 内存速率。

    CPU0 CPU1 CPU2 CPU3.
    最小 5. 5. 5. 5.
    平均 7. 6. 6. 6.
    最大 99 167. 167. 47.

    因此、在上图中、实时内核的最坏情况是47us.CPU3。

    AM6442 SDK 8.4 isolcpu=1、默认文件系统、其中所有文件都在运行、并且内联 ECC 打开。  内核0上的应力- ng 内存速率

    CPU0 CPU1
    最小 6. 7.
    平均 10. 9.
    最大 178. 64

    因此 、在上图中、实时内核的最坏情况是64us.CPU1。

    并参考无隔离的情况。

    AM6442 SDK 8.4、默认文件系统、所有文件都不运行任何 isolcpus。  内核0上的应力- ng 内存速率

    CPU0 CPU1
    最小 6.
    平均 9. 10.
    最大 163. 351

    OSADL 站点提供了许多嵌入式处理器(包括服务器处理器)的结果。 请参阅 https://www.osadl.org/Thumbnails-of-all-default-latency-plots.qa-latencyplot-thumbnails.0.html 作为起点。 对于嵌入式目标、低于50us 是一个现实目标、但低于20us 的最坏情况行为只能通过非常高端的处理器才能实现。

     Pekka