嵌入式单核上的低延迟过程 Linux
Low latency process on single core with embedded Linux
我想 运行 在具有嵌入式 Linux 系统的单独核心上执行单个低延迟任务(对于音频,ALSA/JACK
)。删除调度程序和其他中断可能是这里的关键。
到目前为止我发现了几种方法,例如cpusets
和 2009 年的离线调度程序(遗憾的是不支持用户 space 任务)。
有没有newer/more方便的方法来实现这个?
您要查找的主题是"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 资源有限),这反过来会对关键应用程序的性能产生负面影响。同样适用于声卡的中断。
希望对您有所帮助。
我想 运行 在具有嵌入式 Linux 系统的单独核心上执行单个低延迟任务(对于音频,ALSA/JACK
)。删除调度程序和其他中断可能是这里的关键。
到目前为止我发现了几种方法,例如cpusets
和 2009 年的离线调度程序(遗憾的是不支持用户 space 任务)。
有没有newer/more方便的方法来实现这个?
您要查找的主题是"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 资源有限),这反过来会对关键应用程序的性能产生负面影响。同样适用于声卡的中断。
希望对您有所帮助。