如何改善调度和中断延迟

时间:2016-12-13 11:18:35

标签: linux-kernel embedded embedded-linux

如何改进调度程序和中断延迟:

背景:

  • 基于10核mips64处理器的嵌入式系统
  • 9核运行SMP linux。内核版本2.6.32.27
  • 我们有实时性能要求的过程,必须在1ms内完成某些任务。在最大负载条件下,可能需要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"
  • 专门为此过程隔离了核心。
  • 我们分析连续1ms GPIO ISR呼叫之间的最大CPU周期数。此最长时间超过1.5毫秒。 中断延迟的这个大数字对我们来说太过关注,因为这将耗尽进程在1ms边界内进行处理的时间。

请帮助我们减少中断和调度延迟数字的输入

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我一直致力于linux kernel 4.8 preempt-rt,其中RT_Preempt patch已应用此回购:linux kernel 4.8 preempt-rt并且有一些有希望的结果!

我通过运行preempt-rt non-preempt-rtlinux kernelsrt-benchmark cyclictests进行了基准测试,并在{{1}的情况下发现Max Latency在使用preempt-rt linux kernel时,61 us2025 us相对应,这可能对你的情况有帮助。

结果显然诱惑我使用non-preempt linux kernel因为prempt-rt kernel之间存在巨大的差异。我在这里记录了结果:sachin-mokashi-linux-preempt-rt,万一它可能对你有所帮助!