2015-04-25 35 views
1

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

  • 源代1上运行核心上运行

    1. 主要portaudio线程芯1
    2. 源代2上芯2

    线程2和3被写入到运行ringbuffer,而线程1从ringbuffer读取数据,并将其求和到portaudio缓冲器。我已经尝试了很多缓冲区大小和调度策略,我的最佳结果是FIFO策略,音频缓冲区大小为16个立体声样本,环形缓冲区大小为576.此解决方案产生超过13ms(576/44100 * 1000)的延迟,这太多了。

    我相信这个延迟可以减少,但我不是Linux调度方面的专家。有任何想法吗?

  • 回答

    1

    只要您保持流程的RT prio高于核心上的任何其他策略,则无关紧要。

    确保您踢出任何其他应用程序(例如,使用isolcpus=内核cmdline参数)。否则,低级进程会触发I/O,从而阻塞你的RT线程。您还应该将应用程序不关心的所有中断分配给未使用的内核。其实我会建议使用core0进行正常任务,并且在你的情况下使用RT核心1,2,3,因为由于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

    你绝对应该能够低于去2MS。