文章插图
返回decompression OK表示解压缩成功 。下一步对其进行反汇编 。objdump有-d和-D两个选项,这里选择-d即可 。-M att表示按AT&T汇编语法进行反汇编 。

文章插图
打开汇编文件vmlinuzu_d.dis,我们发现这里面缺少一些符号信息,原来vmlinuz在在内核编译时,去掉了debug信息 。
同时我们也了解到linux也提供了kernel-debug包,在其中包含了符号信息 。从centos官方网址下载和安装相关包,http://debuginfo.centos.org/7/x86_64/ 。

文章插图
复制出带符号的vmlinux文件 。不方便安装的情况下,也可以使用rpm包直接解压文件的方式 。

文章插图
下面我们也对vmlinux进行反汇编 。

文章插图
对比vmlinux_d.dis和vmlinuzu_d.dis这两个文件中的汇编代码,我们可以发现vmlinux_d.dis除了比vmlinuzu_d.dis多了更丰富的符号信息之外,其他内容高度一致 。有了这样的结论,我们就可以放心的使用vmlinux_d.dis汇编代码来分析我们的load5s了 。
6 Load5s 的 Kprobe 实现原理Load5s主要使用了kprobe内核探针技术 。kprobe是linux内核的一个重要特性,它可以能够在不修改现有代码的基础上,灵活的hook内核代码的执行 。其中这样两个关键属性symbol_name和offset可以确定在内核的任意一个函数中的某一个偏移地址处进行hook 。
首先,根据前面对代码的分析可以,我们关心的变量是calc_global_load函数中calc_load_tasks全局结构体变量的counter属性值 。这个全局变量calc_load_tasks正是当时内核中nr_running和nr_uninterruptible两种状态的tasks数之和 。
确定函数和函数内部的偏移量之后,我们可以通过kallsyms_lookup_name函数获取全局变量的calc_load_tasks内存地址,进而获取calc_load_tasks全局变量的值 。
确定恰当的函数内偏移地址,需要你对汇编语言比较精通 。3.10.0和2.6.32内核已经确定,其他版本内核可以按如下方法尝试获得 。

文章插图
对照c代码,源代码中有对calc_load_tasks全局变量进行修改的操作,因此,我们取lock add %rdx,0xdd15d9(%rip)这行汇编指令之后的内存地址取偏移量比较稳妥 。

文章插图
当分别取ffffffff810c2a4e和ffffffff810c2a4f处的偏移地址时,register_kprobe(&kp)会执行注册出错 。主要是这个注册函数中的check_kprobe_address_safe(p, &probed_mod) 会对偏移地址进行合法性检查 。这个地址检查函数具体实现原理此处不做过多阐述 。
我们顺序再次尝试ffffffff810c2a56地址时结果正常,此时函数内偏移量是0x23d,使用ffffffff810c2a56减去函数的开始地址ffffffff810c2820获得 。
最后,我们的load5s代码如下:(下图为节选,详情可参考GIT)

文章插图
将以上代码进行编译,即可获得load5s.ko内核模块 。如上述小结三中的make步骤 。
7 Linux load 中的数学问题接下来再对load计算过程中的数学问题做一些分析 。在前面kernel源码分析部分,我们可以在预编译之后的core.i文件中看到calc_global_load调用calc_load函数时,针对load1、load5和load15,给calc_load的第二个参数分别传入了三个不同的参数值1884,2014和2037 。那么这3个值是怎么得来的呢?查看内核源码之后,我们可以发现有这样的计算公式 。

文章插图
分别将x代入60秒(1分钟)、300秒(5分钟)和900秒(15分钟)可以得到如下结果

文章插图
这里面exp函数是求e的n次方的函数,e是自然对数2.71828…. 。明确了这个公式,我们在来看load的递归调用过程 。假设每5s的load5s的采样值依次是active1 active2 active3 active4 …….,x是计算跨度,比如load1是60/5,load5是300/5 。那么我们可以将任意时刻的load值的计算过程转换为:

文章插图
其中的各个权重之和是:

文章插图
小学生奥数题,无穷数列,和正好等于1 。
推荐阅读
- 网络工程师史上最全cmd命令大全,含Windows和Linux系统
- Linux文件安全与权限
- 线程,进程,协程, 并发,并行,同步,异步概念解析
- 专家解析六堡茶营销难题
- 全面总结买好茶的诀窍
- Linux 下各文件夹的结构说明及用途介绍
- 如何看 Linux 服务器的性能参数指标?
- 电脑常见故障详细解析大全 电脑故障维修大全
- 全面的无线网桥知识
- SSL VPN技术超全解析
