延时分析
正如预期的那样,添加PREEMPT_RT补丁后,在所有压力情况下,最坏情况下产生的系统延迟都显著减少了。这在一些要求最苛刻的类别中尤为明显,在这些类别中,实时内核中的延迟接近不施加负载的工况。在这些相同的测试案例中,主线内核的延迟非常大,是不能被实时系统接受的。最值得注意的是,出现内存溢出错误情况下的延迟非常显著,并且在主线内核的毫秒区域内达到了很好的延迟。但实时内核的情况并非如此,其延迟时间仍与其他类别相当。根据这些测量结果,实时内核的可靠性和确定性在调度延迟方面得到了证实。
实时内核性能优越的最大原因是将自旋锁换为了睡眠锁,这也实现了优先级继承功能。因为内核内部的不可抢占区域由于这种变化而显著地减少了。此外,将大多数中断处理程序线程化,从而以较低的优先级进行调度,这可能会稍微解释实时内核为何能够测量到的更好的延迟。在这种特定的内核配置下,这种变化可能与转换自旋锁的关系不大,原因是启用的中断源并不太多。与其他延迟来源相比,那些需要启用的中断似乎都能很快完成。最后,与主线内核的性能相比,PREEMPT_RT的延迟改进可能并没有那么大。这主要是因为以往由PREEMPT_RT引入的其他重大更改已经合并,因此它们也有利于主线内核。
即使实时内核的表现比主线更好,它仍然有一段连续产生的超过150µs的延迟。基于对内核内部内容的跟踪,我们对这些延迟有了一些深入了解。最长的延迟似乎完全是由计时器中断(始终在硬中断上下文中执行)和偶尔需要的原始自旋锁造成的。延迟直方图中的其他显著峰值表明,也有一些额外的原因导致较小但重要的延迟。然而,通过跟踪来可靠地分析这些是困难的,并且如果仍然出现较长的延迟,则可能没有必要。此外,不同类别之间的一些延迟差异可能可以由硬件特定的问题来解释。例如,对系统要求更高的负载可能会导致额外的缓存丢失,等等。而PREEMPT_RT补丁程序并不能完全解决这一点。
总之,本文的研究结果意义重大,因为本文表明,RISC-V上的PREEMPT_RT补丁无需太多额外工作即可运行。在启用了实时抢占模型后,测量的延迟是完全可预测的,并且通常在实时系统可接受的范围内。此外,在RISC-V体系结构上运行PREEMPT_RT似乎没有任何问题。但是,如果从配置中启用了一些更高级的内核特性,那么当前的RISC-V特定实现可能会出现一些基本问题。至少,如果从内核中启用了更多的特性,延迟性能可能会变得更糟。
尽管在Linux系统上执行精确的测量是具有挑战性的,但得到的测试结果是可复用且合理的。然而,由于中断导致的系统异步,延迟测量总是有一些不确定性。通过运行更长时间的延迟测量,比如长达几天的时间,就可以观察到更精确的结果。不过,较短的测试持续时间仍然可以捕捉到延迟响应的总体变化。所提供结果中可能出现误差的一个实际原因是所使用的PREEMPT_RT补丁版本,因为最接近的版本是6.3内核。这意味着,在这个版本正式发布之前,有可能会添加一些PREEMPT_RT无法正确处理的新特性。然而,这种情况不太可能发生,而且追踪结果表明,在这方面不应该有任何问题。无论如何,使用本文中给出的结果作为一个保守估计是很好的。最后,在系统配置中有可能仍然存在一些疏忽。否则,所有其他误差源都应得到包容,并在测量中予以考虑。