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======================================