【问题标题】:How to call make kernel module calls or disable interrupts?如何调用内核模块调用或禁用中断?
【发布时间】:2015-09-05 12:08:24
【问题描述】:

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

  1. 我认为 nanosleep 功能在没有中断的情况下也无法工作?
  2. 禁用调度程序但保留的更优雅的方法是什么? 计时器运行?
  3. 如何从用户空间调用这些包装函数?

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

【问题讨论】:

  • 一个音频应用程序需要如此关键的例程?为什么?怎么样?
  • 用户空间代码启用/禁用内核中断。听起来像是灾难的好方法。
  • 这是一个关于 Linux 系统延迟可以达到多低的测试案例。由于播放中仍有故障但没有 xruns,因此程序中必须有中断。为什么禁用一个核心的中断会导致灾难?从我在内核部分读到的有关 local_irq_save/..disable 的内容,它们由其他内核处理。
  • IRQ 通常只是唤醒具有高优先级的线程,您是否尝试为关键线程分配高 RT 优先级。
  • 是的,它们有 rt 优先级。如果没有 USB 或 eth 中断,它仍然可以更快。

标签: c linux linux-kernel kernel kernel-module


【解决方案1】:

我建议首先尝试使用lttng 和 tracecompass 来跟踪您的内核调度,以找出您的系统上真正发生的事情以及其他哪些进程、资源锁定或中断正在迫使您的进程退出 CPU。

你真的需要这个进程在没有 CPU 时间间隔的情况下运行吗?如果不是:您需要以微秒还是毫秒为单位的响应时间?

【讨论】:

  • 是的,它应该达到实时性能。肯定是微秒。
  • 尝试用 lttng 追踪它。由于内核中的 rt 带宽限制,该进程可能会被抢占。您可以调整两个 sysctl 参数来防止这种情况。它们默认为: sysctl kernel.sched_rt_runtime_us=950000 sysctl kernel.sched_rt_period_us=1000000 这意味着如果一个 rt 进程正在消耗所有 cpu 时间,则为正常和其他调度任务保留 5% 的 cpu 时间。 (如果 cpus 被 rt 进程完全阻塞,这有助于保持 ssh shell 反应)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多