PREEMPT_RT 详解:实时内核特性
PREEMPT_RT 将 Linux 内核转换为实时操作系统,确保关键任务的精确计时。它已完全集成到 Linux 6.12(发布于 2024 年 9 月 20 日)中,为 x86、ARM64 和 RISC-V 等架构启用实时功能。以下是您需要了解的内容:
- 主要特点:
- 用可抢占式睡眠锁取代传统的旋锁。.
- 将中断处理程序转换为线程,使其可调度和可抢占。.
- 实现优先级继承以解决优先级倒置问题。.
- 使 RCU(读取-复制-更新)操作完全可抢占。.
- 应用程序:
- 应用于汽车、机器人、电信和医疗器械等对时间精度要求极高的行业。.
- 为工业自动化工具、飞行控制系统和托管环境等系统提供动力 低延迟虚拟专用服务器.
- 设置:
- 使能够
配置预告在内核配置中。. - 微调设置,例如
配置无赫兹全和配置 RCU_BOOST为了达到最佳性能。. - 使用类似工具
循环测试用于测量延迟并验证性能。.
- 使能够
PREEMPT_RT 优先考虑时间而非吞吐量,这使得 Linux 非常适合那些对截止时间没有商量的场景。对于需要确定性性能的行业来说,这无疑是一项颠覆性的变革。.
PREEMPT_RT 核心特性:Linux 如何实现实时性能
PREEMPT_RT详解:构建和优化Linux内核以实现实时和超低延迟
sbb-itb-59e1987
PREEMPT_RT 核心功能
PREEMPT_RT 主要关注四个方面,旨在减少不可抢占代码并提高任务调度的控制。下面将逐一详细介绍。.
完全内核抢占
其中一项最大的更新是改造标准旋锁(自旋锁_t)和读写锁(rwlock_t) 进入 基于互斥锁的休眠自旋锁. 传统的自旋锁会禁用抢占,导致任务进入忙等待状态,从而造成延迟。PREEMPT_RT 通过引入允许任务休眠并被抢占的锁机制改变了这一点,即使任务正在持有资源。.
这意味着高优先级任务可以中断低优先级任务,即使低优先级任务持有锁。但是,对于某些关键操作(例如调度程序或硬件入口点),PREEMPT_RT 保留 raw_spinlock_t, 其行为与最初的不可抢占锁类似。正如杰出工程师保罗·麦肯尼所说:
"PREEMPT_RT 补丁的关键在于最大限度地减少不可抢占的内核代码量,同时最大限度地减少为提供这种额外的抢占功能而必须更改的代码量。"
接下来,我们来看看中断处理如何从这种方法中受益。.
线程中断
PREEMPT_RT 将大多数硬件中断处理程序从"硬 IRQ"上下文转移到 内核线程 在进程上下文中运行。此调整允许对中断处理程序进行优先级排序、抢占甚至阻塞。.
在标准的 Linux 内核中,长时间运行的中断处理程序会导致无限大的延迟,因为它会暂停所有其他程序的执行。线程中断解决了这个问题。默认情况下,这些中断线程以线程模式运行。 SCHED_FIFO 优先级为 50,但管理员可以使用诸如此类的工具来调整优先级。 图表. 例如,您可以优先处理用于工业控制的网络卡中断,同时降低磁盘 I/O 的优先级。由于这些线程使用睡眠自旋锁而不是原始自旋锁,因此无需在持有锁时禁用硬件中断。.
现在,让我们来探讨 PREEMPT_RT 如何处理与优先级相关的挑战。.
优先级继承和 Rtmutex
优先级反转 这是一个主要问题,即高优先级任务会因为等待低优先级任务占用的资源而卡住,而中优先级任务(不需要该资源)却抢占了低优先级任务。PREEMPT_RT 函数通过以下方式解决这个问题: 优先继承, 暂时提高低优先级任务的优先级,使其与等待资源的最高优先级任务的优先级相匹配。.
这 rtmutex 原始机制使这一切成为可能。它确保当发生冲突时,低优先级任务获得优先级提升,从而能够不受中优先级任务干扰地完成其关键部分。如果被提升的任务又被另一个锁阻塞,优先级提升会沿着依赖链向下传递。正如 Linux 内核文档所述:
"优先级继承允许设计良好的应用程序在高优先级线程的关键部分使用用户空间锁,而不会失去确定性。"
为了实现这一目标,, rtmutex 使用标志和优先级排序的树来管理等待的任务,从而在支持的架构上保持较低的开销。.
最后,我们来看看 PREEMPT_RT 如何改进 RCU 操作。.
抢占式 RCU(读取-复制-更新)

读取-复制-更新 (RCU) 是一种在 Linux 内核中广泛使用的同步技术。在标准内核中,RCU 读取段是不可抢占的,这可能导致不可预测的延迟。PREEMPT_RT 通过使 RCU 读取段可抢占来改变这一点。 完全抢占, 确保实时任务的截止时间不受影响。这一调整是实现实时系统所需可预测行为的基石。.
如何配置和使用 PREEMPT_RT
PREEMPT_RT 已完全集成到 Linux 主线内核中,这意味着不再需要外部补丁。但是,为了获得更好的架构支持和图形性能,应用最新的补丁队列仍然是一个好主意。内核准备就绪后,您需要调整其设置以充分利用其功能。.
内核配置设置
要启用完全抢占式内核,请开启 配置预告. 在较新的内核中,此设置位于"常规设置"下,但您可能需要启用它。 配置专家 首先要让它在配置菜单中可见。.
用于生产 专用服务器 以及其他高性能环境,还可以通过其他选项进一步优化性能:
配置无赫兹全减少繁忙 CPU 上的调度时钟中断,从而有助于最大限度地减少抖动。.配置 RCU_BOOST:防止被抢占的 RCU 读取器延迟宽限期。.CONFIG_RCU_NOCB_CPU将 RCU 回调处理卸载到特定 CPU,从而减少对实时任务的干扰。.
禁用可能导致高延迟的调试选项也至关重要。关闭诸如以下设置: 配置调试锁定, 配置调试预插, 配置调试对象, 和 配置 SLUB_DEBUG. 虽然这些工具对开发很有用,但它们可能会严重影响延迟目标。正如 kernelconfig.io 所解释的那样:
"此选项通过将各种锁定原语(自旋锁、读写锁等)替换为可抢占的、感知优先级继承的变体,将内核转换为实时内核。"
内核编译并启动后,运行以下命令确认 PREEMPT_RT 已激活 cat /sys/kernel/realtime. 返回值为 1 表示成功。您还可以通过检查输出中的"PREEMPT_RT"来验证。 uname -a.
调试和性能优化
对内核进行微调对于实现实时工作负载的最佳性能至关重要。需要解决的一个关键领域是: 实时节流机制, 默认情况下,该机制会为非实时任务预留每秒 50 毫秒的时间。如果您的工作负载完全是实时的,您可以通过编写以下代码来禁用此机制: -1 至 /proc/sys/kernel/sched_rt_runtime_us. 正如 OSADL 的高级开源顾问 Jan Altenberg 指出的那样:
"失控的实时任务可能会导致系统资源耗尽。作为一种保护机制,可以通过在 /proc/sys/kernel/sched_rt_runtime_us 中设置以微秒为单位的值来限制实时任务的运行时间。‘
为了提高确定性,可以使用诸如以下参数隔离特定的 CPU 核心: isolcpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, 并设置 irqaffinity=0. 这样就专门将这些核心保留用于实时任务。.
要管理中断线程,请使用 图表 工具。这些线程通常以默认值运行。 SCHED_FIFO 优先级默认为 50,但您可以进行调整以避免与应用程序冲突。例如,要将网卡的 IRQ 线程优先级设置为 98,请使用以下命令: chrt -p -f 98.
配置完成后,测试和验证延迟性能至关重要。诸如此类的工具,例如 循环测试 可以测量延迟(例如,, cyclictest -S -m -p98 -i250), 尽管 rtla (实时 Linux 分析)有助于识别和分析延迟峰值。这些工具可确保您的配置满足实时应用程序的需求。.
PREEMPT_RT 应用和优势
实时应用用例
PREEMPT_RT 在对时间精度要求极高的系统中表现出色。 航天, 它确保导航和飞行控制不会出现微秒级的延迟,否则可能会危及安全。. 电信 企业依靠它来实时管理数据路由,通过消除抖动和延迟峰值来确保流畅的语音和视频通话。.
在 汽车行业, 它是车辆控制系统的基石,包括大陆集团在内的主要厂商都支持其应用。 工业自动化, PREEMPT_RT 为可编程逻辑控制器 (PLC) 和 SCADA 系统提供支持,通常与 EtherCAT 等协议配合使用,以维护工厂车间的安全性和效率。. 机器人技术 此外,该技术还高度依赖精确的执行器控制和即时传感器反馈,使机器人能够立即对环境变化做出反应。.
或许最关键的应用在于 医疗器械, 在精度至关重要的领域,从病人监护仪到手术机器人,PREEMPT_RT 都能提供确定性的性能,确保生命攸关的系统完美运行。.
托管环境的优势
PREEMPT_RT 的优势也延伸到了托管环境,在托管环境中,实时响应同样至关重要。 VPS 和专用服务器, 它通过允许调度器优先处理高优先级任务而非低优先级任务来最大限度地减少延迟。这确保了响应时间的一致性,从而直接影响用户体验和服务可靠性。.
线程中断模型可以防止在繁重的 I/O 操作期间出现"中断风暴",从而避免系统过载。 rt_mutex, 优先级继承机制确保低优先级后台任务不会阻塞关键的托管服务。高分辨率计时器可实现微秒级的调度精度,从而减少虚拟化环境中的抖动。托管服务提供商,例如 服务器, 提供带有 PREEMPT_RT 的自定义内核构建,使管理员能够灵活地针对特定工作负载微调配置。通过使用诸如以下参数: 等距 和 irqaffinity, 提供商可以将 CPU 内核专用于性能关键型任务,同时将日常系统操作隔离。.
结论
本指南深入探讨了如何 PREEMPT_RT 它通过赋予调度器近乎完全的控制权,将 Linux 变成了一个实时操作系统。自从它从 Linux 6.12(2024 年 9 月)开始被纳入主线内核以来,它消除了在 x86、ARM64 和 RISC-V 等架构上进行外部补丁的需求。.
这个概念很简单:尽可能减少不可抢占的代码。通过将自旋锁转换为睡眠锁并将中断处理程序作为线程运行,高优先级任务几乎可以抢占所有内核活动。优先级继承等特性可以防止低优先级任务延迟关键操作,而可抢占的 RCU 则确保即使是读取端的临界区也不会造成显著延迟。 塞巴斯蒂安·西维尔, PREEMPT_RT 的维护者恰如其分地指出:
"所有控制权都交给调度员。"
这项技术飞跃带来了实际的好处。例如,, 服务器 使用自定义 PREEMPT_RT 内核构建来微调 CPU 隔离并优化实时工作负载,即使在强烈的 I/O 压力下也能确保稳定的响应时间。.
实时系统的独特之处不仅在于速度,更在于可预测性。PREEMPT_RT 最大限度地减少了抖动,确保任务在需要时精准执行。这对于工业自动化、电信和对性能要求极高的托管服务等应用至关重要。它带来了标准内核无法提供的确定性行为。.
由于它已集成到主线内核中,并得到了企业发行版的支持,例如 Ubuntu 专业版 自 2023 年 2 月起,PREEMPT_RT 对主机提供商和系统管理员来说变得更加易于使用。它能够提供当今要求最苛刻、对时间要求最严格的环境所需的可靠、低延迟性能。.
常见问题解答
我需要使用 PREEMPT_RT 吗?还是标准的 Linux 就足够了?
标准Linux内核与 PREEMPT_RT 补丁, 它具备实时处理能力,因此对于低延迟和稳定响应时间至关重要的应用来说,它是一个不错的选择。然而,仅凭主线 Linux 内核本身可能无法满足严格的实时性要求。.
PREEMPT_RT 会降低系统的整体吞吐量吗?
为了实现实时性能,, PREEMPT_RT 该方法侧重于减少不可抢占的内核代码,从而提升系统响应速度。虽然这种方法可能会导致整体吞吐量略有下降,但它能确保系统行为的一致性和可预测性——这对于时间敏感型应用至关重要。这种权衡是有意为之,也是满足实时系统需求的核心所在。.
使用 PREEMPT_RT 时,合理的延迟目标是多少?
和 PREEMPT_RT, 对于桌面系统和嵌入式系统而言,实现毫秒级延迟是一个切实可行的目标。然而,实际性能很大程度上取决于系统的配置和调优程度,以及是否能够满足特定需求。正确的设置是确保达到预期响应速度的关键。.