aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/handbook/dtrace
diff options
context:
space:
mode:
Diffstat (limited to 'zh_CN.GB2312/books/handbook/dtrace')
-rw-r--r--zh_CN.GB2312/books/handbook/dtrace/Makefile18
-rw-r--r--zh_CN.GB2312/books/handbook/dtrace/chapter.sgml370
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 ... -->