循环测试用于实时补丁的Linux内核

7
你好,我已经使用RT Patch修补了Linux内核,并使用监视延迟的Cyclinctest进行了测试。但是与原始内核相比,内核表现不佳,没有得到改善。 https://rt.wiki.kernel.org/index.php/Cyclictest 我检查了RT的uname,在这方面看起来还不错。
因此,我检查了cyclinctest的要求,并指出必须确保在内核配置中进行以下配置:
CONFIG_PREEMPT_RT=y
CONFIG_WAKEUP_TIMING=y
CONFIG_LATENCY_TRACE=y
CONFIG_CRITICAL_PREEMPT_TIMING=y
CONFIG_CRITICAL_IRQSOFF_TIMING=y 

现在出现的问题是配置文件中不包含这些条目。也许它们已经过时了,在新版本(3.8.14)中被重命名了吗?我找到了类似以下的选项:
CONFIG_PREEMPT_RT_FULL=y
CONFIG_PREEMPT=y
CONFIG_PREEMPT_RT_BASE=y
CONFIG_HIGH_RES_TIMERS=y 

3.x内核中是否足够提供所需的功能?有没有提示?

1个回答

11

要在PREEMPT_RT下获得硬实时性能,需要完成很多工作。以下是我知道的一些事情。带星号标记的条目适用于您当前的位置。

  • 使用PREEMPT_RT对内核进行补丁(就像您已经做的那样),并启用CONFIG_PREEMPT_RT_FULL(以前称为CONFIG_PREEMPT_RT,正如您所推断的那样)。
  • 禁用处理器频率缩放(通过从内核配置中删除它或更改管理器或其设置)。(*)
    • 原因:更改核心的频率需要一段时间,在此期间核心不执行任何有用的工作。这会导致高延迟。
    • 要删除此项,请查看内核设置中的ACPI选项。
    • 如果您不想将此功能从内核中删除,可以将cpufreq管理器设置为“performance”以将其锁定在最高频率。
  • 禁用深度CPU睡眠状态
    • 原因:与切换频率类似,从深度睡眠中唤醒CPU可能需要一段时间。
    • Cyclictest可以代替你完成这个任务(查找/dev/cpu_dma_latency以了解如何在应用程序中执行此操作)。
    • 或者,您可以在内核中禁用“cpuidle”基础设施,以防止这种情况发生。
  • 为实时线程设置高优先级,高于50(最好是99)(*)
    • 原因:您需要将优先级放在内核的大部分之上-在PREEMPT_RT内核中,包括IRQ在内的许多内容都以优先级50运行。
    • 对于cyclictest,您可以使用“-p#”选项来执行此操作,例如“-p99”。
  • 必须锁定应用程序的内存。(*)
    • 原因:如果未锁定应用程序的内存,则在执行过程中内核可能需要重新映射一些应用程序的地址空间,从而触发高延迟。
    • 对于cyclictest,可以使用“-m”选项完成此操作。
    • 要在自己的应用程序中执行此操作,请参见 RT_PREEMPT howto
  • 如果加载了nvidia、nouveau和i915模块,则必须卸载它们(或者根本不构建它们)(*)
    • 原因:已知会引起高延迟。希望在实时系统中不需要它们 :P
  • 您的实时任务必须编码为实时任务
    • 例如,您不能通过malloc()进行文件访问或动态内存分配。许多系统调用是禁止的(IMO很难找到哪些是可以接受的)。
    • cyclictest大多数已经编写成实时操作,就像许多实时音频应用程序一样。但是,您需要使用“-n”标志运行它,否则它将不会使用实时安全的睡眠调用。

实际执行cyclictest应至少具有以下一组参数:

sudo cyclictest -p99 -m -n

这是为那些正在编写自己的应用程序的人编写的--如果你不是,那么你可以跳过需要应用程序执行的步骤。任何体面的实时应用程序都会为您完成这些操作。 - crosstalk
看起来很不错,即使我认为我几乎考虑了所有这些点,但有些并不适用,因为我在嵌入式平台上。我注意到的一件事是,使用cyclictest的pid运行chrt -p时,显示pr 0和scheduling other,不确定是否正确。 - eactor
1
没问题。cyclictest在实时优先级下生成线程--主线程的优先级仍为0。如果您将chrt传递给实时线程的TID(我使用“ps am -o cmd,tid,pri”进行标识),它将将其标识为优先级99的线程。 - crosstalk
使用 ps am -o cmd,tid,pri 命令可以获取 cyclictest -t1 -p 99 -n 010 的两个 PID 和 PR,结果如下:
  • 2478 19
  • 2479 139
- eactor
1
这是正确的 - 优先级19的任务会打印到控制台,而优先级139的任务是实时循环。请注意,19和139是Linux内部的优先级,这就是为什么它们不是0和99。 - crosstalk
ps am -o cmd,tid,pri,psr 添加了 CPU 亲和性,因为我很好奇 cyclictest 是否在同一个 CPU 上执行两个任务。 - eactor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接