2015-06-19 47 views
0

我有一个低延迟服务器/客户端音频应用程序运行在单独的核心。 (通过cpuset) 没有检测到xunns,我怀疑调度程序打断我的关键例程。由于在用户空间中禁止中断是不可能的,我的想法是创建一个内核模块并为local_irq_disable()/ local_irq_enable()编写包装函数。安全不是问题。具有完全可抢占内核的rt Linux正在使用中。如何调用make内核模块调用或禁用中断?

  1. 我假设nanosleep函数不会中断吗?
  2. 什么是更优雅的方式来禁用调度程序,但保持 定时器运行?
  3. 如何从用户空间调用这些包装函数?

编辑:SMP亲和力是关键字在这里:SMP IRQ Affinity

+0

音频应用程序需要一个关键的例程吗?为什么?怎么样? –

+1

用户空间代码启用/禁用内核中断。听起来像是一个很好的灾难配方。 – Olaf

+0

这是一个关于Linux系统延迟有多低的测试案例。由于回放中仍然有毛刺,但没有xruns,程序中必须有中断。为什么要禁用一个核心的interupts导致灾难?从我在内核部分读到的有关local_irq_save/.. disable的内容中,它们由其他内核处理。 – RootRaven

回答

0

我建议首先尝试使用lttng和tracecompass找出真正适合你的系统和什么其他程序上发生的情况来追踪你的内核调度,资源锁定或中断会迫使你的进程退出cpu。

你真的需要这个过程来运行没有CPU时间差距?如果不是的话:你需要微秒还是毫秒的响应时间?

+0

是的,它应该达到实时性能。微秒,绝对。 – RootRaven

+0

尝试用lttng跟踪它。可能是,由于内核中的rt宽度限制,该进程正在被抢占。有两个sysctl参数可以调整以防止出现这种情况。它们默认为: sysctl kernel.sched_rt_runtime_us = 950000 sysctl kernel.sched_rt_period_us = 1000000这意味着如果一个rt进程占用所有cpu时间,则cpu时间的5%将保留给正常和其他调度任务。 (如果cpus完全被rt进程阻塞,这有助于保持ssh外壳不动) – Jan