FreeBSD 使用手册
上一页 | 第25章 　DTrace | 下一页

# 25.4 使用 DTrace

在使用 DTrace 的功能之前，DTrace 设备必须存在。 使用如下的命令装载此设备：

    # kldload dtraceall

DTrace 支持现在应该可以使用了。 管理员现在可以使用如下的命令查看所有的探测器：

    # dtrace -l | more

所有的输出都传递给 `more` 工具， 因为它们会很快超出屏幕的显示区域。此时，DTrace 应该被认为是能够正常工作的了。现在是该考察工具包的时候了。

工具包是实现写好的一堆脚本，与 DTrace 一起运行来收集系统信息。 有脚本用来检查已打开的文件，内存，CPU 使用率和许多东西。使用如下的命令解开脚本：

    # gunzip -c DTraceToolkit* | tar xvf -

使用 `cd` 命令切换到那个目录， 并修改所有文件的可执行权限，把那些名字小写的文件权限改为 `755`。

所有这些脚本都需要修改它们的内容。那些指向 `/usr/bin/ksh` 需要修改成 `/usr/local/bin/ksh`，另外使用 `/usr/bin/sh` 需要变更为 `/bin/sh`，最后还有使用 `/usr/bin/perl` 的需要变更为 `/usr/local/bin/perl`。

> 重要: 此刻还需谨慎提醒一下读者 FreeBSD 的 DTrace 支持仍是 不完整的 和 试验性 的。 这些脚本中的大多数都无法运行，因为它们过于针对 Solaris" 或者使用了目前还不支持的探测器。

在撰写这篇文章的时候，DTrace 工具包中只有两个脚本在 FreeBSD 上是完全支持的： `hotkernel` 和 `procsystime` 脚本。这两个脚本便是我们下一部分将要探讨的：

`hotkernel` 被设计成验明哪个函数占用了内核时间。 正常运行的话，它将生成类似以下的输出：

    # ./hotkernel
    Sampling... Hit Ctrl-C to end.

系统管理员必须使用 Ctrl+C 组合键停止这个进程。 紧接着中止之后，脚本便会一张内核函数与测定时间的列表， 使用增量排序输出：

    kernel`_thread_lock_flags                                   2   0.0%
    0xc1097063                                                  2   0.0%
    kernel`sched_userret                                        2   0.0%
    kernel`kern_select                                          2   0.0%
    kernel`generic_copyin                                       3   0.0%
    kernel`_mtx_assert                                          3   0.0%
    kernel`vm_fault                                             3   0.0%
    kernel`sopoll_generic                                       3   0.0%
    kernel`fixup_filename                                       4   0.0%
    kernel`_isitmyx                                             4   0.0%
    kernel`find_instance                                        4   0.0%
    kernel`_mtx_unlock_flags                                    5   0.0%
    kernel`syscall                                              5   0.0%
    kernel`DELAY                                                5   0.0%
    0xc108a253                                                  6   0.0%
    kernel`witness_lock                                         7   0.0%
    kernel`read_aux_data_no_wait                                7   0.0%
    kernel`Xint0x80_syscall                                     7   0.0%
    kernel`witness_checkorder                                   7   0.0%
    kernel`sse2_pagezero                                        8   0.0%
    kernel`strncmp                                              9   0.0%
    kernel`spinlock_exit                                       10   0.0%
    kernel`_mtx_lock_flags                                     11   0.0%
    kernel`witness_unlock                                      15   0.0%
    kernel`sched_idletd                                       137   0.3%
    0xc10981a5                                              42139  99.3%

这个脚本也能与内核模块一起工作。要使用此特性， 用 `-m` 标志运行脚本：

    # ./hotkernel -m
    Sampling... Hit Ctrl-C to end.
    ^C
    MODULE                                                  COUNT   PCNT
    0xc107882e                                                  1   0.0%
    0xc10e6aa4                                                  1   0.0%
    0xc1076983                                                  1   0.0%
    0xc109708a                                                  1   0.0%
    0xc1075a5d                                                  1   0.0%
    0xc1077325                                                  1   0.0%
    0xc108a245                                                  1   0.0%
    0xc107730d                                                  1   0.0%
    0xc1097063                                                  2   0.0%
    0xc108a253                                                 73   0.0%
    kernel                                                    874   0.4%
    0xc10981a5                                             213781  99.6%

`procsystime` 脚本捕捉并打印给定 PID 的系统调用时间。 在下面的例子中，新生成了一个 `/bin/csh` 实例。`procsystime` 执行后则等待在新运行的 `csh` 上键入一些命令。 这是测试的结果：

    # ./procsystime -n csh
    Tracing... Hit Ctrl-C to end...
    ^C

    Elapsed Times for processes csh,

             SYSCALL          TIME (ns)
              getpid               6131
           sigreturn               8121
               close              19127
               fcntl              19959
                 dup              26955
             setpgid              28070
                stat              31899
           setitimer              40938
               wait4              62717
           sigaction              67372
         sigprocmask             119091
        gettimeofday             183710
               write             263242
              execve             492547
               ioctl             770073
               vfork            3258923
          sigsuspend            6985124
                read         3988049784

正如显示的那样，`read` 系统调用似乎使用了最多的纳秒单位时间， `getpid()` 系统调用使用了最少的时间。

上一页 | 起始页 | 下一页
启用 DTrace 支持 | 上一级 | D 语言

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.