内核调度器开发入门|学习笔记(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习内核调度器开发入门

开发者学堂课程【内核调度器开发入门内核调度器开发入门】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/1034/detail/15144


五、Plugsched 操作演示  

那么接下来就是给大家实际的演示一下 Plugsched 如何去使用,接下来给大家介绍一下 Plugsched  的一个实际的案例,所以先看一下这里。那基本的使用方法放在了 read me 里面,这是开源的仓库,现在所有的 Plugsched  代码全都开源到这个仓库里了,有兴趣的可以看一下。然后前面是一些简单的介绍,这部分开始是一个简单的使用,首先需要准备一台用于开发的机器,这里已经去买了一台机器,然后一台完全干净的机器用于从头的一个演示,这是刚买好的一台机器,然后看一下它的系统,就是龙溪 os7.9 的这个版本,然后对应的内核版本是这样一个版本。

今天按照 quick start  一步一步给大家演示一下,首先第一步是安装一些必要的基础的软件包,把它们装上,然后这个安装需要一定的时间,现在给大家简单介绍一下这些包的作用,首先这里的 yum-utis 是包管理的相关的一些工具,后面会用到。

然后这个 ponman 是 docker 的一个发行版,因为工作都是进行在一个容器化的环境里,这样便于大家使用,减少使用一个上手的成本,所以这个装 postman,然后如果说大家的环境里没有 ponman 只有 docker,那用 docker 也是完全一样的,没有任何区别。然后 colonel debug info 这后面加了一个 u name,这个的意思就是说给当前运行的内核版本,也就是说刚才看到的现在龙溪的7.9的系统版本里面用的是装载的是这一个内核,所以说它其实就是给装上这个内核对应的一个 kernel 的一个 defiuginfo ,这个包主要是一些内核的调试信息,这个会在后面也会用到这个包里的一些内容,而这个 kernel-devel-s 是内核开发的比较熟悉的一个包,这个包只要是要做任何的模块开发都是必不可少的,其中主要会包括一些图文件,一些新东西,然后这就是第一步装的一些包。它的安装已经快结束了,现在刚好安装好,正好做下一步。

第二步就是创建一个工作环境,之后的Plus的工作都会在这个目录中去进行,先进入创建好这个目录,接下来要干的第一件事情是去龙溪的内核 NEX 内核的源代码给下载下来,用 yn download 这个软件,把源代码下载下来,现在看工作目录已经有这个源代码了,它对应的就是 kernrl-4.1 9.912 5.7 龙溪的内核的一个源代码,现在把这个容器给激起来,后面开发工作都会在这个容器中进行,大家可以看到它现在是要去 docker io 上面去破这个镜像,因为已经将最新的版本的 Plus 包给上传到了 docker io 上面去,大家可以直接下来从而方便使用。The pool 需要一些时间,现在这个多个镜像已经下载好了,可以先进入到这个容器镜像中进行一个开发,然后大家可以看到刚才那个 docker  run命令,这里映射了 pool 目录,目录就是刚才创建好的一个工作目录,现在这条命令相当于是把这个目录给映射到了容器中,这样方便在容器中也可以进入工作目录中去进行开发,然后后面这些映射的目录都是一些前面下载的包,还有这些我们也把它给映射进去对,方便使用包的内容用这条命令进入容器,然后进入容器中的开发路径,大家可以看到这个路径下面现在只有一个文件,就是刚刚下载好的那个源代码包,现在将源代码包解压出对应的源代码文本目录,用 Plugsched 提供的 extract source 命令就可以把源代码给解压出来,它实际执行的命令稍等一下马上就可以解压出一个源代码路径下来。

图片1.png

现在这个目录就解压出来了,大家看看这里是刚才指定的 kernel 目录,也就是说它将这个方差偏包的源代码,其中的原代码可以解压到这个 kernel 目录的中了,这个 kernel 的源代码就完全对应的是当前现在使用版本的一个源代码就在这里面,大家可以简单看一下里面的内容,熟悉内容都会知道这个就是现在内核的一个目录的结构。那么下面步骤就是要从现在的 Neo kernel 的源代码中把调度器的代码给提取出来,它使用的技术就是刚才提到的边界划分和提取技术。

图片2.png

大家可以看到它现在 mini 中指定的是内核版本,还有刚才的一个 kernel 的目录,然后这个是输出的 Plugsched 目录,它前面这些是一些预备的工作,然后现在这个过程执行时间会稍微较长,而这里提到的正在运行的是一个稍微比较慢的过程,然后这个就是前面 PPT 中提到的一个边界划分的中间的其中一个步骤,现在接下来执行到了 analyze,然后它也是其中一个步骤,边界划分总共三个步骤,这些都是边界划分相关的东西,现在整个过程都执行完了,可以看到它的结果就是输出了一个目录,这个目录叫 schedule 是刚才在命令行中指定的,也就是说是一步一步的将它解压成为内核源代码,然后从内核源代码里通过界划分技术给生成了一个调度器的源代码路径,而这个目录径路径就是完全提供给用户,让大家来使用的。现在有了一个开发的空间,那可以在这个开发目录里做一些对调度器的一些定制,这里是给了一个最简单的一个 example,先把这个 example 给打上,这是一个地图格式的文件,然后这个文件的意思就是说希望在 schedule kernel 就是带路器的一个核心的文件,然后核心文件里其中的一个函数叫做 schedule,然后其中它是在这个函数的头加上了两行代码,也就是这两行代码。

图片3.png

那么现在大概就知道它是对调度器进行了一些定制,把这个修改应用到这个调度器工作空间里面去,使用 patch 命令就能将这些修改内容给打进这个 Plugsched 的工作目录,它现在已经成功的将这两个文件给修改成功了,一个是 core.c 一个是feature.h。那么接下来下一个步骤就是将修改好的内容给打包生成一个调度器的rpm 包,使用命令就能够很快的打包一个内核代码,那个调度器的 rpm 包出来,现在这个调度器的 rpm 包就打包成功了。现在尝试安装一下,先将这个打包好的 rpm 包给拷贝到物理机上去,因为将会在物理机上去测试这个安装好的 rpm 包,现在退出这个开发环境回到系统中去。大家看现在这个目录下已经有刚才拷贝过来的做好的 schedule 的 rpm 包。同样是在这个 work 目录下是刚才生成的这个包,接下来要做的事情就是验证这个 rpm 包到底有什么用,是否符合预期。

图片4.png

那么现在要回到刚才说的 patch 到底干了些什么事情,它做了两件事情,一件事情是要去 print cake,这熟悉开发的同学都会知道这个就是内核里最常使用的一个调试命令,它做的事情就是在内核日志中打印一行文字,它打印了文字就是一条完全测试相关的,告诉这个新的告诉用户这个新的调速器已经成功了。另外在这里又为了验证这个 class gayte 的一个功能,在这里也加了一个判断,而这个判断的意思是说去判断有没有 class gayte 名字的一个 feature,这个是那个内核把一个机制是为了让大家方便去对一些调度器的特性进行一个开或关的操作,所以说这个的意思就是说如果说安装好这个 rpm 包之后并且打开了这个特性,它就会快的就会打印出这样一行信息。那接下来就安装一下这个包,首先先看一下安装这个包之前是什么样一个效果,这个就是刚刚所谓的 feature,大家可以看到里面有很多个,这些都是调度器现在可用的一些 feature 的列表,可以对它开或关,像这些前缀叫 no 下滑线的这些就是目前是关闭状态的一些调度特性,反之就是打开的一些调度器的调度特性,现在可以看到现在这里是没有相关的 Last test 的这样一个 feature,所以说现在是不存在的,那么假如说现在马上把这个 rpm 包给安装上好,现在已经安装好这个 rpm 包。第一件事情要确认是否安装上了这个模块,因为这个调速器是以模块形式配合的,使用 mod 的这个命令,现在这行命令说明已经将 schedule这个内核模块给插入到系统中。

图片5.png

那么接下来可以看一下 Plugsched 输出的基础的一些统计信息,这些方面做一些性能分析和调试用的默认输出的一些信息,比如说 schedule 时间这些信息都是输出基础的信息,这些信息可以证明 Plugsched 一个非常小的 downtime ,比如说这个总共的 downtime 时间是显示在这,这个是显示了一个1.5毫秒的一个时间是非常可以接受的。

图片6.png

然后接下来可以看一下 feature,那么现在可以看到这里已经出现了一个 no Plus test 这样一个 feature,这个的意思就是说 test 这个 feature 目前是属于关闭状态的,所以说日志里现在也没有出现刚才所说的这一行 i new schedule 信息,那么假如说现在将这个 feature 给打开,也就是这条命令将这个 feature 打开再对比一下,看一下可以相当明显看到刚才还是属于 no Plus,现在是 plus ched ,说明这个特性现在已经打开了,那这个特性打开按理说就应该能看到那一行日志信息了。现在可以看到这个信息已经打印出来了,说明现在调度器已经安装成功并且生效了。

图片7.png

最后一步是把新装的一个调度器包卸载,这个可以验证基础的一个回顾的能力,就是因为这个对于线上生产也是非常重要的,如果说安装的新的调度器有问题需要及时的将他回滚掉。

图片8.png

现在我们内核日志里已经输出这些信息,说明我们已经将这个调度器模块给卸载掉了,现在也可以看到 test 这样一个 feature 已经已经不存在列表里了,说明这个卸载是成功了,这个就是基础的演示。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
缓存 负载均衡 Linux
内核:进程与调度机制(笔记)
内核:进程与调度机制(笔记)
138 0
|
25天前
|
算法 Linux 调度
深入理解Linux内核调度器:从基础到优化####
本文旨在通过剖析Linux操作系统的心脏——内核调度器,为读者揭开其高效管理CPU资源的神秘面纱。不同于传统的摘要概述,本文将直接以一段精简代码片段作为引子,展示一个简化版的任务调度逻辑,随后逐步深入,详细探讨Linux内核调度器的工作原理、关键数据结构、调度算法演变以及性能调优策略,旨在为开发者与系统管理员提供一份实用的技术指南。 ####
64 4
|
27天前
|
算法 Unix Linux
深入理解Linux内核调度器:原理与优化
本文探讨了Linux操作系统的心脏——内核调度器(Scheduler)的工作原理,以及如何通过参数调整和代码优化来提高系统性能。不同于常规摘要仅概述内容,本摘要旨在激发读者对Linux内核调度机制深层次运作的兴趣,并简要介绍文章将覆盖的关键话题,如调度算法、实时性增强及节能策略等。
|
1月前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
2月前
|
缓存 编解码 监控
深入探索Linux内核调度机制的奥秘###
【10月更文挑战第19天】 本文旨在以通俗易懂的语言,深入浅出地剖析Linux操作系统内核中的进程调度机制,揭示其背后的设计哲学与实现策略。我们将从基础概念入手,逐步揭开Linux调度策略的神秘面纱,探讨其如何高效、公平地管理系统资源,以及这些机制对系统性能和用户体验的影响。通过本文,您将获得关于Linux调度机制的全新视角,理解其在日常计算中扮演的关键角色。 ###
53 1
|
1月前
|
算法 调度 UED
深入浅出操作系统调度策略
【10月更文挑战第33天】在数字时代的心脏,操作系统扮演着至关重要的角色。本文将探讨操作系统的核心功能之一——进程调度策略的设计与影响。我们将从理论到实践,通过浅显易懂的语言和具体代码示例,揭示如何通过不同的调度算法来优化系统性能和用户体验。无论你是技术新手还是资深开发者,这篇文章都将为你提供新的视角和深入的理解。
|
7月前
|
存储 Java 调度
Java多线程基础-1:通俗简介操作系统之进程的管理与调度
操作系统是一个复杂的软件,具备许多功能。其中,进程的管理与调度是与我们密切相关的。本文将对操作系统功能中进程管理与调度作出介绍。
70 0
|
7月前
|
负载均衡 Linux 调度
Linux 进程调度器入门
Linux 进程调度器入门
67 0
|
7月前
|
存储 API 调度
FreeRTOS深入教程(任务创建的深入和任务调度机制分析)
FreeRTOS深入教程(任务创建的深入和任务调度机制分析)
368 0
|
算法 调度
《操作系统》第二章 2.2处理机调度
《操作系统》第二章 2.2处理机调度