开发者学堂课程【内核调度器开发入门:内核调度器开发入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址: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 命令就可以把源代码给解压出来,它实际执行的命令稍等一下马上就可以解压出一个源代码路径下来。
现在这个目录就解压出来了,大家看看这里是刚才指定的 kernel 目录,也就是说它将这个方差偏包的源代码,其中的原代码可以解压到这个 kernel 目录的中了,这个 kernel 的源代码就完全对应的是当前现在使用版本的一个源代码就在这里面,大家可以简单看一下里面的内容,熟悉内容都会知道这个就是现在内核的一个目录的结构。那么下面步骤就是要从现在的 Neo kernel 的源代码中把调度器的代码给提取出来,它使用的技术就是刚才提到的边界划分和提取技术。
大家可以看到它现在 mini 中指定的是内核版本,还有刚才的一个 kernel 的目录,然后这个是输出的 Plugsched 目录,它前面这些是一些预备的工作,然后现在这个过程执行时间会稍微较长,而这里提到的正在运行的是一个稍微比较慢的过程,然后这个就是前面 PPT 中提到的一个边界划分的中间的其中一个步骤,现在接下来执行到了 analyze,然后它也是其中一个步骤,边界划分总共三个步骤,这些都是边界划分相关的东西,现在整个过程都执行完了,可以看到它的结果就是输出了一个目录,这个目录叫 schedule 是刚才在命令行中指定的,也就是说是一步一步的将它解压成为内核源代码,然后从内核源代码里通过界划分技术给生成了一个调度器的源代码路径,而这个目录径路径就是完全提供给用户,让大家来使用的。现在有了一个开发的空间,那可以在这个开发目录里做一些对调度器的一些定制,这里是给了一个最简单的一个 example,先把这个 example 给打上,这是一个地图格式的文件,然后这个文件的意思就是说希望在 schedule kernel 就是带路器的一个核心的文件,然后核心文件里其中的一个函数叫做 schedule,然后其中它是在这个函数的头加上了两行代码,也就是这两行代码。
那么现在大概就知道它是对调度器进行了一些定制,把这个修改应用到这个调度器工作空间里面去,使用 patch 命令就能将这些修改内容给打进这个 Plugsched 的工作目录,它现在已经成功的将这两个文件给修改成功了,一个是 core.c 一个是feature.h。那么接下来下一个步骤就是将修改好的内容给打包生成一个调度器的rpm 包,使用命令就能够很快的打包一个内核代码,那个调度器的 rpm 包出来,现在这个调度器的 rpm 包就打包成功了。现在尝试安装一下,先将这个打包好的 rpm 包给拷贝到物理机上去,因为将会在物理机上去测试这个安装好的 rpm 包,现在退出这个开发环境回到系统中去。大家看现在这个目录下已经有刚才拷贝过来的做好的 schedule 的 rpm 包。同样是在这个 work 目录下是刚才生成的这个包,接下来要做的事情就是验证这个 rpm 包到底有什么用,是否符合预期。
那么现在要回到刚才说的 patch 到底干了些什么事情,它做了两件事情,一件事情是要去 print cake,这熟悉开发的同学都会知道这个就是内核里最常使用的一个调试命令,它做的事情就是在内核日志中打印一行文字,它打印了文字就是一条完全测试相关的,告诉这个新的告诉用户这个新的调速器已经成功了。另外在这里又为了验证这个 class gayte 的一个功能,在这里也加了一个判断,而这个判断的意思是说去判断有没有 class gayte 名字的一个 feature,这个是那个内核把一个机制是为了让大家方便去对一些调度器的特性进行一个开或关的操作,所以说这个的意思就是说如果说安装好这个 rpm 包之后并且打开了这个特性,它就会快的就会打印出这样一行信息。那接下来就安装一下这个包,首先先看一下安装这个包之前是什么样一个效果,这个就是刚刚所谓的 feature,大家可以看到里面有很多个,这些都是调度器现在可用的一些 feature 的列表,可以对它开或关,像这些前缀叫 no 下滑线的这些就是目前是关闭状态的一些调度特性,反之就是打开的一些调度器的调度特性,现在可以看到现在这里是没有相关的 Last test 的这样一个 feature,所以说现在是不存在的,那么假如说现在马上把这个 rpm 包给安装上好,现在已经安装好这个 rpm 包。第一件事情要确认是否安装上了这个模块,因为这个调速器是以模块形式配合的,使用 mod 的这个命令,现在这行命令说明已经将 schedule这个内核模块给插入到系统中。
那么接下来可以看一下 Plugsched 输出的基础的一些统计信息,这些方面做一些性能分析和调试用的默认输出的一些信息,比如说 schedule 时间这些信息都是输出基础的信息,这些信息可以证明 Plugsched 一个非常小的 downtime ,比如说这个总共的 downtime 时间是显示在这,这个是显示了一个1.5毫秒的一个时间是非常可以接受的。
然后接下来可以看一下 feature,那么现在可以看到这里已经出现了一个 no Plus test 这样一个 feature,这个的意思就是说 test 这个 feature 目前是属于关闭状态的,所以说日志里现在也没有出现刚才所说的这一行 i new schedule 信息,那么假如说现在将这个 feature 给打开,也就是这条命令将这个 feature 打开再对比一下,看一下可以相当明显看到刚才还是属于 no Plus,现在是 plus ched ,说明这个特性现在已经打开了,那这个特性打开按理说就应该能看到那一行日志信息了。现在可以看到这个信息已经打印出来了,说明现在调度器已经安装成功并且生效了。
最后一步是把新装的一个调度器包卸载,这个可以验证基础的一个回顾的能力,就是因为这个对于线上生产也是非常重要的,如果说安装的新的调度器有问题需要及时的将他回滚掉。
现在我们内核日志里已经输出这些信息,说明我们已经将这个调度器模块给卸载掉了,现在也可以看到 test 这样一个 feature 已经已经不存在列表里了,说明这个卸载是成功了,这个就是基础的演示。