首页 > 代码库 > 在Oracle Linux上安装dtrace

在Oracle Linux上安装dtrace

http://www.ohsdba.cn/index.php?g=Home&m=Article&a=show&id=171

 
时间: 2016-10-09 00:40:04  | 作者: ohsdba  | English 
如非注明,本站文章皆为原创。欢迎转载,转载时请注明出处和作者信息。
DTrace(dynamic tracing)是Sun Solaris系统上主要的性能诊断工具,可以对kernel和用户应用程序进行动态跟踪,并且对系统运行不构成任何危险的技术,后被Oracle公司收购,遵循CDDL(Common Development and Distribution License),后来Oracle把这一技术移植到了Oracle Linux(在2012年12月正式发布)。到目前为止,Oracle Linux的DTrace仅限于Oracle Unbreakable Enterprise Kernel,无法兼容其他发行版Linux,在当时也引起了一场纷争(http://lwn.net/Articles/483107/)。

 

在Oracle Linux上使用DTrace可以帮你
    观察整个软件体系、操作系统内核、系统库和应用程序的动态运行时性能
    通过在运行时定义实时探测点识别性能瓶颈
    开发探测器在谓词控制下触发时执行的脚本
    检测并报告内存访问错误,而不是听任系统崩溃

 

如何安装dtrace

一般情况下,DTrace软件包不能从Public yum上获取,必须先注册ULN(Unbreakable Linux Network),然后才能下载和安装

yum install dtrace-utils

注意:在安装dtrace-utils之前需要安装dtrace-modules(这个可以从公共yum上获取)

其实只需要一个dtrace-utils的包,需要这个包做测试的,可以发信息给我(只限测试学习测试使用)

[root@ovm ~]# rpm -ivh dtrace-utils-0.5.0-4.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:dtrace-utils           ########################################### [100%]
[root@ovm ~]#
[root@ovm ~]# ls -l /usr/sbin/dtrace
-rwxr-xr-x. 1 root root 36880 Nov  4  2015 /usr/sbin/dtrace
[root@ovm ~]# 

dtrace帮助信息
[root@ovm ~]# dtrace
Usage: dtrace [-32|-64] [-aACeFGhHlqSvVwZ] [-b bufsz] [-c cmd] [-D name[=def]]
        [-I path] [-L path] [-o output] [-p pid] [-s script] [-U name]
        [-x opt[=val]] [-X a|c|s|t]

        [-P provider [[ predicate ] action ]]
        [-m [ provider: ] module [[ predicate ] action ]]
        [-f [[ provider: ] module: ] func [[ predicate ] action ]]
        [-n [[[ provider: ] module: ] func: ] name [[ predicate ] action ]]
        [-i probe-id [[ predicate ] action ]] [ args ... ]

        predicate -> ‘/‘ D-expression ‘/‘
           action -> ‘{‘ D-statements ‘}‘

        -32 generate 32-bit D programs and ELF files
        -64 generate 64-bit D programs and ELF files

        -a  claim anonymous tracing state
        -A  generate driver.conf(4) directives for anonymous tracing
        -b  set trace buffer size
        -c  run specified command and exit upon its completion
        -C  run cpp(1) preprocessor on script files
        -D  define symbol when invoking preprocessor
        -e  exit after compiling request but prior to enabling probes
        -f  enable or list probes matching the specified function name
        -F  coalesce trace output by function
        -G  generate an ELF file containing embedded dtrace program
        -h  generate a header file with definitions for static probes
        -H  print included files when invoking preprocessor
        -i  enable or list probes matching the specified probe id
        -I  add include directory to preprocessor search path
        -l  list probes matching specified criteria
        -L  add library directory to library search path
        -m  enable or list probes matching the specified module name
        -n  enable or list probes matching the specified probe name
        -o  set output file
        -p  grab specified process-ID and cache its symbol tables
        -P  enable or list probes matching the specified provider name
        -q  set quiet mode (only output explicitly traced data)
        -s  enable or list probes according to the specified D script
        -S  print D compiler intermediate code
        -U  undefine symbol when invoking preprocessor
        -v  set verbose mode (report stability attributes, arguments)
        -V  report DTrace API version
        -w  permit destructive actions
        -x  enable or modify compiler and tracing options
        -X  specify ISO C conformance settings for preprocessor
        -Z  permit probe descriptions that match zero probes        
[root@ovm ~]# 

 

探测器和提供程序

 

要使用DTrace,需要指定内核中感兴趣的位置(称为探测器),DTrace可以绑定一个请求来执行一组操作,如记录堆栈跟踪、时间戳或函数参数。探测器的作用类似于深埋于操作系统中用于记录信息的可编程遥感传感器。探测器触发时,DTrace会从其收集数据并向您回报数据。Oracle Linux DTrace探测器运行于被称作提供程序的DTrace内核模块中,提供程序执行插装以支持探测器。

如何使用modprobe命令加载支持您需要使用的DTrace探测器的模块。例如,如果要使用proc提供程序发布的探测器,将加载systrace模块:

# modprobe systrace 

内核模块列表
 内核模块说明
dtrace dtrace 为 DTrace 本身提供探测器:BEGIN、END、ERROR,用于可选地在跟踪开始之前初始化 DTrace、执行跟踪后处理、处理执行期间其他探测器中的意外错误。
io io 提供与数据输入和输出有关的监视探测器。
proc proc 为监视进程创建和终止、新程序映像执行以及发送和处理信号提供探测器。
profile profile 提供与定时中断关联的探测器。可以使用这些探测器以固定时间间隔对系统状态进行采样。
sched sdt 提供与 CPU 调度有关的探测器。
sdt sdt 提供静态定义的、位于内核中多个感兴趣的重要位置的跟踪探测器。
syscall systrace 在每个系统调用的入口点和返回点提供探测器。这些探测器对了解应用程序与底层系统之间的交互尤为有用。

DTrace探测器来自一组被称作提供程序的内核模块,每个提供程序执行特定类型的插装来创建探测器。使用DTrace时,每个提供程序都有机会发布它可以为DTrace框架提供的探测器。然后,您可以对已发布的任何探测器启用和绑定跟踪操作。要列出系统上的所有可用探测器,可以使用dtrace -l。根据Oracle Linux平台、安装的软件和加载的提供程序模块的不同,探测器的数量也不同。
[root@ovm ~]# dtrace -l|wc -l
622
[root@ovm ~]#
[root@ovm ~]# dtrace -l|more
   ID   PROVIDER            MODULE                          FUNCTION NAME
    1     dtrace                                                     BEGIN
    2     dtrace                                                     END
    3     dtrace                                                     ERROR
每个探测器都显示一个整数 ID 和一个易于理解的名称,由四部分组成,在 dtrace 输出中显示为单独的四列。
    provider  — 发布此探测器的 DTrace 提供程序的名称。提供程序名称通常对应于执行插装以启用探测器的 DTrace 内核模块的名称
    module    — 如果此探测器对应于特定程序位置,则为探测器所在内核模块的名称
    function  — 如果此探测器对应于特定程序位置,则为探测器所在程序函数的名称
    name      — 探测器名称的最后一部分,即表明探测器语义的名称
当提及具体探测器时,这些部分一起显示,中间用冒号分隔,如:
provider:module:function:name

dtrace命令样本
# New processes with arguments
dtrace -n ‘proc:::exec-success { trace(curpsinfo->pr_psargs); }‘

# Files opened by process
dtrace -n ‘syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }‘

# Syscall count by program
dtrace -n ‘syscall:::entry { @num[execname] = count(); }‘

# Syscall count by syscall
dtrace -n ‘syscall:::entry { @num[probefunc] = count(); }‘

# Syscall count by process
dtrace -n ‘syscall:::entry { @num[pid,execname] = count(); }‘

# Disk size by process
dtrace -n ‘io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }‘

# Pages paged in by process
dtrace -n ‘vminfo:::pgpgin { @pg[execname] = sum(arg0); }‘

调用D语言脚本syscalls.d显示进程3961正在使用的系统调用及其频率
[root@ovm ~]# cat syscalls.d
#!/usr/sbin/dtrace -qs
syscall:::entry
/pid == $1/
{
  @num[probefunc] = count();
}
[root@ovm ~]# ./syscalls.d 3961
^C

  rt_sigreturn                                                      1
  shutdown                                                          1
  accept                                                            2
  clone                                                             3
  connect                                                           3
  gettid                                                            3
  set_robust_list                                                   3
  socket                                                            3
  exit                                                              4
  getsockopt                                                        4
  getsockname                                                       5
  madvise                                                           5
  close                                                             6
  dup2                                                              6
  sched_getaffinity                                                 6
  mmap                                                              7
  epoll_ctl                                                        10
  rt_sigprocmask                                                   13
  setsockopt                                                       13
  fcntl                                                            15
  write                                                            17
  read                                                             23
  epoll_wait                                                       39
  mprotect                                                         51
  newstat                                                          84
  ioctl                                                            95
  poll                                                            140
  sendto                                                          265
  recvfrom                                                        284
  futex                                                          1714
[root@ovm ~]# 


Reference
https://en.wikipedia.org/wiki/DTrace
http://docs.oracle.com/cd/E37670_01/E50705/html/ol_intro_dtrace.html
http://docs.oracle.com/cd/E37670_01/E38608/html/dt_gs_about.html
http://www.oracle.com/technetwork/cn/articles/servers-storage-admin/dtrace-on-linux-1956556-zhs.html
http://dtrace.org/blogs/
http://dtrace.org/guide/preface.html
https://blogs.oracle.com/linux/entry/announcement_dtrace_for_oracle_linux
http://www.ibm.com/developerworks/cn/aix/library/au-dtraceprobes.html
http://www.oracle.com/technetwork/server-storage/solaris10/solaris-dtrace-wp-167895.pdf

https://github.com/dtrace4linux/linux

在Oracle Linux上安装dtrace