我正在一个带有RT内核的多核(Debian) Linux机器上开发一个音频应用程序。音频源生成所需的处理时间很长,无法由单个内核处理,因此我有三个不同的线程:
线程2和3正在写入循环缓冲器,而线程1则从循环缓冲区读取数据并将其加到端口音频缓冲区中。
我尝试过许多缓冲区大小和调度策略,我的最佳结果是FIFO策略,音频缓冲区大小为16个立体声样本,环缓冲区大小为576。此解决方案会产生超过13 is (576/44100*1000)的延迟,这太过了。
我确信这个延迟可以减少,但我不是Linux调度方面的专家。有什么想法吗?
发布于 2015-04-27 23:54:53
只要您将流程的RT保持在核心位置上,策略就不重要了。
确保将任何其他应用程序踢出用于RT的核心(例如,使用isolcpus=内核cmdline参数)。否则,低prio进程会触发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以下。
https://stackoverflow.com/questions/29863321
复制相似问题