UNIT 4 Kernel-Level Profiling 内核级监控与分析
学习目标:
1. 使用OProfile 去监控内核和应用程序
2. 在生产环境中部署SystemTap脚本去监控内核。
3.把SystemTap 脚本去编译到内核模块。
4.1 Oprofile
A. Oprofile 可以监控:
a. 中断处理
b. 应用程序和共享库
c. 整个系统的性能
d. 捕获特定间隔时间发生的事件,但不会干涉事件。
B. Oprofile 需要有硬件性能计数器(CPU内部)。
a. 运行时对设备影响较小
b. 支持IA-32, IA-64, AMD64, PowerPC L架构
c. 硬件平台可移植性好。
d. 如果硬件计数器无效的情况下(2.6内核)会默认使用计时模式。
e. 使用时不需要指定编译选项。
注: elinks
-du mp file:///usr/share/doc/oprofile-*/oprofile.html | less 获取Oprofile信息
PS:
oprofile 是 Linux 平台上的一个功能强大的性能分析工具, 支持两种采样(sampling)方式:基于事件的采样(event based)和基于时间的采样(time based)。
基于事件的采样是oprofile只记录特定事件(比如L2 cache miss)的发生次数,当达到用户设定的 定值时oprofile 就记录一下(采一个样)。这种方式需要CPU 内部有性能计数器(performace counter)。
基于时间的采样是oprofile 借助OS 时钟中断的机制,每个时钟中断 oprofile 都会记录一次(采一次样)。引入的目的在于,提供对没有性能计数器 CPU 的支持。其精度相对于基于事件的采样要低。因为要借助 OS 时钟中断的支持,对禁用中断的代码oprofile不能对其进行分析。
4.2
Installing Oprofile
安装
Oprofile
A. 安装Oprofile相关软件包
yum list all | grep oprofile
yum –y install oprofile oprofile-gui
B. 查询Oprofile相关安装信息
rpm –ql oprofile oprofile-gui | grep bin
rpm –qc oprofile
rpm –qd oprofile
grep oprofile /etc/passwd
C. 在kernel-doc 目录查看Oprofile帮助文档
Documentation/basic_profiling.txt
确定系统是否支持Oprofile:
grep -h PROF /boot/config-*
4.3
Installing Kernel-debuginfo
安装
Kernel-debuginfo
A. 安装与内核相匹配的kernel*-debuginfo 软件包
uname –r 查看内核版本
yum list all | grep ‘(kernel|kernel.*debug)’
yum –y install kernel-xen-debuginfo-version-release
NOTE: kernel-debug!=kernel-debuginfo
kernel-debug: 用于系统排错
kernel-debuginfo: 用于系统代码或模块扩展
B.确认内核版本号是否匹配
Export QF=’%{release} %{version} %{name}\n’
rpm –qa –queryformat “$QF” kernel\* | sort
4.4
Setting up Oprofile
设置
Oprofile
A. 找出vmlinux debuginfo module
rpm –ql kernel-xen-debuginfo | grep vmlinux
B. 将下面配置添加到/etc/rc.local完成相应的监控功能:
a. 监控内核:
Opcontrol –setup –vmlinux=/usr/lib/debug/lib/modules/$(uname –r )/vmlinux
(
注:
Oprofile
需要知道当前运行的内核所在的映像文件
.)
b. 监控应用程序:
Opcontrol –setup –no-vmlinux
C. 相关选项:限制监控范围
opcontrol –list-events
opcontrol –event=CPU_CLK_UNHALTED:400000
--event=DATA_MEM_REFS:10000
4.5 Running a test
测试
A. 清除原有数据并开始收集数据。
opcontrol --reset
opcontrol --start
B. 运行想要测试的命令
C.将收集到的数据保存到/var/lib/oprofile/samples/
opcontrol –dump
D. 停止Oprofile
Opcontrol –stop
4.6
Reviewing results
查看监控结果
A. 查看所有应用程序
Opreport > /tmp/oprofile.data
a. 应用程序执行时被调用了多少次
b. 每次执行时处理器所花的时间
B. 查看特定应用程序
opreport –l /bin/bash > /tmp/oprofile.data
C. 可以查看帮助文档
/usr/share/doc/oprofile-*/oprofile.html
4.7
SystemTap
A. 可以监控:
a. 通过kprobes 子系统可以显示出所有系统调用
b. 捕获所有事件
B. 编译一个脚本到内核模块
a.systemtap 脚本语言格式与awk类似
b.脚本具有高可移植性
C. 通常在生产环境没有编译器。
a. 在开发环境上:把脚本编译到内核模块
b.在生产环境上:部署内核模块
c 确保当前运行的内核版本一致
Modinfo modulenam | grep vermagic
PS:
SystemTap 是监控和跟踪运行中的 Linux 内核的操作的动态方法。这句话的关键词是
动态,因为 SystemTap 没有使用工具构建一个特殊的内核,而是允许您在运行时动态地安装该工具。它通过一个名为
Kprobes 的应用编程接口(API)来实现该目的,
SystemTap 是监控和跟踪运行中的 Linux 内核的操作的动态方法。这句话的关键词是
动态,因为 SystemTap 没有使用工具构建一个特殊的内核,而是允许您在运行时动态地安装该工具。它通过一个名为
Kprobes 的应用编程接口(API)来实现该目的.
4.8
Required packages
所需软件包
A. 开发环境:
systemtap
kernel-debuginfo (必须与内核相匹配)
kernel-devel (必须与内核相匹配)
gcc
B. 生产环境:
systemtap-runtime
4.9
SystemTap scripts
A. 脚本中可以使用点“.”并且支持通配符
probe kernel.function(“foo”)
probe kernel.function(“*”).return
参考 /usr/share/doc/systemtap-*/examples
B. 所包含功能:
/usr/share/systemtap/tapset
a. man –k systemtap
b.通常SystemTap脚本里面都至少需要定义一个探测点
c. 探测点类型:IO scheduler,networking,NFS,memory manager,SCSI,signal subsystems
4.10
The stap command
A.在开发环境使用
B. SystemTap运行的过程依次分为五个阶段:
a. 分析脚本
b. 解析当前运行的内核的符号信息
c. 将脚本转换成C文件
d. 创建内核模块
e. 加载,运行,卸载内核模块(需要root权限)
C. 例:获取内核功能函数清单
stap –p2 –e ‘probe kernel.function(“*”) {} | sort –u
PS:
每一个阶段的主要功能:
* Pass 1 - parse:这个阶段主要是检查输入脚本是否存在语法错误,例如大括号是否匹配,变量定义是否规范等
* Pass 2 - elaborate:这个阶段主要是对输入脚本中定义的探测点或者用到的函数展开,不但需要综合SystemTap的预定义脚本库,还需要分析内核或者内核模块的调试信息
* Pass 3 - translate: 在这个阶段,将展开后的脚本转换成C文件。前三个阶段的功能类似于编译器,将.stp文件编译成为完整的.c文件,因此又被合起来称为转换器(translator)
* Pass 4 - build:在这个阶段,将C源文件编译成内核模块,在这过程中还会用到SystemTap的运行时库函数。
* Pass 5 - run:这个阶段,将编译好的内核模块插入内核,开始进行数据收集和传输。
4.11
The staprun command
A. 在生产环境使用
a. 不需要编译器
B. 运行systemtap只需要一个步骤
a. 加载,运行,卸载内核模块(需要root权限)
C. 例: 运行一个模块
Staprun /path/to/module.ko
===============Unit 4 END======================================