Linux kernel 如何提高调度和中断延迟
如何改善计划程序和中断延迟: 背景:Linux kernel 如何提高调度和中断延迟,linux-kernel,embedded,embedded-linux,Linux Kernel,Embedded,Embedded Linux,如何改善计划程序和中断延迟: 背景: 基于10核mips64处理器的嵌入式系统 9个内核运行SMP linux。内核版本2.6.32.27 我们有实时性能要求的过程,必须在1ms内完成某些任务。在最大负载条件下,可能需要800 US 该进程在接收到GPIO中断(FPGA提供的1ms中断,作为内核驱动程序实现)后开始处理。 在此之前,它将向gpio驱动程序发出icotl调用,并通过唤醒可中断系统调用将其置于睡眠状态 GPIO ISR将在此过程中唤醒 为了防止其他进程占用这个进程的CPU,我们在“
- 基于10核mips64处理器的嵌入式系统
- 9个内核运行SMP linux。内核版本2.6.32.27
- 我们有实时性能要求的过程,必须在1ms内完成某些任务。在最大负载条件下,可能需要800 US
- 该进程在接收到GPIO中断(FPGA提供的1ms中断,作为内核驱动程序实现)后开始处理。 在此之前,它将向gpio驱动程序发出icotl调用,并通过唤醒可中断系统调用将其置于睡眠状态
- GPIO ISR将在此过程中唤醒
- 为了防止其他进程占用这个进程的CPU,我们在“ISOLCPU”内核上运行这个进程
- 我们已将此过程的优先级设置为用户线程中的最高优先级,如下所示: 优先级:80,调度类型:SCHED_FIFO 线程设置优先级(SCHED_FIFO,80)李>
- 所有/proc/sys/kernel/sched_uu参数值都是默认值。我们没有对它们进行微调
- 有时,我们会看到ISR已调用wake_up,但该过程仅在350uS之后安排。 这是一个伟大的时刻,因为我们的处理器运行在1.25GHz。 调度延迟的这个大数字让我们感到困惑,因为我们已经使用“ISOLCPU”专门为这个过程隔离了核心
- 我们分析了连续1ms GPIO ISR调用之间的最大CPU周期计数。此最大时间超过1.5ms。 中断延迟的这个大数字对我们来说太令人担忧了,因为这将消耗进程在1ms边界内进行处理的可用时间
请帮助我们减少中断和调度延迟数的输入标准Linux内核不提供实时调度。使用该补丁可以实现一定程度的实时确定性。它仍然需要仔细的设计,对于关键的实时性要求,它不能替代RTOS。我一直在开发
linux内核4.8抢占rt
,它的rt\u抢占补丁应用于此报告:并且有一些有希望的结果
我通过运行rt benchmark
cyclictests
对preempt-rt
和non-preempt-rt
linux内核进行了基准测试,发现preempt-linux内核的Max-Latency
与使用2025-us
时的非抢占式linux内核
,这可能对您的情况有所帮助
结果显然诱惑我使用prempt-rt内核
,因为两者在Max-Latency
方面存在巨大差异。我在这里记录了结果:,以防对您有所帮助 内核是否启用了CONFIG\u PREEMPT
选项?不清楚:这个进程是在内核空间还是在用户空间?我们还没有启用“配置抢占”选项。我所指的过程是在用户空间中进行的。所以你至少需要启用抢占或应用@Cliffordyes已经解释过的RT补丁,我同意你的看法。让我尝试应用此修补程序并尝试编译我们的mips arch