diff options
Diffstat (limited to 'zh_CN.GB2312/books/handbook/dtrace')
-rw-r--r-- | zh_CN.GB2312/books/handbook/dtrace/Makefile | 18 | ||||
-rw-r--r-- | zh_CN.GB2312/books/handbook/dtrace/chapter.sgml | 370 |
2 files changed, 388 insertions, 0 deletions
diff --git a/zh_CN.GB2312/books/handbook/dtrace/Makefile b/zh_CN.GB2312/books/handbook/dtrace/Makefile new file mode 100644 index 0000000000..5781077dd1 --- /dev/null +++ b/zh_CN.GB2312/books/handbook/dtrace/Makefile @@ -0,0 +1,18 @@ +# +# Build the Handbook with just the content from this chapter. +# +# The FreeBSD Simplified Chinese Project +# Original Revision: 1.1 +# +# $FreeBSD$ +# + +CHAPTERS= dtrace/chapter.sgml + +VPATH= .. + +MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} + +DOC_PREFIX?= ${.CURDIR}/../../../.. + +.include "../Makefile" diff --git a/zh_CN.GB2312/books/handbook/dtrace/chapter.sgml b/zh_CN.GB2312/books/handbook/dtrace/chapter.sgml new file mode 100644 index 0000000000..f391d34443 --- /dev/null +++ b/zh_CN.GB2312/books/handbook/dtrace/chapter.sgml @@ -0,0 +1,370 @@ +<!-- +Recently I suggested to myself that this should become a profiling +and debugging chapter, which covers things like ktrace(1) and +using other debugging (like -x in shell scripts). But then I +realized that, over time and while DTrace becomes better supported, +that might make this chapter too large. +--> + +<!-- + The FreeBSD Documentation Project + Original Revision: 1.5 + $FreeBSD$ +--> + +<chapter id="dtrace"> + <chapterinfo> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Written by </contrib> + </author> + </authorgroup> + </chapterinfo> + + <title>DTrace</title> + + <sect1 id="dtrace-synopsis"> + <title>概述</title> + + <indexterm><primary>DTrace</primary></indexterm> + <indexterm> + <primary>DTrace support</primary> + <see>DTrace</see> + </indexterm> + + <para>DTrace,也称为动态跟踪,是由 &sun; + 开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具。 + 在任何情况下它都不是一个调试工具, + 而是一个实时系统分析寻找出性能及其他问题的工具。</para> + + <para>DTrace 是个特别好的分析工具,带有大量的帮助诊断系统问题的特性。 + 还可以使用预先写好的脚本利用它的功能。 + 用户也可以通过使用 DTrace D 语言创建他们自己定制的分析工具, + 以满足特定的需求。</para> + + <para>在阅读了这一章节之后,你将了解:</para> + + <itemizedlist> + <listitem> + <para>DTrace 是什么,它提供了些哪些特性。</para> + </listitem> + + <listitem> + <para>DTrace 在 &solaris; 与 &os; 上的实现的差别。</para> + </listitem> + + <listitem> + <para>如何在 &os; 上开启和使用 DTrace。</para> + </listitem> + </itemizedlist> + + <para>在阅读这一章节之前,你应该了解:</para> + + <itemizedlist> + <listitem> + <para>了解 &unix; 和 &os; 的基本知识 + (<xref linkend="basics">)。</para> + </listitem> + + <listitem> + <para>熟悉基本的内核配置/编译 + (<xref linkend="kernelconfig">).</para> + </listitem> + + <listitem> + <para>熟悉 &os; 有关的安全知识 + (<xref linkend="security">)。</para> + </listitem> + + <listitem> + <para>了解如何获取和重新编译 &os; 源代码 + (<xref linkend="cutting-edge">)。</para> + </listitem> + </itemizedlist> + + <!-- + Temporary warning to avoid listing experimental versions + and production versions of FreeBSD with this technology. + --> + <warning> + <para>这项特性目前仍被认为是试验性的。 + 有些选项功能性缺失,另有一些可能还无法运行。最终, + 这个特性会适合用于生产,届时这篇文档也会做些适当的修改。</para> + </warning> + </sect1> + + <sect1 id="dtrace-implementation"> + <title>实现上的差异</title> + + <para>虽然 &os; 上的 DTrace 与 &solaris; 上的非常相似, + 在继续深入之前我们需要说明一下存在的差异。 + 用户首先会注意到的便是 &os; 上的 DTrace 需要明确的被启用。 + DTrace 相关的内核选项和模块必须开启后才能正常工作。 + 稍后我们会作详细介绍。</para> + + <para>有一个 <literal>DDB_CTF</literal> + 内核选项用来开启从内核与内核模块加载 + <literal>CTF</literal> 数据。 + <acronym>CTF</acronym> 是 &solaris; Compact C Type Format + 封装了类似于 <acronym>DWARF</acronym> 和 venerable stabs + 简化的调试信息。<acronym>CTF</acronym> 数据是由 + <command>ctfconvert</command> 和 <command>ctfmerge</command> + 工具加入二进制文件的。<command>ctfconvert</command> + 工具分析由编译器生成的 <acronym>DWARF</acronym> 调试 + <acronym>ELF</acronym> section, + <command>ctfmerge</command> 合并目标文件的 + <acronym>CTF</acronym> <acronym>ELF</acronym> section + 到可执行文件或共享库。更多关于在启用 &os; + 内核上启用此项的详细内容即将完成。</para> + + <para>比起 &solaris;, &os; 有几个不同提供器。 + 最值得注意的时 <literal>dtmalloc</literal> 提供器, + 可以让你根据类型追踪 &os; 内核中的 + <function>malloc()</function>。</para> + + <para>只有 <username>root</username> 可以使用 &os; 上的 DTrace。 + 这是由系统安全上的差异造成的,&solaris; 提供了一些 &os; + 上还为实现的低层的安全检查。同样, + <devicename>/dev/dtrace/dtrace</devicename> 也被严格的限制为仅供 + <username>root</username> 用户访问。</para> + + <para>最后,DTrace 为 &sun; <acronym>CDDL</acronym> + 许可下发布的软件。随 &os; 发行的 + <literal>Common Development and Distribution License</literal> + 可以在查阅 + <filename>/usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE</filename> + 或者通过 + <ulink url="http://www.opensolaris.org/os/licensing"></ulink> + 查看在线版本。</para> + + <para>这个许可表示带有 DTrace 选项的 &os; 内核仍为 + <acronym>BSD</acronym> 许可;然而以二进制发布模块, + 或者加载二进制模块则需遵守 <acronym>CDDL</acronym>。</para> + </sect1> + + <sect1 id="dtrace-enable"> + <title>启用 DTrace 支持</title> + + <para>在内核配置文件中加入以下几行来开启对 DTrace 的支持:</para> + + <programlisting>options KDTRACE_HOOKS +options DDB_CTF</programlisting> + + <note> + <para>使用 AMD64 架构的需要在内核配置文件中加入如下这行:</para> + + <programlisting>options KDTRACE_FRAME</programlisting> + + <para>此选项提供了对 <acronym>FBT</acronym> 特性的支持。 + DTrace 可以在没有此选项的情况下正常工作, + 但是函数边界跟踪便会有所限制。</para> + </note> + + <para>所有的源代码都必须重新使用 <acronym>CTF</acronym> + 选项编译安装。重新编译 &os; 源代码可以通过以下的命令完成:</para> + + <!-- XXXTR: WITH_CTF has been reported to leave a user with a + broken system when used with buildworld. Until this is + fixed, comment out those parts. When uncommenting, kill + the extra screen. + --> + + <!-- XXXTR: WITH_CTF has been reported to leave a user with a + broken system when used with buildworld. Until this is + fixed, comment out those parts. When uncommenting, kill + the extra screen. + --> + + <screen>&prompt.root; <userinput>cd /usr/src</userinput> +<!-- &prompt.root; <userinput>make WITH_CTF=1 buildworld</userinput> --> +&prompt.root; <userinput>make WITH_CTF=1 kernel</userinput></screen> +<!-- &prompt.root; <userinput>make WITH_CTF=1 installworld</userinput> +&prompt.root; <userinput>mergemaster -Ui</userinput></screen> --> + + <para>系统需要重新启动。</para> + + <para>在重新启动和新内核载入内存之后,需要添加 Korn shell + 的支持。因为 DTrace 工具包有一些工具是由 <command>ksh</command> + 写的。安装 <filename role="package">shells/ksh93</filename>。 + 同样也可以通过 <filename role="package">shells/pdksh</filename> + 或者 <filename role="package">shells/mksh</filename> + 使用这些工具。</para> + + <para>最后是获得最新的 DTrace 工具包。 + 当前版本可以通过下面的链接找到 + <ulink url="http://www.opensolaris.org/os/community/dtrace/dtracetoolkit/"></ulink>。 + 这个工具包含有一个安装机制,尽管如此,并不需要安装便可使用它们。</para> + </sect1> + + <sect1 id="dtrace-using"> + <title>使用 DTrace</title> + + <para>在使用 DTrace 的功能之前,DTrace 设备必须存在。 + 使用如下的命令装载此设备:</para> + + <screen>&prompt.root; <userinput>kldload dtraceall</userinput></screen> + + <para>DTrace 支持现在应该可以使用了。 + 管理员现在可以使用如下的命令查看所有的探测器:</para> + + <screen>&prompt.root; <userinput>dtrace -l | more</userinput></screen> + + <para>所有的输出都传递给 <command>more</command> 工具, + 因为它们会很快超出屏幕的显示区域。此时,DTrace + 应该被认为是能够正常工作的了。现在是该考察工具包的时候了。</para> + + <para>工具包是实现写好的一堆脚本,与 DTrace 一起运行来收集系统信息。 + 有脚本用来检查已打开的文件,内存,<acronym>CPU</acronym> + 使用率和许多东西。使用如下的命令解开脚本:</para> + + <screen>&prompt.root; <userinput>gunzip -c DTraceToolkit* | tar xvf -</userinput></screen> + + <para>使用 <command>cd</command> 命令切换到那个目录, + 并修改所有文件的可执行权限,把那些名字小写的文件权限改为 + <literal>755</literal>。</para> + + <para>所有这些脚本都需要修改它们的内容。那些指向 + <filename>/usr/bin/ksh</filename> 需要修改成 + <filename>/usr/local/bin/ksh</filename>,另外使用 + <filename>/usr/bin/sh</filename> 需要变更为 + <filename>/bin/sh</filename>,最后还有使用 + <filename>/usr/bin/perl</filename> 的需要变更为 + <filename>/usr/local/bin/perl</filename>。</para> + + <important> + <para>此刻还需谨慎提醒一下读者 &os; 的 DTrace 支持仍是 + <emphasis>不完整的</emphasis> 和 <emphasis>试验性</emphasis> 的。 + 这些脚本中的大多数都无法运行,因为它们过于针对 &solaris; + 或者使用了目前还不支持的探测器。</para> + </important> + + <para>在撰写这篇文章的时候,DTrace 工具包中只有两个脚本在 + &os; 上是完全支持的: + <filename>hotkernel</filename> 和 <filename>procsystime</filename> + 脚本。这两个脚本便是我们下一部分将要探讨的:</para> + + <para><filename>hotkernel</filename> + 被设计成验明哪个函数占用了内核时间。 + 正常运行的话,它将生成类似以下的输出:</para> + + <screen>&prompt.root; <userinput>./hotkernel</userinput> +Sampling... Hit Ctrl-C to end.</screen> + + <para>系统管理员必须使用 + <keycombo action="simul"> + <keycap>Ctrl</keycap><keycap>C</keycap> + </keycombo> 组合键停止这个进程。 + 紧接着中止之后,脚本便会一张内核函数与测定时间的列表, + 使用增量排序输出:</para> + + + <screen>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%</screen> + + <!-- XXXTR: I attempted to use objdump and nm on /boot/kernel/kernel + to find 0xc10981a5, but to no avail. It would be nice to know + how we should look that up. --> + + <para>这个脚本也能与内核模块一起工作。要使用此特性, + 用 <option>-m</option> 标志运行脚本:</para> + + <screen>&prompt.root; <userinput>./hotkernel -m</userinput> +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%</screen> + + <!-- XXXTR: I was unable to match these up with output from + kldstat and kldstat -v and grep. Maybe I'm missing something + seriously obvious. It is 5AM btw. --> + + <para><filename>procsystime</filename> + 脚本捕捉并打印给定 <acronym>PID</acronym> 的系统调用时间。 + 在下面的例子中,新生成了一个 <filename>/bin/csh</filename> + 实例。<filename>procsystime</filename> 执行后则等待在新运行的 + <command>csh</command> 上键入一些命令。 这是测试的结果:</para> + + <screen>&prompt.root; <userinput>./procsystime -n csh</userinput> +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</screen> + + <para>正如显示的那样,<function>read</function> + 系统调用似乎使用了最多的纳秒单位时间, + <function>getpid()</function> 系统调用使用了最少的时间。</para> + </sect1> + + <sect1 id="dtrace-language"> + <title>D 语言</title> + + <para>DTrace 工具包包括了很多由 DTrace 特殊语言写成的脚本。 + 在 &sun; 的文档中称这类语言为 <quote>D 语言</quote>, + 它与 C++ 非常类似。对此语言更深入的讨论则超出了这篇文章的范围。 + 更多相关的讨论可以在 + <ulink url="http://wikis.sun.com/display/DTrace/Documentation"></ulink> + 找到。</para> + </sect1> +</chapter> + + <!-- XXXTR: Should probably put links and resources here. I'm + nervous about this chapter as it may require a partial + re-write and large modification once DTrace is complete, but + at least we can get everyone started ... --> |