2.6 Linux 内核的实时性和性能改进
Linux 内核是任何 Linux 发行版的核心,它不断发展以整合新技术并提高性能、可扩展性和可用性。每个新的内核版本都增加了对新硬件的支持,但内核的主要版本升级,例如 2.6 Linux 内核,超越了渐进式改进,引入了内核内部的 фундаментальные 变化。2.6 Linux 内核内部的许多变化对 Linux 系统的整体性能产生了重大影响,这种影响是全面的,与硬件改进无关。2.6 内核在系统响应速度方面提供了显著改进,显著减少了与进程和线程相关的内核开销,并相应缩短了任务被调度和开始执行之间的时间。
2.6 内核于 2003 年末发布,现在已成为几乎所有主要 Linux 供应商在企业、桌面和嵌入式领域的 Linux 发行版的核心。内核和系统性能对于嵌入式计算等重点市场至关重要,在这些市场中,高优先级任务通常必须实时执行和完成,而不会被系统中断。然而,系统性能和吞吐量总体上对于 Linux 在桌面上的日益普及以及 Linux 在企业服务器市场持续取得成功同样重要。
本文讨论了实时和影响性能的系统参数的性质,并重点介绍了 2.6 内核提供的性能和响应能力方面的核心改进。性能和响应能力仍然是积极的开发领域,本文讨论了几种当前改进 Linux 系统性能和响应能力以及实现实时行为的方法。通过图表化的基准测试结果说明了各种 Linux 内核和项目的内核和任务执行性能,这些结果显示了不同内核版本在同等负载下的行为。
通常可以通过使用更多和更好的硬件资源来实现更高的性能,例如更快的处理器、更大的内存等等。虽然这可能是数据中心的充分解决方案,但对于许多环境而言,这肯定不是正确的方法。特别是嵌入式 Linux 项目对底层硬件的成本非常敏感。同样,将更快的硬件和额外的内存投入到性能和执行问题中只会掩盖问题,直到软件需求增长到超过当前资源为止,届时问题将再次浮出水面。
因此,重要的是通过改进核心操作系统,以与硬件无关的方式在 Linux 系统中实现高性能。本文重点关注此类固有的 Linux 性能指标。
实时系统是一种系统,其正确性不仅取决于执行所需的功能,还取决于满足一组相关的时序约束。实时系统基本上分为两类:软实时和硬实时。硬实时系统是指关键任务必须在特定时间范围内执行,否则整个系统将发生故障的系统。一个经典的例子是计算机控制的汽车点火系统——如果您的气缸没有在完全正确的时间点火,您的汽车将无法工作。软实时系统是指即使错过时限也不会必然导致系统故障的系统;系统可以从暂时的响应能力不足中恢复。
在这两种情况下,实时操作系统都会在已知的、可预测的时间范围内首先执行高优先级任务。这意味着操作系统不能在任务调度、执行和管理中施加过度的开销。如果任务的开销随着任务数量的增加而大幅增加,则总体系统性能会降低,因为任务调度、切换和重新调度需要更多时间。因此,可预测性是实时操作系统的关键概念。如果您无法预测系统在任何给定时间的总体性能,则无法保证任务将在您需要时以可预测的延迟启动或恢复,或者它们将在强制性时间范围内完成。
2.6 Linux 内核引入了一种新的任务调度程序,其执行时间不受要调度的任务数量的影响。这在 big-O 算法表示法中被称为 O(1) 调度程序,其中 O 代表阶数,括号中的数字给出了基于算法中涉及的元素数量的最坏情况性能的上限。O(N) 表示算法的效率取决于所涉及的项目数量,而 O(1) 表示算法的行为,因此在本例中为调度程序的行为在每种情况下都是相同的,并且与调度的项目数量无关。
系统被要求执行任务的点与该任务实际开始执行的时间之间的时间称为延迟。任务执行显然取决于给定任务的优先级,但在假设优先级相等的情况下,操作系统调度和开始执行任务所需的时间取决于系统任务调度程序的开销以及系统正在执行的其他操作。当您通过将任务放入系统的运行队列来调度要执行的任务时,系统会检查该任务的优先级是否高于当前正在运行的任务的优先级。如果是,则内核会中断当前任务并将上下文切换到新任务。在内核中中断当前任务并切换到新任务称为内核抢占。
不幸的是,内核并非总是可以被抢占。操作系统内核通常需要独占访问资源和内部数据结构,以维护其一致性。在旧版本的 Linux 内核中,保证对资源的独占访问通常是通过自旋锁完成的。这意味着内核将进入一个紧密的循环,直到特定资源可用或正在被访问,从而增加内核执行其工作时任何其他任务的延迟。
在最近的几个主要内核版本中,内核抢占的粒度一直在稳步提高。例如,来自嵌入式 Linux 和工具供应商 TimeSys 的 GPL 2.4 Linux 内核提供了更早的低延迟调度程序和完全可抢占的内核。在 2.4 Linux 内核系列期间,Novell/Ximian 的 Robert Love 发布了一个著名的内核补丁,该补丁启用了更高的抢占性,并且可以应用于标准的 Linux 内核源代码。来自 1995 年以来的核心 Linux 内核贡献者 Ingo Molnar 的低延迟补丁等其他补丁进一步扩展了此补丁的功能,从而降低了整个内核的延迟。TimeSys 产品和这些补丁的关键概念是尽可能用互斥锁(互斥机制)替换自旋锁。这些提供了内核所需的资源安全性和完整性,而不会导致内核阻塞和等待。这些补丁开创的核心概念现在是 2.6 Linux 内核的组成部分。
目前有三个 Linux 下实时支持项目正在进行中:RTAI 项目和 FSMLabs 等嵌入式 Linux 供应商的产品使用的双内核方法;MontaVista(一家嵌入式 Linux 供应商)托管的实时 Linux 项目;以及 Ingo Molnar 等人正在进行的免费提供的抢占性和实时工作,这些工作在 Linux 内核邮件列表中公开讨论,MontaVista 项目也依赖于这些工作。除了这些核心内核项目外,其他支持项目,例如健壮的互斥锁和高分辨率计时器,还增加了特定的增强功能,这些功能有助于为 Linux 下的实时应用程序提供完整的解决方案。
用于实时的双内核方法是 Linux 下实时应用程序的一种有趣方法。在这种方法中,系统实际上运行一个小型实时内核(不是 Linux),但它将 Linux 作为其最低优先级的进程运行。专门为非 Linux 内核编写的实时应用程序使用相关的实时应用程序接口在该内核中以高于 Linux 或任何 Linux 应用程序的优先级执行,但它们可以与 Linux 应用程序交换数据。虽然这是一种在运行 Linux 系统的同时运行实时应用程序的技术上有趣的方法,但它避免了一般 Linux 内核抢占和性能改进的问题。因此,从核心 Linux 开发的角度来看,它并没有那么有趣。
MontaVista 进一步开发实时 Linux 的项目借鉴了 Ingo Molar 和其他 Linux 内核贡献者正在进行的许多工作,但它包含一些额外的原型补丁,这些补丁仅在 MontaVista 网站上提供。当前可用的补丁适用于 2.6.9 Linux 内核(rc4)的候选版本。因此,它们不能干净地应用于 Linux 内核的官方版本,而 Linux 内核在撰写本文时正朝着 2.6.11 迈进。因此,本文无法包含该项目的结果。
Ingo Molnar(O(1) Linux 调度程序的作者)和其他人正在进行的实时、调度和抢占性工作具有很大的势头,增强了核心 Linux 内核,并提供了旨在改进系统调度、最大限度地减少延迟并进一步提高抢占性的最新补丁。
这些补丁在 Linux 社区中拥有热情的追随者,并包含来自许多不同团体和组织的开发人员的贡献,包括 Raytheon;TimeSys 等嵌入式 Linux 供应商;以及来自 Linux 音频社区。这些补丁提供了诸如提高系统响应能力和最大限度地减少中断影响等功能,方法是将中断处理分为两个部分:即时硬件响应和一个可调度的中断处理组件。顾名思义,中断是需要系统立即关注的请求。可调度的中断处理,更常见的名称是软 IRQ,最大限度地减少了中断对一般系统响应能力和性能的影响。
下一节中的插图重点比较了各种 vanilla Linux 内核的基准测试结果与应用 Ingo Molnar 等人完成的实时、调度和抢占性补丁获得的基准测试结果。这些补丁是最新的,并提供了完整的核心 Linux 内核增强功能,这些增强功能可以直接为希望将其纳入其项目和产品的 Linux 用户带来好处。
2002 年,Linux Journal 网站发表了一篇题为“可抢占内核补丁的 Realfeel 测试”的文章,作者是 Andrew Webber。这篇文章使用了一个名为 Realfeel 的开放基准测试程序(由 Mark Hahn 编写)来比较标准 Linux 2.4 内核和应用了 Robert Love 的抢占补丁的内核之间的抢占性和响应能力。Realfeel 发出周期性中断,并比较计算机响应这些中断所需的时间以及系统的预计最佳响应时间。中断请求发出时间和处理时间之间的差异是延迟的一个示例,预测延迟和实际延迟之间的差异称为抖动。抖动通常用作衡量和比较系统响应能力的一种方法。
本文使用了与 Webber 的文章相同的基准测试应用程序,但在测量结果时对系统施加了更大的负载。这是一种在对实时操作系统进行基准测试时常用的技术,因为即使是非实时操作系统也可能在未加载或轻负载情况下表现出低延迟。下一节中的图形也以不同的方式呈现结果,以便更容易地可视化和比较各种 Linux 内核上的延迟之间的差异。
本节中的结果是使用中等强度的奔腾级系统编译的,该系统具有单个 1.7GHz AMD Athlon 处理器和 512MB 系统内存。该系统运行 GNOME 桌面环境和与 Fedora Core 3 Linux 发行版相关的系统进程,并使用了截至 2004 年 2 月 10 日的最新补丁。测试的系统内核是 vanilla 2.6.10 Linux 内核、作为 Fedora Core 3 更新提供的 2.6.10-1.760_FC3 内核、vanilla 2.6.11-rc3 内核和带有 Ingo Molnar 当前实时和抢占补丁的 2.6.11-rc3 内核。所有这些内核都是针对相同的内核配置文件编译的,模数是较新内核源代码中引入的新配置选项。
在诸如 Linux 等多处理操作系统中,系统永远不会处于休眠状态。诸如调度程序之类的系统进程始终在运行。如果您正在使用图形用户界面 (GUI),则诸如 KDE、GNOME 或标准 X Window 系统窗口管理器之类的界面始终在等待输入事件等等。为了检查真正的抢占性和实时性能,在收集每组基准测试结果的同时,通过启动各种进程对系统施加了额外的负载。如前所述,系统正在运行 GNOME,并打开了四个 xterm 终端 - 一个运行 realfeel 基准测试,另一个运行一个脚本,该脚本在系统根分区上不断运行递归的 find 和 ls 进程,还有两个终端用于从干净状态编译 2.6.x Linux 内核(具有单独的源目录)。
图 1 显示了在标准 Fedora Core 系统上运行一分钟的 Realfeel 基准测试结果图。该系统正在运行内核版本 2.6.10-1.760_FC3,这是一个 2.6.10 内核,应用了 Red Hat 的各种补丁和增强功能。图中的每个点代表中断请求与其处理之间的抖动。X 轴是以 1/60 秒为单位的采样时间。当系统对中断的响应速度快于预计的标准时间时,会显示负抖动数字。从图中可以看出,相当多的中断请求已按预期完全处理,从而在 Y 轴的 0 值处形成了一条清晰可见的黑线。
图 2 显示了在同一系统上运行 vanilla 2.6.11rc3 内核的 Realfeel 基准测试结果图,这是即将发布的 2.6.11 内核的候选版本 3。这些结果也是在一分钟内收集的。从这些结果可以看出,2.6.11-rc3 内核比 FC3 内核提供了改进的结果,在许多情况下,中断请求与其处理之间的抖动为零。
图 3 显示了在同一系统上运行 2.6.11rc3 内核(应用了 Info Molnar 的实时/抢占补丁)的 Realfeel 基准测试结果图。这些结果也是在一分钟内收集的,负载生成器与之前相同。从这些结果可以看出,实时/抢占补丁提供了令人印象深刻的更好抖动结果,与在预期时间段内处理中断的偏差相对较少。在目标系统上,这些改进转化为响应速度更快的系统,在该系统上,对程序执行的期望比运行 vanilla FC3 或标准 2.6.11-rc3 内核时更可预测。
2.6 Linux 内核中改进的调度、SMP 和可扩展性改进提供了比以往更高的性能 Linux 系统,使其能够更好地利用系统资源并更可预测地执行系统请求的内核和用户任务。可以进行进一步的改进,但目前只能通过手动修补系统或从 TimeSys 等供应商处获取 Linux 发行版来获得,TimeSys 已经整合并测试了这些高性能补丁。
GNU/Linux 作为免费、开源内核和健壮的执行环境的存在本身就是一项奇迹。个人以及最近的公司为提高其性能所做的贡献将带来更加光明的未来。这些以及 Linux 的其他改进证明并有助于保证 Linux 被采用为嵌入式、服务器和桌面应用程序的首选操作系统。
本文的资源: /article/8199。
William von Hagen 是 TimeSys Corporation 的高级产品经理,TimeSys Corporation 是一家领先的嵌入式 Linux 和工具供应商。他撰写了许多关于各种 Linux 和通用计算主题的书籍和文章。