内容


DB2 基础

介绍 DB2 UDB 跟踪功能

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: DB2 基础

敬请期待该系列的后续内容。

此内容是该系列的一部分:DB2 基础

敬请期待该系列的后续内容。

简介

在使用 DB2 UDB 时,有时候您可能会碰到一条错误消息,该消息指示您 "get a trace and call IBM Support"(获得跟踪信息并联系 IBM 技术支持代表)、 "[turn] on trace [and] examine the trace record"([打开]跟踪[和]检查跟踪记录),或者 "contact your technical [support] representative with the following information: problem description, SQLCODE, SQLCA contents (if possible)and trace file (if possible)"(联系您的技术[支持]代表,并提供以下信息:问题描述、SQLCODE、SQLCA 内容(如果有的话),以及跟踪文件(如果有的话))。或者,当您向 IBM 技术支持代表报告一个问题时,您就可能被要求执行一次跟踪,以捕捉有关您所在环境的详细信息。

在分析重复出现的问题时,DB2 跟踪特别有用,它可以大大方便支持代表在问题确定方面的工作。但是,究竟什么 跟踪,如何进行跟踪呢?本文将向您介绍 DB2 跟踪功能和 db2trc 命令,同时将展示(通过实际的示例)如何捕捉跟踪信息,这曾是您需要做的。

理解 DB2 跟踪

DB2 跟踪实质上是运行跟踪程序时捕捉到的控制流信息(函数和相关参数值)的日志。对于那些 DB2 技术支持代表,如果只凭错误消息返回的信息难于解决他们正试图诊断的问题,那么跟踪就非常有用。

可以将跟踪限定到一个特定的组件(例如缓冲池服务)。这种行为称作 屏蔽(masking)。通过屏蔽跟踪,有助于减少所捕捉的信息量。当进行跟踪时,应尽量使用最小的场景来再现问题;否则,被捕捉的数据量可能会令人生畏。

注意,在诊断错误时,跟踪信息并不总是有用。例如,在以下情况下,它可能不会捕捉错误状况:

  • 跟踪缓冲区设置得不够大,不足以容纳一组完整的相关跟踪事件。
  • 跟踪没有包括新出现的错误情形。

DB2 跟踪功能是通过 db2trc 命令的方式来控制的,可以用该命令来启动和停止跟踪,以及格式化捕捉到的跟踪信息。

使用 db2trc 命令

您可以使用 db2trc 命令来捕捉跟踪信息,并将该信息格式化成可读的文本。可以在操作系统命令提示符下或者从一个 shell 脚本中发出 db2trc 命令。虽然您可以选择将跟踪信息存储到文件(而不是内存),但这样会降低跟踪的速度。不过,如果新出现的问题使您不能将跟踪信息(从内存)“转储”到文件中,直接将跟踪信息存储到文件也许是您惟一的选择。其方法是,在问题出现后,立即转储跟踪信息,然后关闭跟踪,最后按照时间顺序或者按照进程或线程来格式化事件数据。

图 1 显示了 db2trc 命令的语法。该命令的选项可以归结为两大类:收集(collection)和解析(parsing)。

  • 收集选项包括打开或关闭跟踪;指定跟踪缓冲区大小;指定或更改跟踪选项;转储跟踪信息;以及清除跟踪缓冲区。
  • 解析选项包括按照时间顺序或者按照进程或线程来排序格式化的跟踪记录。

跟踪选项包括以下功能:指定一个 mask,以捕捉那些能满足指定标准(例如,只捕捉与特定函数或组件相关的记录)的跟踪记录;只跟踪指定的进程和线程组合;以及请求(相关的)时间戳数据。

您可以跟踪 DB2 实例或 DB2 Administration Server (DAS) 实例。跟踪 DB2 实例是默认行为。为跟踪 DB2 实例,您无需指定实例名 db2 。本文中的示例就是只跟踪默认 DB2 实例的情况。

注意,对于 db2trc 命令的大多数选项, -u 选项是访问命令行帮助的便捷方法。

图 1. 展示 db2trc 命令主要选项的语法图
db2trc 语法
db2trc 语法

开始跟踪

理解 db2trc 命令的主要选项的最好方法就是去试一下。我们将研究一个非常简单的示例,该示例使用 DB2 UDB 附带的 SAMPLE 数据库。首先,我们将打开跟踪功能,同时指定一个 8-MB 的跟踪缓冲区。我们将使用 -i 选项将跟踪信息存放到共享内存(而不是一个文件),在这种情况下,当缓冲区被充满时,就立即停止跟踪。(另一方面, -l 选项会保留尾部的跟踪记录,当缓冲区被充满,就会从头覆盖最开始的的跟踪记录。这是默认选项。)可以按字节或兆字节来指定缓冲区的大小。为了指定兆字节,可以在值后面附上 M (或 m )。

我们还将指定一个跟踪屏蔽,以限制将被捕捉的跟踪记录的数量。在本例中,我们将只跟踪缓冲池服务组件。这可以通过两种方式来进行。我们可以简单地指定 -m 选项,后面跟上以双引号括起来的组件名称( -m "buffer pool services" ),或者可以在完整的 mask 语法中指定组件号(在这里是 2)。跟踪屏蔽有 5 个元素,之间以句号隔开:

  • Type。该元素指向跟踪记录类型,包括 entry (1)、exit (2)、data (3)、error (4) 和 fatal error (5)。
  • Product。DB2 是 product 3。
  • Component。该元素指向一个组件名。例如,buffer pool services (2)。也可以指定组件的简称。例如 sqlb。
  • Function。该元素指向一个函数名。例如,sqlbpfDbheapSize (404)。
  • Function category。该元素指定被跟踪对象是内部函数(fnc, 0)、组件外部接口(cei, 2)还是外部 API(api, 3)。

每个元素可以由一个以逗号分隔开的列表组成,或者由一个用连字符连接的范围组成,或者单独由一项组成。可以用星号来匹配任意值。值可以用它们的名称或相应的编号来指定。若将一个屏蔽设为 "*.*.*.*.*",则等于未指定屏蔽。建议您用双引号将跟踪屏蔽括起来,以免操作系统 shell 对星号发生错误判断。

组件和函数名以及它们相关的编号列在一些内部头文件中,这些文件是看不到的。如果您需要找出某些名称或编号,以便设置特定的屏蔽,建议您观察格式化输出的一个示例。(后面会更详细地谈到。)

我们将指定的最后一个选项是 -t 选项,该选项将指示跟踪功能捕捉与每条跟踪记录相关的相对时间戳。

现在我们就可以开始跟踪了。我们将发出 db2trc 命令,启动默认的 DB2 实例,清除跟踪缓冲区,连接到 SAMPLE 数据库,将跟踪缓冲区的内容写到一个名为 dmp 的文件中,然后关闭跟踪,如 清单 1 所示。

清单 1. 打开跟踪功能
db2trc on -i 8m -m "*.*.2.*.*" -t
db2start
db2trc clear
db2 connect to sample
db2trc dump dmp
db2trc off

关于跟踪缓冲区,以下有些重要的事情需要注意:

  • 当指定一个缓冲区大小时,该值必须是 2 的幂。例如,如果您请求一个 7-MB 的缓冲区,由于只舍不入,这个值变为 4 兆字节。如果请求一个 8000000 字节的缓冲区,这个值经过只舍不入变为 4194304 字节。
  • 缓冲区大小最少也要达到 1 兆字节。在 Windows® 操作系统上,默认缓冲区大小是 8 兆字节,在基于 UNIX® 的系统上,这个值是 4 兆字节。缓冲区的默认大小和最小值取决于 DB2 的版本,跟踪缓冲区的最大值取决于平台。
  • 由于性能的原因,跟踪功能不允许动态更改跟踪缓冲区的大小。只要共享跟踪缓冲区上附加了一个进程,就不能更改缓冲区的大小。指定不同的缓冲区大小的最好方法是在启动实例 之前(也就是在发出 db2start 命令之前)发出 db2trc 命令。
  • 如果是在跟踪共享内存,跟踪缓冲区的大小将控制转储文件的大小。如果是将跟踪信息存储到一个文件,则转储文件的大小只受空余空间和系统所允许的最大文件大小的限制。

格式化跟踪文件

对于我们从内存转储到名为 dmp 的文件中的跟踪,通过使用 db2trc 命令上的一个或两个解析选项,我们可以对其进行解析,或将其格式化为可读的文本。 清单 2展示了每个解析请求的示例,包括返回到标准输出的总结信息。在我们的示例中,跟踪文件比较小,因而不会被截掉一部分。 清单 2 还展示了各种输出文件的大小。与预期一样,转储文件( dmp )大小约为 8 MB,跟 db2trc 命令中指定的缓冲区大小相符。

清单 2. 解析跟踪
db2trc format dmp fmt
Trace truncated                   : NO
Trace wrapped                     : NO
Total number of trace records     : 2846
Number of trace records formatted : 2846
        
        db2trc flow dmp flw
Total number of trace records     : 2846
Trace truncated                   : NO
Trace wrapped                     : NO
Number of trace records formatted : 2771 (pid: 23494 tid 1 node: 0)
Number of trace records formatted : 15 (pid: 19834 tid 1 node: 0)
Number of trace records formatted : 15 (pid: 28780 tid 1 node: 0)
Number of trace records formatted : 15 (pid: 28396 tid 1 node: 0)
Number of trace records formatted : 30 (pid: 26332 tid 1 node: 0)
        
        ls -l
...
-rw-r-----   1 melnyk   staff       8393432 Aug 20 15:43 dmp
-rw-r-----   1 melnyk   staff        121489 Aug 20 15:44 flw
-rw-r-----   1 melnyk   staff        541845 Aug 20 15:44 fmt
...

format 选项创建一个纯文件跟踪输出文件,在此文件中跟踪记录按照时间顺序出现。 清单 3 展示了那种输出的一个例子。每个记录代表一个有自己的标识号的跟踪点。跟踪点号按照年月顺序出现在格式化的输出文件中。如果检查第一个记录(跟踪点 1),您将看到它包含了跟踪记录类型("entry")、产品("DB2 UDB")、组件("buffer pool services")、函数("sqlbGetTotalBufferPoolMemSize"),以及函数类别("cei")。您应该可以想起,这里的信息与可用于定义屏蔽的元素是相对应的。与这些元素等价的数字也出现在跟踪记录中,例如 "(1.3.2.537.2)"。如果一个跟踪点碰巧也是一个探测点(一个函数中被显式地标识出来的一个精确的位置),那么探测号也将包括到这个字符串中(例如,请查看跟踪点 4)。

格式化的跟踪记录还标识出进程("23494")、线程("1")、同伴进程(companion process)、是否适用("-1"),以及节点("0")。因为我们为 db2trc 命令指定了 -t 选项,因此输出中还包括相对时间戳。相对时间戳显示自跟踪开始所经历的时间。在这里,整个跟踪用了 361,858,476 纳秒,或者说刚刚超过三分之一秒。

如语法图所示( 图 1),可以用 format 选项来解析与一个或多个特定进程相关的跟踪点。例如: db2trc format dmp fmt1 -p 19834

清单 3. 按照时间顺序的跟踪记录。这个输出片断显示了文件中的前 6 个跟踪点和最后一个跟踪点
1	entry DB2 UDB buffer pool services sqlbGetTotalBufferPoolMemSize cei (1.3.2.537.2)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 0
2	entry DB2 UDB buffer pool services sqlbpfDbheapSize fnc (1.3.2.404.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 5659
3	entry DB2 UDB buffer pool services sqlbGetBPConfig cei (1.3.2.310.2)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 10319
4	data DB2 UDB buffer pool services sqlbGetBPConfig cei (3.3.2.310.2.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 11629 probe 0
	bytes 12
	Data1 	(PD_TYPE_HEXDUMP,4) Hexdump:
	0000 0000                                  ....
5	exit DB2 UDB buffer pool services sqlbGetBPConfig cei (2.3.2.310.2)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 19329
	rc = 0
6	exit DB2 UDB buffer pool services sqlbpfDbheapSize fnc (2.3.2.404.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 22358
	rc = 0x000448BC = 280764
...
2846	exit DB2 UDB buffer pool services sqlbCheckBPFConsistancy fnc (2.3.2.273.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 361858476
	rc = 0

flow 选项创建一个纯文本跟踪输出文件,在这个文件中,跟踪记录是按进程( by process)以及时间顺序排序的。它所创建的实际上是一个控制流图。 清单 4 中显示了一个输出的示例。该输出中的信息包括进程、线程、节点号,以及跟踪点号、函数名、跟踪记录类型,在某些情况下还包括探测号。其中一个比较好的特性是,为了清晰起见,每个新的函数项呈锯齿状排列。

同样,如语法图( 图 1)所示,还可以用 flow 选项来解析与一个或多个特定进程相关的跟踪点。例如: db2trc flow dmp flw1 -p 19834

清单 4. 控制流图的一部分
...
pid = 19834 tid = 1 node = 0
846         sqlbPFPrefetcherEntryPoint entry
847         sqlbPFPrefetcherEntryPoint data [probe 0]
848         | sqlbPFInitPrefetcher entry
849         | sqlbPFInitPrefetcher data [probe 0]
850         | | sqlbConnectToSharedMemory entry
851         | | sqlbConnectToSharedMemory exit
852         | | sqlbInitEDU entry
853         | | | sqlbGetBPConfig entry
854         | | | sqlbGetBPConfig data [probe 0]
855         | | | sqlbGetBPConfig exit
856         | | | SqlbFileTbl::SqlbFileTbl entry
857         | | | SqlbFileTbl::SqlbFileTbl exit
858         | | sqlbInitEDU exit
859         | sqlbPFInitPrefetcher exit
860         | sqlbpfRemoveFromQ entry
...

db2trc 命令的 info 选项返回对与一个特定转储文件相关的跟踪参数的简短总结。如果使用名为 dmp 的转储文件,那么命令 db2trc info dmp 将返回:

清单 5. db2trc 命令的 "info" 选项所返回的信息
Marker                  :  @TRACE@
Trace version           :      6.0
Platform                :      AIX
Build level             :  s040811
maxBufferSize           : 8388608 bytes (8 MB)
auxBufferSize           : 6291456 bytes (6 MB)
allocationCount         : 2
DB2TRCD pid             : 0
Trace destination       : <shared memory buffer>
crash                   : disabled
crash runtime passno    : 0
numSuspended            : 0
Buffer size             : 8388608 bytes (8 MB)
Allow buffer to wrap    : no
Mask                    : *.*.2.*.*
Timestamps              : enabled
PID.TID mask            : all
Fixed data mask #1      : all
Fixed data mask #2      : all
Max system errors       : infinite
Treat this rc as sys err: none

研究其他跟踪选项

db2trc 命令还有其他一些选项(如 图 1 所示),其中包括:

  • -perfcount 。性能计数器是一个收集选项,它记录了每个函数被调用的总次数。其相关选项 -t 规定需要捕捉花在每个函数上的总时间。性能计数器还支持 -m 选项,该选项允许指定一个屏蔽。
  • perffmt 。性能跟踪格式化器是一个解析选项,它将包含性能计数器数据的转储文件格式化为可读文本(请参见 清单 6)。
  • change 。这是一个收集选项,它允许更改正发挥效用的跟踪选项。
  • -resume 。这是一个收集选项,它让您恢复某个挂起进程的执行。如果没有启用 -suspend ,则不能恢复挂起程序的执行(请参阅后面的内容)。
  • dump -q-q (平静模式)选项禁止将消息 "Trace has been dumped to file..." 打印到标准输出。
  • stop 。这是一个收集选项,它根据需要停止跟踪。这时,所有进程都挂起跟踪,但跟踪缓冲区的内容被保存起来,以便以后转储到文件中。这种动作与 off 选项相对,后者完全禁止跟踪功能。
  • -c cpid 。该跟踪选项要求只跟踪指定的同伴进程。
  • -rc return-code 。该跟踪选项要求将指定的值(必须是一个有符号整数)当作一个系统错误来处理。
  • -e max-sys-errors 。该跟踪选项要求在指定的系统错误号出现时立即停止跟踪。
  • -crash point 。该跟踪选项要求在指定的跟踪点使进程崩溃。可以这样指定跟踪点: " product-name. component-short-name. function-name.entry | exit | probe"。例如: "DB2.SQLE.sqleFirstConnect.entry"。 probe 元素代表函数中的任意跟踪点,除了入口和退出跟踪点。DB2 UDB Version 8.2 引入了 -debug 选项,作为 -crash 的同义词。
    注意:要小心使用 -crash 选项,只有在 DB2 技术支持代表的指导下才能用。
  • -passno i 。该跟踪选项要求在崩溃点(crash point)执行了 i次之后使进程崩溃。
  • -sleep s 。该跟踪选项要求进程休眠 s秒,而不是崩溃。
  • -signum n 。该跟踪选项要求进程发出信号 n,而不是崩溃。
  • -pause 。该跟踪选项要求进程暂停,直到收到信号,而不是崩溃。
  • -suspend 。该跟踪选项要求进程挂起执行,而不是崩溃。
  • -softcrash 。该跟踪选项要求进程中断代理,而不是崩溃。
清单 6. 打开性能计数器和格式化捕捉到的数据。实例输出显示了前 5 条格式化记录。
db2 connect reset
db2stop
db2trc on -i 8m -perfcount -t -m "*.*.2.*.*"
db2start
db2trc clear
db2 connect to sample
db2trc dump dmp1
db2trc off
db2trc perffmt dmp1 pfmt
13	(0 sec, 28978 nanosec)	 sqlbReducePagesPinned
8	(0 sec, 114614 nanosec)	 sqlbLoadContainerList
1	(0 sec, 6309 nanosec)	 sqlbAllocateBuckets
1	(0 sec, 28228 nanosec)	 sqlbpfCreateQ
4	(0 sec, 195840 nanosec)	 sqlbConnectToSharedMemory
...

结束语

本文向您介绍了 DB2 跟踪的一些基础知识,并通过实用的示例向您展示了在 DB2 技术支持代表要求捕捉跟踪信息的情况下,如何使用 db2trc 命令。您可以在一个测试环境(不是生产环境)中尝试其中一些示例,以便对 DB2 跟踪功能有更好的理解,同时也更欣赏这项功能。


相关主题

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
  • DB2 Technical Support是寻找像 Version 8 Information Center 和 PDF 产品手册之类参考资料的理想之处。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=20192
ArticleTitle=DB2 基础: 介绍 DB2 UDB 跟踪功能
publish-date=10012004