嵌入式单核上的低延迟过程 Linux

Low latency process on single core with embedded Linux

我想 运行 在具有嵌入式 Linux 系统的单独核心上执行单个低延迟任务(对于音频,ALSA/JACK)。删除调度程序和其他中断可能是这里的关键。

到目前为止我发现了几种方法,例如cpusets 和 2009 年的离线调度程序(遗憾的是不支持用户 space 任务)。

有没有newer/more方便的方法来实现这个?

Offline scheduler

您要查找的主题是"CPU affinity"。 CPU 亲和力有两个主要方面:进程的亲和力和中断的亲和力。

据我所知(诚然有限):

  • 使用taskset命令将进程分配给CPUs。 (亲和力由子进程继承。)

  • Linux 上 CPU 分配的中断可以使用 /proc/irq/<n>/smp_affinity 进行操作。要验证分配的有效性,请检查 /proc/interrupts 以查看哪些 CPU 服务于哪些中断。 See here.

在您的特定情况下,您希望为关键应用程序保留一个 CPU(也称为核心),例如 CPU0。这意味着所有进程和中断都应该分配给除 CPU0 之外的所有进程,使用清除了位 0 (== CPU0) 的关联掩码,例如0xfffffffe。并且您的关键应用程序将具有 0x1 的关联掩码,这意味着它只允许 运行 在 CPU0.

此外,您可能需要在应用程序中使用 sched_setscheduler 系统调用来将调度设置为实时策略之一。这可能会改善您的应用程序的延迟(但也会变得更糟)。

请注意,调整 CPU 亲和力并非易事,明确的解决方案很少见。您需要进行测试和实验以确保配置能够维持您需要的性能。例如,您的应用程序很可能会与其他进程进行通信。如果通信是同步的,而其他进程反应缓慢(因为它们的 CPU 资源有限),这反过来会对关键应用程序的性能产生负面影响。同样适用于声卡的中断。

希望对您有所帮助。