https://segmentfault.com/a/1190000000671438

在安装前,需要知道下自己的系统环境,我的环境如下:

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 包:

  • systemtap
  • systemtap-runtime

以 root 权限,运行以下命令安装:

yum install systemtap systemtap-runtime

注:在使用 SystemTap 前,需要安装内核信息包,可以运行以下命令安装:

stap-prep

如果安装失败,请手动安装,手动安装步骤请见手动安装内核信息包。

注:我在我的主机上运行 stap-prep 的报错信息如下

[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 的包。如下:

  • kernel-debuginfo
  • kernel-debuginfo-common
  • kernel-devel

需要安装和你内核对应版本的包,运行命令

uname -r
2.6.18-308.el5

可以指定你的内核是 2.6.18-308.el5,因此你需要的包如下:

  • kernel-debuginfo-2.6.18-308.el5.x86_64.rpm
  • kernel-devel-2.6.18-308.el5.x86_64.rpm
  • kernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm

重要!!!!注意:这三个包必须与你的内核版本匹配,不能你懂的。

下载这三个 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 测量模块并在另一台计算机上使用的过程。这个过程提供了以下好处:

  • 各种主机的内核信息包可以被安装在单台主机上
  • 每台目标机器仅仅需要被安装一个 RPM 包,为了使用生成的 SystemTap 测量模块:systemtap-runtime 包

为了简单起见,在这一节中使用以下术语:

  • 测量模块 - 从 SystemTap 脚本构建的内核模块。SystemTap 模块在主机系统上被构建,将在目标系统的内核上被加载。
  • 主机系统 - SystemTap 脚本编译测量模块的系统,为了在目标系统上加载它们。
  • 目标系统 - SystemTap 脚本构建测量模块系统
  • 目标内核 - 目标系统的内核,这个内核用于你加载或运行测量模块

为了配置一个主机系统和一个目标系统,需要完成以下步骤:

  • 在每台目标系统安装 systemtap-runtime 包
  • 通过在每台主机上运行 uname -r 命令来决定运行在每台目标系统上的内核
  • 在主机系统上安装 SystemTap。在主机系统上,你将可以为目标系统构建测量指令。关于怎样安装 SystemTap 的指令,可以参考“SystemTap 学习笔记 - 安装篇”。
  • 前期确定目标系统的内核版本,安装目标内核和在主机系统上的相关的 RPM 包,如 “SystemTap 学习笔记 - 安装篇” 中的 “手动安装必需的内核信息包” 所述。如果多个目标系统使用不同的目标内核,为在目标系统上使用的每个不同的内核重复这一步骤。

完成这些步骤后,你现在可以在主机系统上构建测量模块。为了构建测量模块,在主机系统上运行以下命令(一定要指定适当的值):

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 发行版,为了使构建的测量模块能正常工作。

SystemTap 学习笔记 - 安装篇的更多相关文章

  1. Redis学习笔记-安装篇(Centos7)

    1.安装 这里使用源代码安装的方式,如果你希望使用yum或者rpm包安装的方式,可以百度一下,安装方法可谓多如牛毛. # 下载安装包 # wget http://download.redis.io/r ...

  2. PHP学习笔记 - 进阶篇(11)

    PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...

  3. PHP学习笔记 - 进阶篇(9)

    PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...

  4. PHP学习笔记 - 进阶篇(2)

    PHP学习笔记 - 进阶篇(2) 函数 1.自定义函数 PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一 ...

  5. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  6. PHP学习笔记 - 进阶篇(10)

    PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...

  7. PHP学习笔记 - 进阶篇(8)

    PHP学习笔记 - 进阶篇(8) 日期与时间 取得当前的Unix时间戳 UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 0 ...

  8. PHP学习笔记 - 进阶篇(7)

    PHP学习笔记 - 进阶篇(7) 文件操作 读取文件内容 PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中. $conte ...

  9. PHP学习笔记 - 进阶篇(6)

    PHP学习笔记- 进阶篇(6) 会话控制(session与cookie) 当前的Cookie为: cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. ...

随机推荐

  1. <在此处打开命令窗口>替换为PowerShell打开模式

    Windows7中Shift+右键"在此处打开命令窗口"默认是采用cmd的方式打开. 把cmd替换为PowerShell的方式打开. 1. Ctrl + R 输入regedit进入 ...

  2. 迅为iTOP-4418嵌入式开发板初体验

    iTOP-4418开发板预装 Android4.4.4 系统, 支持9.7 寸.7 寸.4.3 寸屏幕. 参数:核心板参数 尺寸 50mm*60mm高度 核心板连接器为1.5mmCPU ARM Cor ...

  3. leetcode_Stone Game_dp_思维

    Alex和Lee玩游戏,共有偶数堆石头,石头总数为奇数,两人每次要么拿第一堆,要么拿最后一堆,两人以最优策略拿石堆(一次拿走完整的一堆),Alex先手,Alex赢返回True,否则返回False. 思 ...

  4. swift 语言评价

    杂而不精,一团乱麻!模式乱套,不适合作为一门学习和研究语言. 谢谢 LZ 介绍,看完之后更不想用 Swift 了.从 C++那里抄个 V-Table 来很先进嘛?别跟 C++一样搞什么 STL 就好了 ...

  5. iView webapp / Mint UI / MUI [前端UI]

    前端UI iView webapp一套高质量的 微信小程序 UI 组件库 https://weapp.iviewui.com/?from=iview Mint UI 基于 Vue.js 的移动端组件库 ...

  6. JAVA基础——设计模式之装饰者模式

    装饰模式 : 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用.    在软件设计中,对已有对象(新房)的功能进行扩展(装修).    把通用功能封装在装饰器中,用到的地方 ...

  7. DHCP和PXE

    继续学习,Let's go!DHCP和PXE都是什么呢?如果非科班出身,可能一脸懵逼,好多东西需要去学习了,真的,继续学吧,付出不一定会有回报,不付出肯定就是等死了,呵呵! 一.DHCP 真正需要手动 ...

  8. CGPathAddArc

    使用CGPathAddArc使UIView的Layer绕中心点旋转 2012-12-04 15:38 775人阅读 评论(0) 收藏 举报 animationAnimationiosiOSIOSlay ...

  9. swiper 旋转木马效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. 「 Luogu P1379 」 八数码难题

    # 解题思路 这题不难,主要就是考虑如何判重,如果直接在 $9$ 个位置上都比较一遍的话.你会得到下面的好成绩 所以考虑另一种方法: 将九个位置压成一个整数,并且因为只有九个数,所以不会超出 $int ...