历经 20 年,Linux 史诗级补丁 PREEMPT_RT 并入主线内核 | 编译安装测试

斐夷所非 2024-10-12 10:37:02 阅读 79

历经 20 年,实时 Linux 正式并入内核主线~

Steven V N 最后一个 bug 2024 年 09 月 20 日 19:32 广东

多年来,在实时 Linux 上所做的工作使开源操作系统受益匪浅,但直到本周,Linus Torvalds 才将其最后一部分纳入主流内核。到底是什么花了这么长时间?

原文:

20 years later, real-time Linux makes it to the kernel - really | ZDNET

steven-vaughan-nichols

Written by Steven Vaughan-Nichols, Senior Contributing Editor

Sept. 18, 2024 at 10:09 a.m. PT

https://www.zdnet.com/article/20-years-later-real-time-linux-makes-it-to-the-kernel-really/

作者: 资深特约编辑 Steven Vaughan Nichols

太平洋时间 2024 年 9 月 18 日早上 10:09

 

~

 

图片

高级实时 Linux 开发人员 Steven Rosedt 和 Steven Vaughan Nichols 在维也纳举行的 Linux 欧洲峰会上合影 —sjvn/ZDNET

维也纳 ——20 年后,实时 Linux(PREEMPT_RT)终于 —— 终于 —— 进入了主流内核。Linus Torvalds 在欧洲开源峰会上为代码祈福。为什么这是一件大事?让我们从解释实时操作系统(RTOS)是什么以及它有什么好处开始。

1. RTOS

RTOS 是一种专门的操作系统,旨在精确可靠地处理时间关键任务。与 Windows 或 macOS 等通用操作系统不同,RTOS 的构建是为了在严格的时间限制内响应事件和处理数据,通常以毫秒或微秒为单位。正如著名的实时 Linux 开发人员和谷歌工程师 Steven Rosedt 所说,“** 实时是最快的最坏情况 **(Real-time is the fastest worst-case scenario.)。”

他的意思是 RTOS 的本质特征是它的确定性行为。RTOS 保证关键任务将在指定的截止日期内完成。许多人认为 RTOS 是用于快速流程的。他们不是。** 速度不是 RTOS 的重点,可靠性才是。** 这种可预测性在计时至关重要的应用中至关重要,如工业控制系统、医疗设备和航空航天设备。

目前使用的实时操作系统的一个例子是 VxWorks,它被用于美国国家航空航天局的火星探测车,以引导它们,并被用于波音 787 梦想飞机,以控制航空电子系统,确保飞行控制的实时响应性。另一个例子是 QNX Neutrino,它广泛应用于汽车的信息娱乐和高级驾驶员辅助系统,如防抱死制动器。

2. 实时 Linux 的历史

从即将推出的 Linux 6.12 内核开始,所有发行版都将包含实时 Linux 代码。这意味着 Linux 将很快开始运行在更多的任务关键设备和工业硬件上。这标志着它经历了很长时间的发展才走到今天这一步。

实时 Linux 的故事始于 20 世纪 90 年代末,当时对 Linux 支持实时应用程序的需求日益增长。最初的工作重点是创建与 Linux 内核一起运行的独立实时内核。这包括堪萨斯大学的 KURT 等学术项目;来自米兰大学 RTAI;以及新墨西哥矿业与技术学院的 RTLinux。

Linux 内核高级开发人员 Ingo Molnar 于 2004 年开始收集和重塑这些技术,为实时抢占补丁集 PREEMPT_RT 奠定基础。

这种方法与早期的实时 Linux 解决方案不同,因为它修改了现有的 Linux 内核,而不是创建一个单独的实时内核。到 2006 年,它已经获得了足够的吸引力,Linus Torvalds 观察到,“用 Linux 控制激光器是疯狂的,但这个房间里的每个人都以自己的方式疯狂。所以如果你想用 Linux 来控制工业焊接激光器,我不反对你使用 PREEMPT_RT。”

到 2009 年,包括 Thomas Gleixner、Peter Ziljstra 和 Rosedt 在内的一个内核开发小组已经完成了将之前的原型开发整合到一个单独的树外补丁集中的工作。就在那时,许多公司开始使用这个补丁集来构建需要毫秒精度的硬实时特性的工业系统。

随着项目的推进,它的许多元素都转移到了内核中。Rosedt 告诉我,在某种程度上,说实时性现在才出现在 Linux 中是错误的。多年来,它的许多功能已被引入主流 Linux。事实上,其中一些对于你每天使用的 Linux 来说是必不可少的。

例如,您可能从未听说过 “NO_HZ”,它可以降低空闲系统的功耗。NO_HZ 使 Linux 能够在具有数千个 CPU 的机器上高效运行。Rostedt 强调:“你没有意识到 Linux 因为实时补丁而得到了多大的改进。”。“Linux 今天在数据中心运行的唯一原因是我们所做的工作。”

因此,如果没有 NO_HZ,Linux 就不会在所有的数据中心中运行。这反过来解释了为什么 Linux 运行云端。我不知道如果没有这种实时贡献,世界会是什么样子,但它肯定不会像今天这样。

实时 Linux 也以一开始无人想到的方式被证明是有用的。Rostedt 回忆道:“早在 2005 年,我收到了一个实时 bug 报告,我发送了一个补丁并说,‘嘿,这是修复程序。你能应用它吗?” 那家伙说,‘我不知道我在做什么。’我回答说,‘等等,你不是内核开发者吗?’他回答说:‘我是个吉他手。’“

原来他使用的是早期的实时补丁,因为他使用的是 JACK,一种用于低延迟音频连接的声音服务器。他使用它是因为,像大多数音乐家一样,他太穷了,买不起高端设备,所以,Rostedt 继续说,“他买了一台便宜的笔记本电脑,装了 Linux 和 JACK,因为有了实时补丁,它就能很好地录音,而不是在写入硬盘时跳过。”

事实证明,许多音乐家都是早期的实时 Linux 用户,因为它可以让他们以低廉的价格制作高质量的录音。谁知道呢?这些年来进入主流内核的其他实时 Linux 特性包括:

互斥锁的引入Ftrace,可以说是最重要的 Linux 调试工具用户空间应用程序的优先级继承

3. 为什么实时 Linux 花了这么长时间?

那么,为什么实时 Linux 现在只在内核中得到完全的支持呢?Rostedt 解释说:” 事实上,除非我们认为它已经准备好了,否则我们不会把它推上去。“” 几乎所有内容在进入主流之前都要重写至少三次,因为我们对内容的要求太高了。“

此外,通往主线的道路不仅仅是技术挑战。政治和认知也发挥了作用。Rostedt 回忆道:“一开始,我们甚至不能提到实时。”。“每个人都说,‘哦,我们不在乎实时性。’”

另一个问题是钱。多年来,实时 Linux 的资金一直不稳定。2015 年,Linux 基金会建立了实时 Linux (RTL) 协作项目,以协调围绕 PREEMPT_RT 主线的工作。

完全集成的最后一个障碍是重新编写内核的 print_k 函数,这是一个可以追溯到 1991 年的关键调试工具。Torvalds 特别保护 printk —— 他编写了原始代码,并仍将其用于调试。然而,每当调用 printk 时,它也会在 Linux 程序中产生硬延迟。这种减速在实时系统中是不可接受的。

Rosedt 解释说:“printk 有一千种技巧来处理一千种不同的情况。每当我们修改 printk 时,它都会破坏其中一种情况。printk 调试的好处在于,你可以精确地知道进程崩溃时的位置。当我非常努力地测试系统时,延迟通常在 30 微秒左右,然后突然增加到 5 毫秒。” 这种延迟正是 printk 消息造成的。

经过大量的工作、多次激烈的讨论和几项被拒绝的提案,今年早些时候终于达成了妥协。Torvalds 很高兴,实时 Linux 开发人员也很高兴,printk 用户同样感到满意。最终,实时 Linux 成为了现实。

经过二十年的发展,Linux 实时补丁终于被合并到主流内核中。这一里程碑标志着内核开发人员多年来为 Linux 带来确定性、低延迟性能的工作达到了顶峰。

有了这一补丁,Linux 内核实现了完全可抢占,这使它能够在微秒内对事件做出响应。这种能力对于需要精确计时的应用至关重要,例如工业控制系统、机器人和音频制作。

随着实时补丁的合并,Linux 现在有望成为实时操作系统(RTOS)领域的重要参与者。这不仅是实时制造商的胜利,也是所有 Linux 用户的胜利。


历经 20 年,实时 Linux 正式并入内核主线~Steven V N 最后一个 bug 2024 年 09 月 20 日 19:32 广东

https://mp.weixin.qq.com/s/PLlmGIjhe9KR7YngehVKAg


Linux 实时补丁 (PREEMPT_RT)的“前世今生”

Ubuntu 实时内核应用了树外 PREEMPT_RT 补丁的 Linux 内核构建,专门为 x86_64 和 AArch64 硬件提供。Canonical 希望通过它进一步支持 Ubuntu 在电信 / 5G 设备和其他具有低延迟要求的工业系统中的使用,为关键基础设施提供性能、有保证的超低延迟和安全性。这个新内核还服务于工业自动化和机器人技术中对延迟敏感的用例。

Linux 实时补丁 (PREEMPT_RT) 已经推出多年,并已进入内核主线。去年英特尔收购 Linutronix 后成为 PREEMPT_RT 补丁集背后的开发商,而 Ubuntu 实时内核的打包工作正是与英特尔合作完成的 —— 毕竟两者存在共同利益,可确保构建在英特尔平台上运行良好。

Ubuntu 的实时内核 (Real-Time Kernel) 接近 GA 状态 - OSCHINA - 中文开源技术交流社区 来源: OSCHINA 编辑: 局 2023-01-12 08:27:14

https://www.oschina.net/news/224678/ubuntu-rt-kernel-ga-coming

Canonical 发布实时内核 (Real-time) 版 Ubuntu 24.04 LTS - OSCHINA - 中文开源技术交流社区 来源: OSCHINA 编辑: 局 2024-05-31 10:19:00

https://www.oschina.net/news/295109/ubuntu-24-04-real-time

Linux 主线内核已合并史诗级补丁 ‘PREEMPT_RT’ - OSCHINA - 中文开源技术交流社区 编辑:局 2024-09-20 11:52:00

https://www.oschina.net/news/312719/real-time-linux-merged-into-kernel-mainline


深入实时 Linux

作者: Eric Brown 译者: LCTT geekpi | 2017-07-18 12:52

实时 Linux 在过去十年中已经走了很长的路。Linutronix 的 Jan Altenberg 提供了对该主题做了概述,并在 ELC Europe 的视频中提供了新的 RTL 性能基准。

实时 Linux(RTL)是一种启用 PREEMPT_RT 的主线 Linux,在过去十年中已经走了很长的路。大约 80% 的确定性的 PREEMPT_RT 补丁现在可用于主线内核本身。然而,Linux 上单内核 RTL 的最强大的替代品——双内核 Xenomai——继续声称在减少延迟上有巨大的优势。在 2016 年 10 月的 欧洲嵌入式 Linux 会议的演讲中,Jan Altenberg 反驳了这些声明,同时对实时主题做了论述。

德国嵌入式开发公司 Linutronix 的 Altenberg 并不否认 Xenomai 和 RTAI 等双核方法提供较低的延迟。然而,他揭示了新的 Linutronix 基准,旨在表明差异不如所声称的那样大,特别是在实际使用中。争议较少的是,他认为 RTL 更易于开发和维护。

在我们深入永恒的 Xenomai 与 RTL 的辩论之前,请注意,2015 年 10 月,开源自动化开发实验室(OSADL)将 RTL 项目的控制权转移给了管理 Linux.com 的 Linux 基金会。此外,Linutronix 是 RTL 项目的主要贡献者,并承担了 x86 的维护者。

RTL 的进步是过去十年中 Linux 从实时操作系统(RTOS)中获得市场占有率的几个原因之一。实时操作系统在微控制器上比应用处理器上更频繁出现,并且在缺乏高级用户级操作系统(如 Linux)的单用途设备上实现实时很简单。

Altenberg 通过清除关于实时确定性的内核方案的一些常见的误解开始他的演讲。Altenberg 告诉他的 ELCE 观众:“实时不是快速执行,这基本上是决定论和定时保证。实时为你提供保证某些内容将在给定的时间内执行。你不想要尽可能快,但是要尽快指定。”

在给定的执行时间内的迟缓的反应会导致严重后果,特别是当它可能导致人们受到伤害时,开发人员往往会使用实时的方式。这就是为什么实时性仍然在很大程度上受到工厂自动化行业的推动,并且越来越多地出现在汽车、火车和飞机上。然而,并不总是生死攸关的情况 - 金融服务公司使用 RTL 进行高频交易。

Altenberg 说:“实时需求包括确定性的定时行为、抢占、优先级继承和优先级上限。最重要的要求是高优先级任务总是需要能够抢占低优先级的任务。”

Altenberg 强烈建议不要使用术语“软实时”来描述轻量级实时解决方案。“你可以是确定性的或者不是,但两者之间什么也没有。”

双内核实时

像 Xenomai 和 RTAI 这样的双内核方案部署了一个与单独的 Linux 内核并行运行的微内核,而像 RTL 这样的单内核方案使得 Linux 本身能够实时运行。Altenberg 说:“使用双内核,当优先级实时程序不在微内核上运行时,Linux 可以获得一些运行时间。 “问题是人们需要维护微内核并在新的硬件上支持它。这需要巨大的努力,并且它的开发社区不是很大。另外,由于 Linux 不直接在硬件上运行,所以你需要一个硬件抽象层(HAL)。有两件事要维护,你通常会落后主流内核一步。”

img

双调度器架构

Altenberg说:“RTL 的挑战以及花了这么久才出现的原因是,要使 Linux 实时,你基本要修改每个内核文件。” 然而,大部分工作已经完成并合并到主线,开发人员并不需要维护一个微内核或 HAL

Altenberg 继续解释了 RTAI 和 Xenomai 之间的差异。“使用 RTAI,你将编写一个由微内核调度的内核模块。这就像内核开发 - 真的很难深入,很难调试。”

RTAI 的开发可能会更加复杂,因为工业用户通常希望包括封闭的源代码以及 GPL 内核代码。 Altenberg 说:“你必须决定哪些部分可以进入用户态,哪些部分可以通过实时的方式进入内核。”

RTAI 与 RTL 想必支持更少的硬件平台,特别是 x86 之外。双内核 Xenomai 将 RTAI 作为主要的双内核方式,比 RTAI 具有更大的操作系统支持。更重要的是,Altenberg 说:“它提供了“在用户空间中进行实时的合适解决方案。要做到这一点,他们实现了皮肤的概念 - 一个用于不同 RTOS 的 API 的仿真层,比如 POSIX。这使你可以重用一些 RTOS 中的现有代码的子集。”

然而,使用 Xenomai,你仍然需要维护一个单独的微内核和 HAL。有限的开发工具是另一个问题。Altenberg说:“与 RTAI 一样,你不能使用标准的 C 库。你需要专门的工具和库。即使对于 POSIX 来说,你也必须链接到 POSIX 层,这更复杂。” 他补充说,任何一个平台,很难将超过 8 到 16 个 CPU 的微内核扩展到金融服务中使用的大型服务器集群。

睡眠自旋锁

主要的单内核解决方案是基于 PREEMPT.RT 的 RTL,它主要由 Thomas Gleixner 和 IngoMolnár 在十多年前开发。PREEMPT.RT 重新生成内核的 “spinlock” 锁定原语,以最大化 Linux 内核中的可抢占部分。(PREEMPT.RT 最初称为睡眠自旋锁补丁)

PREEMPT.RT 不是在硬中断环境中运行中断处理程序,而是在内核线程中运行它们。Altenberg 说:“当一个中断到达时,你不会运行中断处理程序代码。你只是唤醒相应的内核线程,它运行处理程序。这有两个优点:内核线程可以中断,并且它会显示在进程列表中,有自己的 PID。所以你可以把低优先级的放在不重要的中断上,高优先级的放在重要的用户态任务上。”

由于大约 80% 的 PREEMPT.RT 已经在主线上,任何 Linux 开发人员都可以使用面向 PREEMPT.RT 的内核组件,如定时器、中断处理程序、跟踪基础架构和优先级继承。Altenberg说:“当他们制作实时 Linux 时,一切都变得可以抢占,所以我们发现了很多竞争条件和锁定问题。我们修复了这些,并把它们推送到主线,以提高 Linux 的稳定性。”

因为 RTL 主要在 Linux 主线上,Altenberg 说:“PREEMPT.RT 被广泛接受,拥有庞大的社区。如果你编写一个实时应用程序,你不需要知道很多关于 PREEMPT.RT 的知识。你不需要任何特殊的库或 API,只需要标准的 C 库、Linux 驱动程序和 POSIX 程序。”

你仍然需要运行一个补丁来使用 PREEMPT.RT,它每隔两个 Linux 版本更新一次。然而,在两年内,剩下的 20% 的 PREEMPT.RT 应该会进入 Linux,所以你就“不再需要补丁”了。

最后,Altenberg 透露了他的 Xenomai 对 RTL 延迟测试的结果。Altenberg说:“有很多论文声称 Xenomai 和 RTAI 的延迟比 PREEMPT.RT 更小。但是我认为大部分时候是 PREEMPT.RT 配置不好的问题。所以我们带来了一个 Xenomai 专家和一个 PREEMPT.RT 专家,让他们配置自己的平台。”

Altenberg 称,虽然 Xenomai 在大多数测试中表现更好,并且有更少的性能抖动,但是差异不如一些 Xenomai 拥护者声称的高达 300% 至 400% 的延迟优势。当用户空间任务执行测试时,Altenberg 说这是最现实的、最重要的是测试,最糟糕的情况下 Xenomai 和 RTL/PREEMPT.RT 都是 90 到 95 微秒的反应时间。

当他们在双 Cortex-A9 系统中隔离单个 CPU 来处理中断时,Altenberg 表示这相当普遍,PREEMPT.RT 执行得更好,大约 80 微秒。

Altenberg 承认与 OSADL 的两到三年测试相比,他的 12 小时测试是最低标准,而且它不是一个“数学证明”。无论如何,考虑到 RTL 更简单的开发流程,它都值得一试。他总结说:“在我看来,将完整功能的 Linux 系统与微内核进行比较是不公平的。”


via:

Inside Real-Time Linux

https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-time-linux

作者:ERIC BROWN 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


注:2022 年教程。

实时 Linux内核(PREEMPT_RT)的编译安装以及测试

路边闲人2 已于 2022-11-20 22:18:55 修改

1. 什么是实时性操作系统?

什么是实时操作系统?_什么是实时系统-CSDN博客 天星小苑 于 2016-12-24 17:41:26

https://blog.csdn.net/ywx123_/article/details/53861274

实时性是指调度的时候,任务响应时间。windows一般是15ms,最大的问题是不能保证。比如平均值是1ms,但是随着系统负载的变化,有时甚至达到100ms,在这工业上是无法使用的。工业上一些应用要求必须有更高的时间精度,比如,一个电力监测系统必须在10ms内运行一次任务对电力运行状况进行监测,一旦时间不准,调度不到该程序运行,则无法保证对电力故障的及时响应。

实时操作系统相关论文:

Performance Comparison of RTOS

http://www.cs.columbia.edu/~sedwards/classes/2001/w4995-02/reports/shamil-kalpen.pdf

Performance Comparison of VxWorks, Linux, RTAI and Xenomai in a Hard Real-time Application

https://www.researchgate.net/publication/3151063_Performance_Comparison_of_VxWorks_Linux_RTAI_and_Xenomai_in_a_Hard_Real-time_Application

Performance Comparison of Real-Time and General-Purpose Operating Systems in Parallel Physical Simulation with High Computational Cost

https://www.researchgate.net/publication/273759417_Performance_Comparison_of_Real-Time_and_General-Purpose_Operating_Systems_in_Parallel_Physical_Simulation_with_High_Computational_Cost

https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.9705&rep=rep1&type=pdf

2. 怎么实现实时性系统?

Linux实现强实时性的需求与方法_系统负载高实时性强-CSDN博客 阿基米东 于 2016-09-09 11:25:39 发布

https://blog.csdn.net/lu_embedded/article/details/52485527

3. PREEMPT_RT

PREEMPT_RT是Linux内核的一个实时补丁。得到Linus的高度评价:

Controlling a laser with Linux is crazy, but everyone in this room is crazy in his own way. So if you want to use Linux to control an industrial welding laser, I have no problem with your using PREEMPT_RT." – Linus Torvalds

项目主页:

https://rt.wiki.kernel.org/index.php/Main_Page

官方说明可以参考:

https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup

4. 编译内核方法

4.1 下载 linux 内核源码

网址:

https://mirrors.edge.kernel.org/pub/linux/kernel/

国内镜像网址:

http://mirror.bjtu.edu.cn/kernel/linux/kernel/

http://mirror.tuna.tsinghua.edu.cn/kernel/

4.2 下载 RT patch

patch在https://rt.wiki.kernel.org/index.php/Main_Page 下载,点击某个版本,可能有点旧,进到链接里面后,选版本号新的就可以了,与linux内核的版本号一定要一样。

更多下载地址:

https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/

img

4.3 编译内核方法

1.解压内核源码

2.打patch

3.编译linux内核并安装

<code>tar xzvf linux-4.4.138.tar.gz

cd linux-4.4.138

patch -p1 < ../patch-4.4.138-rt65.patch

make menuconfig需要安装这个libncurses-dev模块

编译内核需要libssl-dev模块

sudo apt-get install libncurses-dev bison flex bc libelf-dev

sudo apt-get install libssl-dev

配置linux内核

#据说下载包里自带的.config文件可能导致打补丁失败,另一种办法是将原linux系统中的.config文件拷贝到内核文件夹,这样编译出来的内核与本机兼容性更好

cp /boot/config-4.15.18 ./

make menuconfig

选择Processor type and feature —> Fully Preemptible Kernel (RT)这个选项,具体路径如下图。保存。(2021.3.10更新,内核5.0以上的不是这样的路径?)

img

img

img

编译内核,再安装,更新grub.

编译时加上 INSTALL_MOD_STRIP=1 可以生成没有调试信息的模块,大大减小内核的大小。

<code>// 编译

make -j2

// 如果直接安装到本机上,直接make install 即可

// make install 会自动执行 update-grub2

sudo make install -j

几个可选的命令和参数:

// make modules_install 用于安装/lib/modules目录下的驱动, 安装的模块可能含有调试信息,文件非常大,可以使用INSTALL_MOD_STRIP选项去除调试信息

sudo make INSTALL_MOD_STRIP=1 modules_install

如果不希望将内核安装到本机,比如将内核放到某个目录,然后复制到另一台机器上,用 INSTALL_MOD_PATH指定modules安装目录, INSTALL_PATH 指定内核安装路径:

make INSTALL_MOD_PATH=~/work/linux/bin modules_install

make INSTALL_PATH=~/work/linux/bin/boot install

// 对于嵌入式板子还需要安装dtbs,用INSTALL_DTBS_PATH指定安装的路径。x86上不需要dtbs

make INSTALL_DTBS_PATH=~/work/linux/bin dtbs_install

重启后会多一个 linux-4.4.138-rt 的启动选项。

如果要在grub界面停一下,选择内核,需要修改/etc/default/grub文件

\# 注释掉下面这行将会显示引导菜单

\#GRUB_TIMEOUT_STYLE=hidden

GRUB_TIMEOUT=5

5. cyclictest 测试实时性

可参考以下网页:

cyclictest 测试以及原理浅谈_cyclictest: invalid option – 'n-CSDN博客 i龙家小少 于 2013-11-23 15:58:46 发布

https://blog.csdn.net/longerzone/article/details/16897655

编译 RT-tests进行Linux实时性测试-CSDN博客 kunlin_cc 于 2017-11-17 13:39:37 发布

https://blog.csdn.net/kl1125290220/article/details/78560220

实时性测试:cyclictest详解 - 知乎 作者:Yann Xu 编辑于 2020-12-19 17:01

https://zhuanlan.zhihu.com/p/336381111

sudo apt-get install rt-tests

安装 rt-tests 运行 cyclictest 程序进行实时性测试:

sudo cyclictest -t 5 -p 80 -n

注释: 运行五个线程,线程优先级为80,无限循环

cyclictest运行结果详解

T: 0 序号为0的线程

P: 0 线程优先级为0

C: 9397 计数器。线程的时间间隔每达到一次,计数器加1

I: 1000 时间间隔为1000微秒(us)

Min: 最小延时(us)

Act: 最近一次的延时(us)

Avg: 平均延时(us)

Max: 最大延时(us)

测试结果示例:

1.实体机测试结果

# /dev/cpu_dma_latency set to 0us

policy: fifo: loadavg: 0.13 0.06 0.02 1/244 19255

T: 0 (18989) P:80 I:1000 C: 155947 Min: 1 Act: 1 Avg: 1 Max: 17

T: 1 (18990) P:80 I:1500 C: 103964 Min: 1 Act: 1 Avg: 1 Max: 15

T: 2 (18991) P:80 I:2000 C: 77973 Min: 1 Act: 1 Avg: 1 Max: 7

T: 3 (18992) P:80 I:2500 C: 62378 Min: 1 Act: 1 Avg: 1 Max: 10

T: 4 (18993) P:80 I:3000 C: 51982 Min: 1 Act: 1 Avg: 1 Max: 7

2.虚拟机测试结果

在虚拟机中效果一般,受主机的限制太大。

my@ubuntu:~/rt/linux-4.4.138$ sudo cyclictest -p 80 -t5 -n

# /dev/cpu_dma_latency set to 0us

policy: fifo: loadavg: 0.69 0.19 0.07 1/726 5825

T: 0 ( 5821) P:80 I:1000 C: 8168 Min: 7 Act: 445 Avg: 327 Max: 7005

T: 1 ( 5822) P:80 I:1500 C: 5455 Min: 7 Act: 411 Avg: 319 Max: 7516

T: 2 ( 5823) P:80 I:2000 C: 4098 Min: 14 Act: 174 Avg: 320 Max: 2362

T: 3 ( 5824) P:80 I:2500 C: 3275 Min: 5 Act: 52 Avg: 319 Max: 6940

T: 4 ( 5825) P:80 I:3000 C: 2732 Min: 8 Act: 214 Avg: 299 Max: 5198

3.也可以进行多次运行并统计结果

sudo cyclictest -l10000000 -m -n -t1 -p99 -i2000 -h100

-l10000000 :指定1千万循环,

-m :锁定当前和将来的内存分配,

-n :指定使用 clock_nanosleep,

-t1 :指定开一个线程进行测试,

-p99 :指定最高优先级,

-i2000 :指定基本线程间隔,单位是us,

-h100 :指定统计结果的分布情况。

程序执行结束后,输出显示平均延时1 us,最大延时15 us,通过直方分布图察看,大多集中在1-7 us以内。

# /dev/cpu_dma_latency set to 0us

policy: fifo: loadavg: 0.36 0.33 0.28 1/246 32690

T: 0 (32688) P:99 I:2000 C:10000000 Min: 0 Act: 2 Avg: 1 Max: 15

# Histogram

000000 000051

000001 6635143

000002 3352561

000003 008966

000004 002414

000005 000648

000006 000180

000007 000025

000008 000002

000009 000001

000010 000000

000011 000000

000012 000001

000013 000001

000014 000006

000015 000001

…………(中间都是0,省略)

000097 000000

000098 000000

000099 000000

# Total: 010000000

# Min Latencies: 00000

# Avg Latencies: 00001

# Max Latencies: 00009

# Histogram Overflows: 00000

# Histogram Overflow at cycle number:

# Thread 0:

6.总结

实时性补丁能够较好地满足我们的需求(1ms),实现较强的实时性。

7.无需动手编译,直接安装预编译内核的方法

ubuntu 和centos 都提供了预编译的prempt 内核, 只是ubuntu的是lowlatency 低延时内核,centos的是rt kernel最高级实时

7.1 ubuntu 安装低延时内核

参考

https://linuxmusicians.com/viewtopic.php?t=18536

apt-get install linux-lowlatency

7.2 centos 安装预编译的实时内核

Installing RHEL 8 for Real Time | Red Hat Product Documentation

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_real_time/8/html-single/installing_rhel_8_for_real_time/index

参考

Install a real-time kernel on CentOS - Unix & Linux Stack Exchange 2017

https://unix.stackexchange.com/questions/341933/install-a-real-time-kernel-on-centos

sudo tee /etc/yum.repos.d/CentOS-rt.repo >/dev/null <<EOF

# CentOS-rt.repo

[rt]

name=CentOS-7 - rt

baseurl=http://mirror.centos.org/centos/\$releasever/rt/\$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

EOF

sudo yum update -y

sudo yum install -y kernel-rt rt-tests tuned-profiles-realtime

sudo reboot

8 查看内核当前的实时性信息

首先是用 uname -an 查询内核信息,本例中可以看到PREEMPT,但这不是最高的实时性。

PREEMPT_RT才是最高的实时性。

ubuntu@ubuntu:~$ uname -an

Linux ubuntu 5.4.0-1045-raspi #49-Ubuntu SMP PREEMPT Wed Sep 29 17:49:16 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

也可以通过查看当前内核的配置文件,一般在/boot目录下,或/proc目录下

/boot/config-***

/proc/config.gz

查找以下的字符串,不同的字符串有不同的含义:

PREEMPT_NONE

bool "No Forced Preemption (Server)"

PREEMPT_VOLUNTARY

bool "Voluntary Kernel Preemption (Desktop)"

PREEMPT

bool "Preemptible Kernel (Low-Latency Desktop)"

PREEMPT_RT

bool "Fully Preemptible Kernel (Real-Time)"

9 关于 PREEMPT 的理论方面的介绍

A realtime preemption overview [LWN.net]

https://lwn.net/Articles/146861/

realtime:documentation:technical_details:start [Wiki]

https://wiki.linuxfoundation.org/realtime/documentation/technical_details/start

Latency Comparisons for Linux-RT - Real_Time_Linux_Scheduling_Performance_Comparison

https://elinux.org/images/d/de/Real_Time_Linux_Scheduling_Performance_Comparison.pdf

用到的命令行

mkdir -p /usr/src/kernels

cd /usr/src/kernels

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.47.tar.xz

wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patch-4.9.47-rt37.patch.xz

tar xf linux-4.9.47.tar.xz

mv linux-4.9.47 linux-4.9.47-rt37

cd linux-4.9.47-rt37

xz -d ../patch-4.9.47-rt37.patch.xz

patch -p1 <../patch-4.9.47-rt37.patch

cp /boot/config-4.9.0-4-amd64 .config

In the last step, before the kernel can be compiled, the new kernel has to be configured so that the functionality imported with the RT patch is also used. The command make menuconfig is called and we select Processor type and features -> Preemption Model -> Fully Preemptible Kernel (RT).

make -j4

make modules_install

make install


via:

实时Linux内核(PREEMPT_RT)的编译安装以及测试_preempt-rt-CSDN博客 路边闲人2 已于 2022-11-20 22:18:55 修改

https://blog.csdn.net/v6543210/article/details/80941906



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。