DB2 性能監(jiān)控2[翻譯]
2024-09-06 23:58:06
供稿:網(wǎng)友
性能監(jiān)控2
performance monitoring, part 2
roger sanders 著
笑熬漿糊 譯
天堂鳥自由空間原創(chuàng)作品
天堂鳥自由空間©2002-2005版權(quán)所有
轉(zhuǎn)載請保持文檔的完整性
訪問更多可以瀏覽http://hbird.vicp.net/myself.html
或http://hbird.myrice.com/myself.html
blog: http://blog.csdn.net/mr_bean
bbs討論: http://hbird.vicp.net
mail:[email protected]
性能監(jiān)控2
roger sanders 著
笑熬漿糊 譯
原文出處:《db2 magazine》 quarter 3, 2004 vol. 9, issue 3
英文原文(由于文章翻譯未經(jīng)授權(quán),請在轉(zhuǎn)載時保留原文鏈接)
事件監(jiān)視器超越了性能線索快照。在此系列的第一篇中,我指出db2的性能監(jiān)視工具趨向于一個有組織、有目標(biāo)導(dǎo)向的調(diào)整結(jié)果。簡單的說,他們能幫助你確定性能問題的癥結(jié)所在并且給你一些改進的方法。你也許還記得數(shù)據(jù)庫系統(tǒng)監(jiān)視器是由兩種不同的監(jiān)視工具組成:一個快照監(jiān)視器和一個或多個事件監(jiān)視器。在上個章節(jié),我詳細介紹了快照監(jiān)視器以及它是怎樣用于捕獲實例或數(shù)據(jù)庫在既定時間點上的當(dāng)前狀態(tài)信息。在本章,我將要來介紹事件監(jiān)視器是怎么被用于捕獲那些不能被快照監(jiān)視器所抓取情況下的監(jiān)視器數(shù)據(jù)。事件監(jiān)視器
事件監(jiān)視器收集監(jiān)視器數(shù)據(jù)例如特定事件或者事務(wù)發(fā)生。因此,事件監(jiān)視器提供了一個當(dāng)事件或者活動發(fā)生的時候不能使用快照監(jiān)視器監(jiān)視時搜集數(shù)據(jù)庫系統(tǒng)監(jiān)視器數(shù)據(jù)的方法。例如,假設(shè)你想要捕獲每當(dāng)死鎖周期的發(fā)生時的監(jiān)視器數(shù)據(jù)。如果你對死鎖的概念比較熟悉的話,你應(yīng)該知道一個被稱之為死鎖監(jiān)聽器的特殊進程在后臺安靜的運行并且在預(yù)定的間隔時間內(nèi)會“蘇醒”用以為死鎖周期掃描當(dāng)前正在鎖定的系統(tǒng)。如果死鎖周期被發(fā)現(xiàn),死鎖監(jiān)聽器將會隨機選擇、回滾并且終止涉及在此次周期中的任意一個事務(wù)。結(jié)果,被選擇出來的那個事務(wù)將會接受到是一個sql錯誤代碼,并且所有實際上已經(jīng)獲得的所被釋放以便于剩下的事務(wù)能夠繼續(xù)執(zhí)行。像這樣一系列的事件信息不能被快照監(jiān)視器所捕獲,這有很大的可能是因為死鎖周期可能在快照執(zhí)行很久之前就已經(jīng)被破壞了。然后,事件監(jiān)視器卻可以捕獲該事件的重要信息,因為它可以在死鎖周期被檢測到的瞬間被激活。這兩種監(jiān)視器的另外一個顯著的不同是:快照監(jiān)視器以后臺進程的方式駐留,從一個數(shù)據(jù)庫連接建立就開始捕獲監(jiān)視器數(shù)據(jù);相反地,事件監(jiān)視器必須在他們使用之前專門去建立和激活。幾個不同的事件監(jiān)視器可以共存,并且每個事件監(jiān)視器只有在特定類型的事件或者事務(wù)發(fā)生的時候才會被激活。表1顯示的就是可以導(dǎo)致事件監(jiān)視器被激活的一些事件類型,以及被每個事件類型所搜集的監(jiān)視器數(shù)據(jù)的種類。
表1 事件類型和他們對應(yīng)的數(shù)據(jù)由于事件監(jiān)視器是特殊的數(shù)據(jù)庫對象因此它必須在使用之前創(chuàng)建,它們只能收集發(fā)生在它們被定義的數(shù)據(jù)庫中事件或者事務(wù)的監(jiān)視器數(shù)據(jù)。你不能在實例級使用事件監(jiān)視器來收集監(jiān)視器數(shù)據(jù)。創(chuàng)建事件監(jiān)視器
你可以直接在控制中心中創(chuàng)建事件監(jiān)視器(從事件監(jiān)視器菜單選擇創(chuàng)建事件監(jiān)視器),也可以通過執(zhí)行create event monitor 的sql語句來創(chuàng)建它,它的基本語法如下:
create event monitor [name]for [database |bufferpools |tablespaces |tables |deadlocks < with detail > |connections < where [eventcondition] > |statements < where [eventcondition] > |transactions < where[eventcondition] > , ...]write to [table [groupname] (table [tablename]) |pipe [pipename] |file [directoryname]][manualstart | autostart]
說明:name是被分配給這個事件監(jiān)視器的名稱
eventcondition用于確定事件監(jiān)視器將會為哪一個連接、語句或者事務(wù)收集數(shù)據(jù)的條件
groupname確定被定義的目標(biāo)表上的邏輯數(shù)據(jù)群組(使用這個參數(shù)的可用值可以參見表1)
tablename確定指派給所有事件監(jiān)視器寫入的數(shù)據(jù)庫表的名稱
pipename確定指派給所有事件監(jiān)視器寫入命名管道的名稱
directoryname確定指派個包含事件監(jiān)視器的一個或者多個文件寫入目錄的名稱
注意:在尖括號中出現(xiàn)的參數(shù)是可選擇的;出現(xiàn)在方括號里面的參數(shù)或者選擇是必須的。察看create event monitor sql語句的完整語法,參見ibm db2 universal database, version 8 sql reference volume 2文檔。我們假設(shè)如果你想創(chuàng)建一個關(guān)于捕獲所有應(yīng)用級的計數(shù)器的值并且每當(dāng)應(yīng)用程序中止與數(shù)據(jù)庫的時候把它們寫入名為conn_data的數(shù)據(jù)庫表中的一個事件監(jiān)視器。你可以執(zhí)行下面的create event monitor語句來完成它。create event monitor conn_eventsfor connectionswrite to table
conn
(table conn_data)
現(xiàn)在我們假使你要創(chuàng)建一個用來捕獲緩沖池和表空間事件的監(jiān)視器數(shù)據(jù)并且要把所有收集到的數(shù)據(jù)寫入到一個名為/export/home/bpts_data目錄的事件監(jiān)視器。你可以執(zhí)行下面的create event monitor語句來完成它。create event monitor bpts_eventsfor bufferpools, tablespaceswrite to file '/export/home/bpts_data'
正如你所看到的,當(dāng)你創(chuàng)建一個事件監(jiān)視器的時候你必須去指定激活監(jiān)視器的事件的類型以及所有收集到的數(shù)據(jù)寫入的地方。一個事件監(jiān)視器的輸出可以寫入到一個或者多個的數(shù)據(jù)庫表、外部文件或一個命名管道。表和管道型的事件監(jiān)視器流事件直接記錄到指定表或者命名管道中。另一方面,文件型事件監(jiān)視器流事件記錄成一系列具有.evt擴展名的8位編碼的文件(例如00000000.evt, 00000001.evt等等)。存儲在這些文件中的數(shù)據(jù)也許被處理成類似于一個單獨的數(shù)據(jù)流存儲的一個單獨的文件中。雖然這些數(shù)據(jù)實際上是被分割成許多小的數(shù)據(jù)塊。(數(shù)據(jù)流開始于00000000.evt文件的第一個字節(jié),結(jié)束于創(chuàng)建的最后一個文件的最后一個字節(jié))如果你指明事件監(jiān)視器的輸出會存儲在數(shù)據(jù)庫表里面的話,那么所有的目標(biāo)表將會在create event monitor語句被執(zhí)行的時候自動被創(chuàng)建。(如果由于一些原因創(chuàng)建表失敗,那么會返回一個錯誤代碼同時create event monitor語句執(zhí)行也就失敗)然而,如果你指明事件監(jiān)視器的輸出會寫入一個或者多個外部文件,或者一個命名管道的時候,這個輸出目錄或者命名管道則必須事先存在并且當(dāng)事件監(jiān)視器被激活時db2數(shù)據(jù)庫管理器實例自身必須能夠?qū)λM行寫入。另外,如果使用的是一個命名管道,應(yīng)用程序監(jiān)視的命名管道必須要運行同時它也必須在事件監(jiān)視器被激活之前將管道打開準(zhǔn)備讀取信息。開始和停止事件監(jiān)視器
如果你在創(chuàng)建一個事件監(jiān)視器的時候指明使用autostart選項,那么監(jiān)視器將會在包含它的數(shù)據(jù)庫開始的時候自動開始。(數(shù)據(jù)庫開始于使用activate database命令來激活或者第一個與該數(shù)據(jù)庫連接建立的時候。)如果你使用manualstart或者不知名任何選項(在這里,manualstart是缺省值),它的結(jié)果就是事件監(jiān)視器不會收集監(jiān)視器數(shù)據(jù)直至它開始活動。事件監(jiān)視器可以通過執(zhí)行set event monitor sql語句來開始(停止)。它的基本語法如下:
set event monitor [monitorname] state < = > [monitorstate]
說明:monitorname指明需要改變狀態(tài)的事件監(jiān)視器的名稱
monitorstate指明指派給需要修改狀態(tài)的事件監(jiān)視器的狀態(tài)。想要開始事件監(jiān)視器的話(換句話說,也就是把它置為激活狀態(tài)),你要把它的值置為1。相反地,需要置為0。
現(xiàn)在我們假設(shè)你想要開始名為conn_events的事件監(jiān)視器,它創(chuàng)建的時候采用了manualstart選項。你可以這么作:
set event monitor conn_events state 1
如果你想要得到與上面相反地結(jié)果,也就是說停止conn_events事件監(jiān)視器的話,你可以執(zhí)行這句:
set event monitor conn_events state 0
同時,你也可以通過在控制中心的事件監(jiān)視器菜單中選中并且選擇你想要得動作來開始和停止事件監(jiān)視器事件監(jiān)視器一旦開始運行,它就會在后臺靜靜等待所為他設(shè)計的要監(jiān)視的相應(yīng)事件或者事務(wù)的出現(xiàn)。當(dāng)這種情況出現(xiàn)的時候,事件監(jiān)視器會收集合適的監(jiān)視器數(shù)據(jù)信息并且將它們寫入到監(jiān)視器的輸出對象中(表、目錄或者命名管道)。在這個時候,這些步驟將由事件或者事務(wù)自身去控制;數(shù)據(jù)庫管理員不需要去執(zhí)行任何額外的步驟去收集事件監(jiān)視器數(shù)據(jù),這點與快照監(jiān)視器在使用的時候是不同的。強制輸出
在有些時候,低記錄執(zhí)行頻率的事件監(jiān)視器(例如被設(shè)計于監(jiān)視數(shù)據(jù)庫事件的監(jiān)視器)會把事件監(jiān)視器數(shù)據(jù)存儲在內(nèi)存中而沒有存儲在事件監(jiān)視器的目標(biāo)空間上(因為這時候僅僅是部分事件記錄存在)。如果你在此時想要去檢查一下事件監(jiān)視器的活動內(nèi)部緩存里面的內(nèi)容的話,可以執(zhí)行flush event monitor sql語句。該語句的語法是flush event monitor [monitorname] <buffer>。monitorname指明你需要強制立即輸出他的活動內(nèi)部緩存到目標(biāo)空間的事件監(jiān)視器的名稱。強制將conn_events事件監(jiān)視器活動內(nèi)部緩存的內(nèi)容寫入到相應(yīng)的空間,你可以執(zhí)行flush event monitor conn_events語句。缺省情況下,早先被寫入事件監(jiān)視器目標(biāo)空間的那些記錄被記錄在事件監(jiān)視器日志當(dāng)中并且打上了一個部分記錄信息的標(biāo)志。然而,如果你在執(zhí)行flush event monitor的過程中指明了buffer選項的話,只有出現(xiàn)在事件監(jiān)視器活動內(nèi)部緩存的監(jiān)視器數(shù)據(jù)才會被寫入到事件監(jiān)視器的目標(biāo)空間中,同時在事件監(jiān)視器日志中沒有部分的記錄被記錄。當(dāng)事件監(jiān)控器被清除后,計數(shù)器并沒有復(fù)位。結(jié)果會造成,當(dāng)事件監(jiān)控器被正常觸發(fā)時,已經(jīng)被生成的沒有使用flush event monitor語句的事件監(jiān)控器記錄,仍然會被生成。事件監(jiān)視器數(shù)據(jù)
有些時候,你想要察看事件監(jiān)視器收集的數(shù)據(jù)。如果這些收集到的數(shù)據(jù)是寫入到一個命名管道,那么在管道末端負責(zé)接受的應(yīng)用程序通常是以在它接受到數(shù)據(jù)的時候顯示出監(jiān)視器數(shù)據(jù)的形式作為相應(yīng)。如果事件監(jiān)視器把數(shù)據(jù)寫入表或者一系列文件中的話,你可以通過一個名為事件分析器(event analyzer)的專用工具來察看數(shù)據(jù)或者使用event monitor productivity tool。事件分析器是一個gui工具,它可以通過在控制中心選中你所想得到的事件監(jiān)視器并且從事件監(jiān)視器菜單中選擇適當(dāng)?shù)膭幼骰蛲ㄟ^執(zhí)行db2eva命令來激活。圖1顯示事件分析器在它第一次激活時候的典型示例。
圖1 時間分析工具
一旦它被激活,事件分析器允許你向下挖掘并瀏覽一個詳細的事件監(jiān)視器捕獲的信息。事件分析器只能用于查看那些被收集并且存儲與數(shù)據(jù)庫表中的事件監(jiān)視器數(shù)據(jù)。如果要查看被寫入到文件或者命名管道里面的監(jiān)視器數(shù)據(jù),你將要使用基于文本的event monitor productivity tool,它可以從一個事件監(jiān)視器數(shù)據(jù)文件或命名管道中收取數(shù)據(jù)并且將這些數(shù)據(jù)處理成一個格式化的報告。(事件監(jiān)視器文件和命名管道包含一個必須要在展示之前格式化的二進制邏輯數(shù)據(jù)群流)通過db2evmon命令可以激活event monitor productivity tool。這個命令的基本語法是
db2evmon -db [databasealias] -evm [monitorname] 或者 db2evmon -path [monitortarget]
說明:databasealias指明所要定義事件監(jiān)視器的數(shù)據(jù)庫的別名
monitorname指明所分配的需要顯示數(shù)據(jù)的事件監(jiān)視器的名稱
monitortarget指明已經(jīng)被指定事件監(jiān)視器收集的數(shù)據(jù)存儲的位置(目錄或命名管道)
作為例子,為了格式化和輸出被定義在sample數(shù)據(jù)庫中的事件監(jiān)視器conn_events所有被收集的數(shù)據(jù),你可以通過執(zhí)行db2evmon -db sample -evm conn_events命令來得到。例如,假設(shè)你要使用下面的語句創(chuàng)建conn_events事件監(jiān)視器
create event monitor conn_eventsfor connectionswrite to file 'c:/mondata'autostart
假設(shè)一個應(yīng)用程序與sample數(shù)據(jù)庫已經(jīng)建立起一個連接(使事件監(jiān)視器可以收集和記錄監(jiān)視數(shù)據(jù))。db2evmon -db sample -evm conn_events命令返回輸出信息的文件頭部分表1中的樣例輸出類似。表1事件監(jiān)視器conn_events的輸出樣例
reading c:/dbsio/00000000.evt ...
-----------------------------------------------------------------------
event log header
event monitor name: conn_events
server product id: sql08015
version of event monitor data: 7
byte order: little endian
number of nodes in db2 instance: 1
codepage of database: 1252
territory code of database: 1
server instance name: db2
-----------------------------------------------------------------------
-----------------------------------------------------------------------
database name: sample
database path: c:/db2/node0000 ql00001/
first connection timestamp: 03-24-2004 16:53:00.020233
event monitor start time: 03-24-2004 16:53:00.155733
-----------------------------------------------------------------------
3) connection header event ...
appl handle: 16
appl id: *local.db2.0120c4215303
appl seq number: 0001
drda as correlation token: *local.db2.0120c4215303
program name : db2evmon.exe
authorization id: rsanders
execution id : rsanders
codepage id: 1252
territory code: 0
client process id: 1788
client database alias: sample
client product id: sql08015
client platform: unknown
client communication protocol: local
client network name:
connect timestamp: 03-24-2004 16:53:00.020233
4) connection event
appl handle: 16
appl id: *local.db2.0120c4215303
appl seq number: 0003
record is the result of a flush: false
application status: sqlm_uowwait
lock statistics:
lock waits: 0
total time waited on locks (milliseconds): 0
deadlocks: 0
lock escalations: 0
x lock escalations: 0
lock timeouts: 0
sort statistics:
sorts: 0
total sort time (milliseconds): 0
sort overflows: 0
hash statistics:
hash joins: 0
hash loops: 0
hash join small overflows: 0
hash join overflows: 0
buffer pool statistics:
buffer pool logical data page reads: 12
buffer pool physical data page reads: 4
buffer pool data page writes: 0
buffer pool logical index page reads: 30
buffer pool physical index page reads: 18
buffer pool index page writes: 0
buffer pool read time (microseconds): 0
buffer pool write time (microseconds): 0
time spent waiting for a prefetch: 0 milliseconds
unread prefetch pages: 0
workspace statistics:
shared workspace high water mark: 0
total shared workspace overflows: 0
total shared workspace section lookups: 0
total shared workspace section inserts: 0
private workspace high water mark: 13746
total private workspace overflows: 0
total private workspace section lookups: 2
total private workspace section inserts: 2
direct i/o statistics:
sectors read directly: 14
sectors written directly: 0
direct read requests: 5
direct write requests: 0
direct read time: 0
direct write time: 0
sql statement counts
commit sql statements: 1
rollback sql statements: 0
dynamic sql statements: 1
static sql stmts: 3
failed sql statements: 0
select sql statements: 2
data definition language sql statements: 0
update/insert/delete sql statements: 0
internal counts
internal auto rebinds: 0
internal rows deleted: 0
internal rows updated: 0
internal rows inserted: 0
internal commits: 0
internal rollbacks: 0
internal rollbacks due to deadlock: 0
row counts
rows deleted: 0
rows inserted: 0
rows updated: 0
rows selected: 2
rows read: 6
rows written: 0
binds/precompiles: 0
rejected block cursor requests: 0
accepted block cursor requests: 0
package cache statistics
package cache lookups: 3
package cache inserts: 2
section lookups: 3
section inserts: 2
catalog cache statistics
catalog cache overflows: 0
catalog cache high water mark: 0
catalog cache lookups: 2
catalog cache inserts: 0
cpu times
user cpu time: 0.000000 seconds
system cpu time: 0.000000 seconds
memory usage:
memory pool type: other memory
current size (bytes): 16384
high water mark (bytes): 98304
maximum size allowed (bytes): 1071644672
memory pool type: application heap
current size (bytes): 212992
high water mark (bytes): 212992
maximum size allowed (bytes): 1277952
memory pool type: application control heap
current size (bytes): 16384
high water mark (bytes): 16384
maximum size allowed (bytes): 704512
disconnection time: 03-24-2004 16:53:00.191692
接下來
快照監(jiān)視器和事件監(jiān)視器被設(shè)計用于幫助你確定并修正那些已經(jīng)影響數(shù)據(jù)庫系統(tǒng)的性能問題。db2 udb v.8.1還提供了兩種額外的工具(the health monitor and health center)來幫助你在它們變成真正的問題之前找出它的前兆來。這就是接下來的章節(jié)中要說的主題。
完整版本(包含圖片的pdf文件)請到http://hbird.vicp.net/viewthread.php?tid=1486處下載