在安装前,须要知道下本身的系统环境,个人环境以下:html
uname -r 2.6.18-308.el5
Linux 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
为了部署 SystemTap,须要安装如下两个 RPM 包:python
以 root 权限,运行如下命令安装:linux
yum install systemtap systemtap-runtime
注:在使用 SystemTap 前,须要安装内核信息包,能够运行如下命令安装:api
stap-prep
若是安装失败,请手动安装,手动安装步骤请见手动安装内核信息包。架构
注:我在个人主机上运行
stap-prep
的报错信息以下app
[root@test ~]# stap-prep Need to install the following packages: kernel-devel-2.6.18-308.el5.x86_64 kernel-debuginfo-2.6.18-308.el5.x86_64 Traceback (most recent call last): File "/usr/bin/yumdownloader", line 19, in <module> import yum ImportError: No module named yum problem downloading rpm(s) kernel-devel-2.6.18-308.el5.x86_64 kernel-debuginfo-2.6.18-308.el5.x86_64
须要的内核信息包包含你内核中匹配如下字段 -devel, -debuginfo, 和 -debuginfo-common 的包。以下:ide
须要安装和你内核对应版本的包,运行命令工具
uname -r 2.6.18-308.el5
能够指定你的内核是 2.6.18-308.el5
,所以你须要的包以下:学习
重要!!!!注意:这三个包必须与你的内核版本匹配,不能你懂的。测试
下载这三个 rpm 包,到 http://rpm.pbone.net 这个网站去下载。或者最简单的在 google 搜索包名。
下载 kernel-debuginfo-2.6.18-308.el5.x86_64.rpm:
wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/x86_64/Debuginfo/kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
下载 kernel-devel-2.6.18-308.el5.x86_64.rpm:
wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/x86_64/Debuginfo/kernel-devel-2.6.18-308.el5.x86_64.rpm
下载 kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm:
wget ftp://ftp.pbone.net/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/x86_64/Debuginfo/kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm
分别安装这三个包:
rpm -ivh kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm rpm -ivh kernel-debuginfo-2.6.18-308.el5.x86_64.rpm rmp -ivh kernel-devel-2.6.18-308.el5.x86_64.rpm
为了测试 stap 是否安装正确,须要运行如下命令测试:
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
注:上面这条测试语句会失败,因此更换一个测试文件吧,从 http://blog.yufeng.info/archives/747 拿了一个示例
Linux下谁在切换咱们的进程的 stap 脚本
cswmon.stp
#! /usr/bin/env stap # # global csw_count global idle_count probe scheduler.cpu_off { csw_count[task_prev, task_next]++ idle_count+=idle } function fmt_task(task_prev, task_next) { return sprintf("%s(%d)->%s(%d)", task_execname(task_prev), task_pid(task_prev), task_execname(task_next), task_pid(task_next)) } function print_cswtop () { printf ("%45s %10s\n", "Context switch", "COUNT") foreach ([task_prev, task_next] in csw_count- limit 20) { printf("%45s %10d\n", fmt_task(task_prev, task_next), csw_count[task_prev, task_next]) } printf("%45s %10d\n", "idle", idle_count) delete csw_count delete idle_count } probe timer.s($1) { print_cswtop () printf("--------------------------------------------------------------\n") }
执行脚本:
[root@gd2ywdnscsvm56 ~]# stap test.stp 5 Context switch COUNT swapper(0)->vmtoolsd(2698) 54 vmtoolsd(2698)->swapper(0) 54 stapio(27632)->swapper(0) 25 swapper(0)->python(3799) 25 python(3799)->swapper(0) 25 swapper(0)->stapio(27632) 24 swapper(0)->iscsid(2955) 20 iscsid(2955)->swapper(0) 20 swapper(0)->hald-addon-stor(3551) 20 hald-addon-stor(3551)->swapper(0) 20 swapper(0)->mpt_poll_0(694) 5 mpt_poll_0(694)->swapper(0) 5 swapper(0)->automount(3631) 5 automount(3631)->swapper(0) 5 swapper(0)->vmmemctl(2543) 5 vmmemctl(2543)->swapper(0) 5 swapper(0)->iscsid(2954) 5 iscsid(2954)->swapper(0) 5 swapper(0)->pcscd(3500) 5 pcscd(3500)->swapper(0) 5 idle 194 -------------------------------------------------------------- Context switch COUNT swapper(0)->vmtoolsd(2698) 51 vmtoolsd(2698)->swapper(0) 51 swapper(0)->hald-addon-stor(3551) 30 hald-addon-stor(3551)->swapper(0) 30 swapper(0)->stapio(27632) 25 stapio(27632)->swapper(0) 25 swapper(0)->python(3799) 25 python(3799)->swapper(0) 25 swapper(0)->iscsid(2955) 20 iscsid(2955)->swapper(0) 20 swapper(0)->hald(3527) 6 hald(3527)->swapper(0) 6 swapper(0)->mpt_poll_0(694) 5 mpt_poll_0(694)->swapper(0) 5 swapper(0)->automount(3631) 5 automount(3631)->swapper(0) 5 swapper(0)->vmmemctl(2543) 5 vmmemctl(2543)->swapper(0) 5 swapper(0)->iscsid(2954) 5 iscsid(2954)->swapper(0) 5 idle 198
当运行一个 SystemTap 脚本的时候,SystemTap 会在脚本外构建一个内核模块,SystemTap 而后把这个内核模块加载进内核,容许它直接从内核提取指定的数据。
正常状况下,SystemTap 仅仅会运行在部署了 SystemTap 的系统上。这意味着,若是你想在 10 个系统上运行 SystemTap,你必须把 SystemTap 部署到全部的系统上。有时候,这可能既不可行也不理想。好比,公司政策禁止管理员在指定的机器上安装 RPM 包来提供编译和 debug 信息,从而防止 SystemTap 的部署。为了解决这一问题,SystemTap 容许你使用 Cross-instrumentation。
Cross-instrumentation 是一个从一台计算机上的 SystemTap 脚本生成 SystemTap 测量模块并在另外一台计算机上使用的过程。这个过程提供了如下好处:
为了简单起见,在这一节中使用如下术语:
为了配置一个主机系统和一个目标系统,须要完成如下步骤:
uname -r
命令来决定运行在每台目标系统上的内核完成这些步骤后,你如今能够在主机系统上构建测量模块。为了构建测量模块,在主机系统上运行如下命令(必定要指定适当的值):
stap -r kernel_version script -m module_name
这里, kernel_version
涉及到目标内核的版本(在目标系统上经过 uname -r
命令输出),script
涉及到转换成测量模块的脚本,module_name
涉及测量模块要求的名称。
注:为了肯定运行的内核的架构,你可使用如下命令:
uname -m
一旦测量模块被编译完成,拷贝它到目标系统,而后用下面的命令加载它:
staprun module_name.ko
例如,为 2.6.18-92.1.10.el5 (x86_64 架构) 的目标内核从一个名称为 simple.stp 的 SystemTap 脚本建立一个测量模块 simple.ko,使用如下命令:
stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple
这将建立一个名为 simple.ko 的模块,为了使用这个测量模块,拷贝它到目标系统,而后在目标系统运行如下命令:
staprun simple.ko
注:重要!!!! 主机系统必须与目标系统是相同的架构以及相同的 Linux 发行版,为了使构建的测量模块能正常工做。
参考资料