【问题标题】:How to improve scheduling and interrupt latency如何改善调度和中断延迟
【发布时间】:2017-04-28 10:29:12
【问题描述】:

如何改善调度器和中断延迟:

背景:

  • 基于 10 核 mips64 处理器的嵌入式系统
  • 9 个内核运行 SMP linux。内核版本 2.6.32.27
  • 我们有实时性能要求流程,必须在 1 毫秒内完成某些任务。在最大负载条件下,可能需要 800uS。
  • 该进程在接收到GPIO中断(FPGA提供的1ms中断。作为内核驱动程序实现)后开始处理。 到那时,它将对 gpio 驱动程序进行 icotl 调用,并通过 wake_up_interruptible 系统调用进入睡眠状态
  • GPIO ISR 将 wake_up() 这个过程
  • 为防止其他进程为此进程占用 CPU,我们在“isolcpus”内核上运行此进程。
  • 我们已将此进程的用户线程中的优先级设置为最高,如下所示: 优先级:80,调度类型:SCHED_FIFO threadSetRtPriority(SCHED_FIFO, 80);
  • 所有 /proc/sys/kernel/sched_ 参数值都是默认值。我们还没有对它们进行微调

问题:

  • 有时我们会看到 ISR 调用了 wake_up,但该进程仅在 350uS 之后调度。 这是一个重要的时刻,因为我们的处理器运行在 1.25GHz。 调度延迟的这个大数字让我们感到困惑,因为我们已经使用“isolcpus”专门为此进程隔离了核心
  • 我们分析了连续 1 毫秒 GPIO ISR 调用之间的最大 CPU 周期计数。这个最大时间超过 1.5ms。 这个大的中断延迟数字对我们来说太令人担忧了,因为这会占用进程在 1ms 边界内进行处理的可用时间。

请帮助我们减少中断和调度延迟数

【问题讨论】:

  • 是否为内核启用了CONFIG_PREEMPT 选项?不清楚:该进程是在内核空间还是用户空间?
  • 我们没有启用“CONFIG_PREEMPT”选项。我所指的过程是在用户空间中。
  • 所以你至少需要启用抢占或应用@Clifford 已经解释过的 RT 补丁

标签: linux-kernel embedded embedded-linux


【解决方案1】:

我一直在研究linux kernel 4.8 preempt-rt,它具有从此回购应用的RT_Preempt patchlinux kernel 4.8 preempt-rt,并取得了一些有希望的结果!

我通过运行 rt-benchmark cyclictestspreempt-rtnon-preempt-rt linux kernels 进行了基准测试,发现 Max Latencypreempt-rt linux kernel 的情况下下降到 61 us 而不是 2025 us使用non-preempt linux kernel 时,这也可能对您的情况有所帮助。

结果显然诱使我使用prempt-rt kernel,因为两者之间的Max Latency 存在巨大差异。我在此处记录了结果:sachin-mokashi-linux-preempt-rt,以防万一它可能对您有所帮助!

【讨论】:

    【解决方案2】:

    标准的 Linux 内核不提供实时调度。使用RT_Preempt 补丁可以实现一定程度的实时确定性。它仍然需要仔细设计,并且不能替代 RTOS 来满足关键的实时要求。

    【讨论】:

    • 是的,我同意你的看法。让我尝试应用这个补丁并尝试编译我们的 mips 架构
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 2011-08-06
    • 2015-12-29
    • 2013-06-11
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多