zoukankan      html  css  js  c++  java
  • SystemTap 学习笔记

    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
    "); 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
    ", "Context switch", "COUNT")
      foreach ([task_prev, task_next] in csw_count- limit 20) {
        printf("%45s %10d
    ", fmt_task(task_prev, task_next), csw_count[task_prev, task_next])
      }
      printf("%45s %10d
    ", "idle", idle_count)
    
      delete csw_count
      delete idle_count
    }
    
    probe timer.s($1) {
      print_cswtop ()
      printf("--------------------------------------------------------------
    ")
    }
    

    执行脚本:

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

  • 相关阅读:
    三种renderman规范引擎的dice对比
    球形环境映射之angular与latlong格式互换
    SharePoint中的ASHX
    如何查看SharePoint未知错误的详细信息
    在SQL Server 2008设置发送邮件步骤详解
    项目管理软件对比
    海外云服务器VPS
    国内和国外域名注册商介绍
    快速将一个表的数据生成SQL插入语句
    使用sql server 链接服务器
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5975572.html
Copyright © 2011-2022 走看看