【发布时间】: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