谈谈Linux内核的噪声

news2025/1/6 20:09:49

Linux内核是广被使用的操作系统,从嵌入式家用设备,航空航天设备到超级计算机,到处都有Linux内核的身影,这归功于Linux内核丰富的配置带来的巨大灵活性。

网络虚拟化和软件定义网络的发展,也从另外一个方面证实了在网络设备如此专用的领域,Linux内核也能发挥巨大作用,并且对网络设备领域带来可编程性的巨大便利,极大促进了网络设备领域的发展,5G网络堆栈建立在这个范式之上。随着无人驾驶和物联网等实时系统的发展,对延迟要求越来越高。高性能计算(HPC)、实时任务和软件定义网络等需求需要Linux能够执行延迟敏感的任务。

为了达成这些目标,软硬件都要为高性能计算和实时性做配置。硬件需要在吞吐和延迟确定性之间做权衡,包括调整处理器的频率,省电模式和系统管理中断等。

对内核配置来说,就是要在系统中隔离出一些看家(house keeping) CPU, 这些看家上跑的任务包括内核线程,如RCU回调线程,内核中一些延迟任务线程,以及内核与用户态一些看守线程。一些中断也被放在看家CPU上。这样,在软件定义网络系统中,特定的隔离的CPU被用来执行特殊的网络功能虚拟化(NFV)。

虽然有需要确定性的任务被路由到这些特定的隔离的CPU上,仍然有一些CPU由调度分配用来执行通用的一般任务,这些CPU对延时确定性要求不高,不被隔离。为了提高这类需要延迟确定的系统的实时性,常常需要内核配置PREEMPT_RT以减少唤醒延迟。

这些对延迟敏感的系统评估是一件非常复杂的工作,评估这些系统的延迟变异是一件非常艰苦但重要的工作。这在高性能计算领域被称为系统噪声,在实时操作系统领域,被称为实时性。无论叫做什么,这件事的本质都是一样的,一个确定的工作是怎样被系统内各种复杂的软硬件组件干扰,进而产生非常复杂的时间延迟分布的。

怎样评估一个内核的噪声呢?大概有两种方法:设置合适的负载和基于追踪的方法。前者是基于任务的一种宏观测试方法,测试各种不同任务的时间分布,后者是一种微观的方法,检测同一个任务在执行时产生这种时间的分布的根源是什么。

这两种方法观察尺度不同,各有利弊,负载的方法能够就某个特定的任务给出时间分布特征,并且可以分析影响这个任务的时间特征的宏观因素。而基于追踪的微观方法,能分析出各个软件或者硬件过程时间延迟,但是在整个系统中如何还原出产生这些微观延迟的来源,是很难做到的。

因此很多时候,需要结合基于负载的方法和基于追踪的方法,才有可能接近事实真相。内核中有osnoise同时结合了基于负载的方法和基于追踪的方法,来评价和归因内核中的噪声。

这个工具是为高性能计算开发的,用于对隔离的CPU系统中,追踪微妙级的噪声。通过一系列对内核实时基础设施,调度,追踪子系统等的修改, sosnoise最终在内核的5.14版本正式进入了Linux内核,在内核5.17中, 这个功能可以在用户态通过rtla (Real-Time Linux Analysis) 工具集使用被内核开发者和系统管理者使用,这些人很容易通过这些工具测试它们的系统的噪声,或者扩展这些工具的功能。

为了理解osnoise在做什么, 我们先来看看噪声来源。

我们介绍下Linux内可以被称为任务的几种上下文。一般程序有non-maskable interrupts (NMIs), maskable interrupts (IRQs), softirqs和线程四种执行上下文。在PREEMPT_RT开启时,softirqs线程化。我们没必要区分这些不同的执行流或者叫上下文,我们可以把它们统称为任务。这几种任务在Linux中遵循以下规则:

每个CPU的NMI抢断IRQs,softirqs和线程
每个CPU的NMI一旦发起,就必须执行完成才让出CPU
IRQs抢断softirqs和线程
一旦一个IRQ 开始处理, 它不会被另一个IRQ抢断
Softirqs可以抢断线程
softirq不能被另外一个软中断抢断
线程不能抢断NMI, IRQs and sofirqs

我们接着介绍下Linux的调度器,Linux有5个分层的调度器,调度所有的线程,不管这些线程是内核线程还是用户态线程,对调度器来说,都一视同仁,并没有什么不同。这5个调度器以一个固定的顺序作用来选出下一个要运行的线程。这些调度器按照执行顺序依次是: 

第一个调度器为stop machine调度器,它在多CPU系统中用来实现负载均衡和热插拔等内核功能。

第二个调度器是SCHED_DEADLINE,是一个基于Earliest Deadline First的deadline实时调度器。

第三个是一个POSIX兼容的固定优先级的实时调度器, 使用这个调度器的线程可以是SCHED_RR或者SCHED_FIFO类型的线程,SCHED_RR为时间片轮转的线程,SCHED_FIFO线程只有在挂起,执行结束,或者被抢占时才能才会释放CPU的使用。

第四个调度器是通用调度器,即CFS调度器,这个调度器调度的线程标记为SCHED_OTHER。

第五个调度器为IDLE 调度器, 当前面四个调度器没有线程调度到时,就调度到idle thread线程。

Linux有一套丰富的追踪功能。可以追踪例很多内核功能函数, 这些追踪功能的广泛使用,他们并没有带来太大性能损耗,却给关心内核运行的人提供了很好的观察内核如何运行的窗口。ftrace,ebpf和systemtap都是这些追踪系统的杰出代表。

以HPC程序来说明这个问题。正常HPC应用是一个程序在多份数据上运行的同一段代码(single-program multiple-data (SPMD) model), 如图所示:

上面是一个HPC的程序运行过程, A,B, C运行同一段代码,它们计算完成后把数据发送给D进行接下来的计算。正常计算只有蓝色部分的局部计算,橙色部分的线程间同步,以及绿色的线程间通信,这是每个CPU上的线程实际做的工作,但是,系统中总是存在各种因素会打断程序在CPU上运行。因此,在上述蓝色局部计算的中间,总是会引入红色的部分,这些用户任务的运行总是被操作系统的一些系统任务打断,这些系统任务可能是NMIs, IRQs或者softirqs,也可能是其它用户线程或者内核线程。

这些跟程序执行无关由系统引入的时间延迟的不确定性就是噪声,这些噪声让A,B,C三个相同的程序经历的时间也不同,对于HPC来说,就带来很大的延迟和性能惩罚,如果对于实时性很强的系统,可能带来的不只是性能惩罚,而是灾难。

从上面的讨论可以看出,不同的调度策略对局部CPU某个任务的执行延迟影响很大,严重影响每个并行任务的响应时间。这些被内核的系统活动引起的延迟其实就是操作系统噪声。全世界的超级计算机使用Linux作为内核,原因之一在于Linux可以通过配置,把NMIs, IRQs或者softirqs,内核线程等系统活动局限在少数的几个核心上,而大部分其它核心用来跑真正的计算任务,这些跑计算任务的核心通过隔离和绑核,可以免受系统噪声和其它用户程序产生噪声的干扰,使其延时表现出好的多的确定性。

在软件定义网络实践中,发展出DPDK这种通用框架进行类似的噪声隔离工作,而HPC和其它实时系统中,也有类似的框架。虽然可以对CPU进行隔离,并且可以把所有IRQ, softirqs以及内核线程都移动到少数几个CPU核上, 对延迟特别敏感的任务进行精心配置却是一个非常有挑战的工作。因为还有很多每CPU的软件活动会干扰程序运行,比如调度器用的时钟中断,虚拟内存统计,网络包的处理等。这些噪声来源可以被精心的配置去掉,比如在内核配置里使能NOHZ_FULL去除时钟中断的干扰, 或者修改内核的代码或者算法去除相应的噪声干扰。

Linux是个通用操作系统,它不是为延时敏感的应用而生的,但是HPC, 实时操作系统这类希望利用Linux实现其苛刻目标的开发者们,不可能时刻去追踪Linux的修改对其延时干扰的影响。

大家习惯用一些实时或者延时敏感的HPC负载去度量Linux内核噪声,两个好用的工具就是sysjitter和oslat。这些工具重复测量同一个任务的延时差异,比较它们的延时差异是否超过某个门限值。

这些工具用一些计算任务去测量和发现噪声的存在,但是并不会寻找它们的原因。要发现这些噪声的原因,我们需要内核的追踪系统去观察整个内核系统的运行。当然,追踪系统也会引入噪声,这就需要统计去寻找噪声的根本原因以抓住主要矛盾。

硬件本身的噪声也不少见,可能是因为共享硬件资源,打开了超线程,有比操作系统执行优先级更高的上下文,比如系统管理中断,这些不是操作系统本身引入的问题,但是他们可以被追踪系统看到。有的基于任务的测试能够看到的噪声很难被追踪系统复现,这些是比较头疼的问题,需要不断基于两者的数据进行长时间深入分析,以仔细还原时间到底去哪了。

总体而言,目前综合基于任务的测试和基于追踪的分析最好的工具是osnoise,它很好结合了两点,分析内核时间延迟的变异。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java线程的6中状态

Java 线程的状态 Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、 等待(WAITING)、超时等待(TIMED_WAITING)、终止&#xff08…

layui框架学习(8:动态操作选项卡)

Layui官网示例(参考文献3)中的选项卡部分除了介绍选项卡的样式外,还介绍了新增选项卡、删除选项卡、切换选项卡等动态操作选项卡方式,主要调用element模块中与选项卡相关的函数实现,除此之外,element模块还…

树莓派下安装OpenEuler

openEuler作为华为开源的应用于嵌入式设备的操作系统,正在受到越来越多的关注。树莓派是一个很好的应用场景,这篇文章就介绍下如何在树莓派上安装openEuler。   ps:openEuler要求树莓派的版本是4B 1.下载openEuler镜像 镜像网址&#xff1…

【K哥爬虫普法】百度、360八年乱战,robots 协议之战终落幕

我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K哥特设了“K哥爬虫普法”专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识,知晓如何合法合规利用…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——MapReduce工作流程

1、流程示意图 MapReduce详细工作流程(一) MapReduce详细工作流程(二) 2、流程详解 上面的流程是整个MapReduce最全工作流程,但是Shuffle过程只是从第7步开始到第16步结束,具体Shuffle过程详解&#xff0…

作为Linux C/C++程序员必备的工具

Linux系统 可以选择centOS或者ubautu server(不建议选择桌面版本的)。不建议裸机安装,玩坏了就特别麻烦。不建议使用有桌面版本的ubautu,在一定程度有桌面的版本的会消耗性能。 如果经济实力允许,可以购买云服务器。 参考文章: Ubuntu server…

一款基于各大企业信息API渗透工具

功能 剑指HW/SRC,解决在HW/SRC场景下遇到的各种针对国内企业信息收集难题 使用支持以下API,并支持合并数据导出 爱企查 (未登陆信息带*) 企查查(签名失效) 天眼查 阿拉丁 酷安市场 七麦数据 站长之家 veryvp 查询信息 IC…

15-基础加强3-单元测试日志

文章目录1.单元测试1.1概述【理解】1.2特点【理解】1.3使用步骤【应用】1.4相关注解【应用】2.日志2.1概述【理解】2.2日志体系结构和Log4J【理解】2.3入门案例【应用】1.单元测试 1.1概述【理解】 JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具…

荧光标记ATTO647N NHS,ATTO 647N SE,ATTO 647N-琥珀酰亚胺酯用于单分子检测

【中文名称】 ATTO 647N-琥珀酰亚胺酯,ATTO 647N-活性酯【英文名称】 ATTO 647N-NHS,ATTO 647N NHS,ATTO 647N SE,ATTO 647N-NHS ester【光谱图】【CAS号】N/A【分子式】C46H55ClN4O5【分子量】779.41【基团部分】 ATTO【纯度标准…

5.6配置BGP联邦和团体属性

5.3.3配置BGP联邦和团体属性 1. 实验目的 熟悉BGP联邦和团体属性的应用场景掌握BGP联邦和团体属性的配置方法2. 实验拓扑 实验拓扑如图5-6所示: 图5-6:配置BGP联邦和团体属性 3. 实验步骤 (1)IP地址的配置 R1的配…

【Jmatpro 10.0】根据材料牌号输出应力-应变曲线

我的主页: 技术邻:小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩:小铭的ABAQUS学习的个人空间csdn:qgm1702 博客园文章链接: https://www.cnblogs.com/aksoam/p/17121006.html 1.前提条件 Jmatpro …

复盘会如何开出新花样?10种方式让你开出让人惊喜的复盘会【附复盘问题列表】

复盘是每个PMO和项目经理必备的技能之一,咱们分享过很多复盘的技巧和方法,如下:但是大家都会有个问题,那就是复盘形式单一,团队复盘几次就会失去兴趣?失去兴趣之后效果自然不会太好,如何把让大家…

C++设计模式(17)——备忘录模式

亦称: 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外, 编辑器中还要有设置文本格…

字符设备驱动基础(三)

目录 一、上下文和并发场合 二、中断屏蔽(了解) 三、原子变量(掌握) 四、自旋锁:基于忙等待的并发控制机制 五、信号量:基于阻塞的并发控制机制 六、互斥锁:基于阻塞的互斥机制 七、选择…

PMP备考经验—做题方法总结

考题类型 ITTO题 根据关键字考工具技术,输入输出的,所以掌握关键字是重点,典型的ITTO有六个:收集需求工具、质量管理工具、团队建设工具、管理团队的冲突跟了、风险应对的策略以及合同类型。PS:答案是工具技术或者文…

SVN无法连接到服务器的各种问题原因及解决办法

SVN专业使用教程详解 第一节 安装VisualSVN Server服务器 第一步 下载SVN服务器,需要链接的请私信。 点击下载的执行文档进行安装 选择组件 选择在部署 VisualSVN Server 时安装VisualSVN Server 和 Administration Tools 组件。 调整初始服务器配置 或者&…

带你一步步搭建Web自动化测试框架

测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程。另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人。本章和下一张…

【Django】缓存、中间件、分页、生成csv文件

一、缓存 定义:可以更快的读取数据的介质。一般用来存储临时数据,常用介质的是读取数据很快的内存。 缓存场景: 1、博客列表页 2、电商商品详情页 场景特点:缓存的地方,数据变动频率较少 1、数据库缓存 当把一次负…

研究 “B表里的数据是否全部都在A表里“ 的问题

背景 研究 “B表里的数据是否全部都在A表里” 的问题,那种写法比较合理效率高? 假设有A表和B表,B表通过自身外键和A表关联,查出B表中的外键值不在A中的。 过程 假设我们有t_master和t_pet表,即主人和宠物表&#x…

TPM密钥管理、使用

前面讲过证书相关内容,除了在软件方面有所应用外,在硬件方面也有很多应用。本次讲一下TPM相关的内容。 一、TPM介绍 1.1背景 TCG基于硬件安全的架构是为应对1990s后期日益增多的复杂恶意软件攻击应用而生的。当时以及现在,抵御PC客户端网络…