我想在具有嵌入式Linux系统的单独核心上运行单个低延迟任务(用于音频,ALSA/JACK
)。删除调度程序和其他中断可能是关键所在。
到目前为止,我发现了几种方法,例如: cpusets
和2009年的离线调度程序(遗憾的是,它不支持用户空间任务)。
是否有更新/更方便的方法来实现这一目标?
答案 0 :(得分:1)
您要查找的主题称为"CPU affinity"。 CPU亲和性有两个主要方面:进程的亲和性和中断的亲和性。
对我(公认有限)的知识:
使用taskset
命令将进程分配给CPU。 (亲缘关系由子进程继承。)
可以使用/proc/irq/<n>/smp_affinity
来操纵Linux上CPU分配的中断。要验证分配的有效性,请检查/proc/interrupts
以查看哪些CPU为哪个中断服务。 See here.
在您的特定情况下,您希望为关键应用程序保留单个CPU(也称为核心),例如CPU0。这意味着除了CPU0之外,所有进程和中断应该使用清除了位0(== CPU0)的关联掩码,例如CPU0分配给所有进程和中断。 0xfffffffe。并且您的关键应用程序将具有0x1的关联掩码,这意味着它只允许在CPU0上运行。
此外,您可能需要在应用程序中使用sched_setscheduler
系统调用来将调度设置为其中一个实时策略。这可能会改善应用程序的延迟(但也可能会更糟)。
请注意,调整CPU亲和力并非易事,而且很少有明确的解决方案。您需要进行测试和实验,以确保配置能够维持您所需的性能。例如,您的应用程序可能会与其他进程通信。如果通信是同步的,并且其他进程响应缓慢(因为它们具有有限的CPU资源),这反过来会对关键应用程序的性能产生负面影响。同样适用于声卡的中断。
希望有所帮助。