簡介
在使用 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 的一個重要注意事項
如果啟用 DB2 跟蹤功能,則會影響系統的性能。性能下降程度取決於在收集跟蹤信息時要使用多少資源。應避免在生產環境中進行跟蹤,而是在 DB2 技術支持代表的指導下使用跟蹤功能。
使用 db2trc 命令
您可以使用 db2trc 命令來捕捉跟蹤信息,並將該信息格式化成可讀的文本。可以在操作系統命令提示符下或者從一個 shell 腳本中發出 db2trc 命令。雖然您可以選擇將跟蹤信息存儲到文件(而不是內存),但這樣會降低跟蹤的速度。不過,如果新出現的問題使您不能將跟蹤信息(從內存)“轉儲”到文件中,直接將跟蹤信息存儲到文件也許是您惟一的選擇。其方法是,在問題出現後,立即轉儲跟蹤信息,然後關閉跟蹤,最後按照時間順序或者按照進程或線程來格式化事件數據。
圖 1 顯示了 db2trc 命令的語法。該命令的選項可以歸結為兩大類:收集(collection)和解析(parsing)。
收集選項包括打開或關閉跟蹤;指定跟蹤緩沖區大小;指定或更改跟蹤選項;轉儲跟蹤信息;以及清除跟蹤緩沖區。
解析選項包括按照時間順序或者按照進程或線程來排序格式化的跟蹤記錄。
跟蹤選項包括以下功能:指定一個 mask,以捕捉那些能滿足指定標准(例如,只捕捉與特定函數或組件相關的記錄)的跟蹤記錄;只跟蹤指定的進程和線程組合;以及請求(相關的)時間戳數據。
您可以跟蹤 DB2 實例或 DB2 Administration Server (DAS) 實例。跟蹤 DB2 實例是默認行為。為跟蹤 DB2 實例,您無需指定實例名 db2 。本文中的示例就是只跟蹤默認 DB2 實例的情況。
注意,對於 db2trc 命令的大多數選項, -u 選項是訪問命令行幫助的便捷方法。
圖 1. 展示 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 跟蹤功能有更好的理解,同時也更欣賞這項功能。