多核Linux系统上的实时音频

时间:2015-04-25 09:20:14

标签: linux audio kernel real-time

我正在使用RT内核在多核(Debian)Linux机器上处理音频应用程序。音频源生成需要大量的处理时间,而这些处理时间不能由单个核处理,所以我有三个不同的线程:

  1. 在核心0上运行的主要portaudio线程
  2. 在核心1上运行的源代码1
  3. 在核心2上运行的源代码2
  4. 线程2和3正在写入一个环形缓冲区,而线程1正在从环形缓冲区读取数据并将其加到portaudio缓冲区中。

    我尝试了很多缓冲区大小和调度策略,我最好的结果是FIFO策略,音频缓冲区大小为16个立体声样本,环形缓冲区大小为576.此解决方案产生超过13毫秒(576/44100 * 1000)的延迟,这太过分了。

    我确信可以减少这种延迟,但我不是Linux日程安排的专家。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

只要您将流程的RT prio保持在核心上的任何其他流程之上,策略就无关紧要。

确保从用于RT的核心中取出任何其他应用程序(例如,使用isolcpus= kernel cmdline参数)。否则,低prio进程可以触发I / O,这将阻止您的RT线程。您还应该将应用程序不关心的所有中断分配给未使用的核心。实际上我建议在正常情况下使用core0,在你的情况下使用核心1,2,3用于RT,因为因为core0是启动CPU,所以它必须执行一些特殊的内务处理任务。

如上所述对系统进行分区后,请尝试使用延迟测量工具来确定导致延迟的原因。谷歌搜索linux rt latency trace将为您提供许多有用的链接。这是基本的:http://people.redhat.com/williams/latency-howto/rt-latency-howto.txt

如果事实证明某些内核处理阻止了您的应用程序,您可以通过查看内核线程的描述来找到解决方案:http://lxr.free-electrons.com/source/Documentation/kernel-per-CPU-kthreads.txt

你绝对应该能够超过2毫秒。