一、systemtap介绍

  SystemTap是一个强大的调试工具,是监控和跟踪运行中的Linux 内核的操作的动态方法,确切的说应该是一门调试语言,因为它有自己的语法,也有解析、编译、运行等过程(准确的说有五个阶段),但它主要解决的问题是收集Linux内核或者用户进程的信息,主要目的是调试。gdb、kgdb同是linux最强大的调试器,gdb和SystemTap不是竞争关系,而是互补关系,gdb能做的事情SystemTap做不到,比如断点/watch变量等等这些SystemTap都做不到,而SystemTap能做的事情gdb做不到或者非常麻烦才做到,比如很方便查看内核调试栈/嵌入C语言等等gdb就很难。

二、systemtap安装

1.安装步骤:

  1.1 yum install systemtap

  1.2 yum install kernel-devel  kernel-headers gcc elfutils

  1.3 通过 http://debuginfo.centos.org/6/x86_64/

下载kernel-debuginfo 以及kernel-debuginfo-common,要下载对应内核版本的(错误版本会提示semantic error: no match等报错);

         例如测试机器下载:

  执行rpm安装(先安装依赖包common):

  rpm -ivh kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64.rpm

  rpm -ivh kernel-debuginfo-2.6.32-279.el6.x86_64.rpm

  1.4  执行 stap-prep进行stap环境检查,如没有报错,表示stap可以正常使用。

  1.5 测试脚本执行查看是否成功(检查正在添加系统中的page_cache信息):

  stap -e 'probe vfs.add_to_page_cache {printf("dev=%x, devname=%s, ino=%d, index=%d, nrpages=%d\n", dev, devname, ino, index, nrpages)}'

三、实战应用及常用工具瓶颈

  1.故障处理中遇到的困境:

  1.1 iostat等命令看到的是系统级的统计,比如下例中我们看到/dev/vdb很忙,如果要追查是哪个进程导致的I/O繁忙,应该怎么办?

  

  进程的内核数据结构中包含了I/O数量的统计:

  struct task_struct {

        struct task_io_accounting ioac;
    };
 
  可以直接在 /proc/<pid>/io 中看到:

  # cat /proc/3088/io
 
   rchar: 125119 //在read(),pread(),readv(),sendfile等系统调用中读取的字节数
   wchar: 632    //在write(),pwrite(),writev(),sendfile等系统调用中写入的字节数
   syscr: 111    //调用read(),pread(),readv(),sendfile等系统调用的次数
   syscw: 79     //调用write(),pwrite(),writev(),sendfile等系统调用的次数
   read_bytes: 425984 //进程读取的物理I/O字节数,包括mmap pagein,在submit_bio()中统计的
   write_bytes: 0     //进程写出的物理I/O字节数,包括mmap pageout,在submit_bio()中统计的
   cancelled_write_bytes: 0 //如果进程截短了cache中的文件,事实上就减少了原本要发生的写I/O
 
  我们关心的是实际发生的物理I/O,从上面的注释可知,应该关注 read_bytes 和 write_bytes。请注意这都是历史累计值,从进程开始执行之初就一直累加。如果要 观察动态变化情况,可以使用 pidstat 命令,它就是利用了/proc/<pid>/io 中的原始数据计算单位时间内的增量:
 
  

  另外还有一个常用的命令 iotop 也可以观察进程的动态I/O:

          

pidstat 和 iotop 也有不足之处,它们无法具体到某个硬盘设备,如果系统中有很多硬盘设备,都在忙,而我们只想看某一个特定的硬盘的I/O来自哪些进程,这两个命令就帮不上忙了。怎么办呢?

  2.SystemTap查找方法:

  可以用上万能SystemTap工具。比如:我们希望找出访问/dev/vdb的进程,可以用下列脚本,它的原理是对submit_bio下探针:

[root@template ~]# cat io_vdb.stap
   #! /usr/bin/env stap
 
   global device_of_interest

probe begin {
      device_of_interest = $1
      printf ("device of interest: %x\n", device_of_interest)
    }
 
   probe kernel.function("submit_bio")
   {
      dev = $bio->bi_bdev->bd_dev
      if (dev == device_of_interest)
          printf ("[%s](%d) dev:0x%x rw:%d size:%d\n",
                  execname(), pid(), dev, $rw, $bio->bi_size)
   }

  这个脚本需要在命令行参数中指定需要监控的硬盘设备号,得到这个设备号(fc,10)的方法如下:

十六进制: (fc,10)---->(主设备号Major number(12-bit),次设备号Minor number(20-bit))  需要转换为10进制作为io_vdb.stap的入参数($1)

十进制:(252,10)

  

  stat /dev/vdb:

  cat /proc/devices:

  3.SystemTap 查证结果:

  3.1 查看某个分区或目录io访问情况:

  脚本执行命令:./io_vdb 264241171

  (264241171为 fc00013的十进制表示,因为 fc00010为/dev/vdb,我们的测试目录为/dev/vdb3,所以对应的次设备号变为13(fc,13))

执行grep命令进行验证io实际执行情况:

执行前:

  执行后:

  通过结果,我们看到是进程号为8446的grep命令在对/dev/vdb3进行读操作(rw:0)。

               

   Enjoyjing youeself!

 
  参照文章:https://www.cnblogs.com/Jeb15/p/7120568.html
 
 
 
 

systemtap安装的更多相关文章

  1. RHEL6 Systemtap 安装笔记

    以 RHEL6u3 为例 1  Systemtap 安装 yum install systemtap 跟systemtap有关的有6,7个,全装上,别偷懒 就用yum安装,别傻傻的去下rpm包,吃力不 ...

  2. SystemTap - 安装

    按照SystemTap Beginners Guide的Installation and Setup部分安装了SystemTap,没想到竟然还有点曲折,在这里纪录一下. 环境 Linux发行版本:Ce ...

  3. systemtap 安装试用

    1. 安装 yum install -y systemtap systemtap-runtime 2. 环境准备    a. 自动安装依赖 stap-prep b. 手动安装依赖 kernel-deb ...

  4. systemtap 安装 总结

    http://blog.soul11201.com/notes/2017/02/22/systemstap-install.html

  5. 【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap

    转自 http://blog.csdn.net/zklth/article/details/6248558 文章 http://blog.csdn.net/zklth/archive/2010/09/ ...

  6. CentOS 5.4 final下Systemtap的安装

    CentOS 5.4 final下Systemtap的安装  时间:2015-02-11来源:linux网站 作者:zklth  一.Systemtap运行环境需求   (1)linux kernel ...

  7. 转 -Linux 自检和 SystemTap (强大的内核调试工具)---包含下载地址

    下载: http://www.oschina.net/p/systemtap/ https://sourceware.org/systemtap/ftp/releases/   Linux 自检和 S ...

  8. Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 3 部分: Systemtap

    Systemtap的原理,Systemtap与DTrace比较,以及安装要求和安装步骤本系列文章详细地介绍了一个Linux下的全新的调式.诊断和性能测量工具Systemtap和它所依赖的基础kprob ...

  9. Linux systemtap定位系统IO资源使用情况(ok)

    一.systemtap介绍 SystemTap是一个强大的调试工具,是监控和跟踪运行中的Linux 内核的操作的动态方法,确切的说应该是一门调试语言,因为它有自己的语法,也有解析.编译.运行等过程(准 ...

随机推荐

  1. RISC处理器

     RISC(精简指令集算法)处理器是经过硬件的精简只执行很有限的最常用的那部分指令的处理器.因为通过研究发现,只有 大约 20%的指令是最常用的,把处理器能执行的指令数目减少到 最低限度,对它们的执行 ...

  2. MonoDevelop 设置

    菜单:Tools->Options Text Editor Behavior Automatic behaviors × enable on the fly code formatting Sy ...

  3. VC中使用ADO操作数据库的方法

    源地址:http://blog.csdn.net/xiaobai1593/article/details/7459862 准备工作: (1).引入ADO类 #import "c:\progr ...

  4. hibernate的异常 Session was already closed

    今天写hibernate时候遇到一些异常 代码: Session session = sessionFactory.getCurrentSession(); session.beginTransact ...

  5. 面向对象三大特性一一继承(inheritance)和组合(Composition)

    记住2句话(常识),像个正常人思考! 1.“  is-a ”关系 用 继承! 学生是人,学生继承人这个类, 2. “has-a ”关系 用 组合!电脑有显卡,那么我们就在计算机类中增加显卡属性来复用显 ...

  6. 吴裕雄 实战PYTHON编程(4)

    import hashlib md5 = hashlib.md5()md5.update(b'Test String')print(md5.hexdigest()) import hashlib md ...

  7. xpath定位--绝对与相对的定位

    xpath定位--绝对与相对的定位: xpath定位即为xml路径语言,它是一种用来确定xml文档中某部分位置的语言,xpath基于xml的树状结构,提供在数据结构中找寻节点的能力 xpath的相对定 ...

  8. 工作流和过程自动化框架 Camunda BPM

    Camunda BPM 是一个灵活的工作流和过程自动化框架,它的核心是一个在Java虚拟机内部运行的原生BPMN 2.0流程引擎,因此它可以嵌入到任何Java应用程序或运行时容器中.Camunda B ...

  9. import变量名,导入模块

    想要把不同的模块名赋值到变量,然后import进来   直接使用下面的方法是不行的: moudle="os" import moudle   会提示下面的错误: ImportErr ...

  10. java重载(实现同一方法名,不同参数)

    背景:  前几天写连接数据库时,因为要执行sql,有的是指向得到所有的执行结果,有的是想根据执行结果获得某一个字段的结果.这时我想通过同一个方法名,不同的参数,获得不同的结果.结果发现java的方法竟 ...