DB2性能監(jiān)控 1——快照
2024-09-06 23:58:03
供稿:網(wǎng)友
性能監(jiān)控 1——快照
performance monitoring, part 1: it's a snap(shot)
roger sanders 著
笑熬漿糊 譯
天堂鳥自由空間原創(chuàng)作品
天堂鳥自由空間©2002-2005版權(quán)所有
轉(zhuǎn)載請保持文檔的完整性
訪問更多可以瀏覽http://hbird.myrice.com/myself.html
mailto:[email protected]
性能監(jiān)控 1——快照
roger sanders 著
笑熬漿糊 譯
原文出處:《db2 magazine》 quarter 2, 2004 vol. 9, issue 2
英文原文(由于文章翻譯未經(jīng)授權(quán),請在轉(zhuǎn)載時保留原文鏈接)
你怎么知道什么地方是你的調(diào)整努力的焦點呢?還是做個快照吧。當(dāng)你回顧我最近的專欄時,我總推薦dba們在動手處理做性能調(diào)整當(dāng)中一定要制定明確詳細(xì)的計劃;在頭腦里一定要有個現(xiàn)實的可測量的目標(biāo)。否則,就會成為一個無意義的練習(xí)。在改進(jìn)數(shù)據(jù)庫性能的時候,你必須首先清楚哪里會是性能的瓶頸并且有相應(yīng)的對策。這就是db2 udb系列產(chǎn)品中性能監(jiān)控工具的用武之地。從這個專欄開始我將為你講述一系列如何使用這些工具來確定你應(yīng)該關(guān)注調(diào)整效果地地方,并且發(fā)現(xiàn)是否調(diào)整有效的解決問題。 在這一部分,我將介紹可使用的工具同時將詳細(xì)說明其中之一(快照監(jiān)視器)以及與它相關(guān)的開關(guān)參數(shù)。在下個專欄中我將會介紹事件監(jiān)視器。db2 數(shù)據(jù)庫系統(tǒng)監(jiān)視器雖然它的名字聽起來有些像是一個單獨的工具,其實數(shù)據(jù)庫系統(tǒng)監(jiān)視器實際上是由兩種不同類型的監(jiān)視工具組成,他們負(fù)責(zé)捕獲和返回系統(tǒng)信息:快照監(jiān)視器和一個或者更多個事件監(jiān)視器。快照監(jiān)視器會讓你獲得在一個指定的時間點上的狀態(tài)映像。 事件顯示器在指定時間發(fā)生時獲取監(jiān)視器數(shù)據(jù)并且將它們記入日志文件。這兩種類型所收集的信息都存儲于監(jiān)視器要素中(有時被認(rèn)為是數(shù)據(jù)要素);每個要素被設(shè)計成存儲指定類型的信息。 下面列出的是可利用的監(jiān)視器要素名單:計數(shù)器 用來保留活動或者事件發(fā)生次數(shù)的合計值(例如,對于一個數(shù)據(jù)庫的已經(jīng)執(zhí)行的sql語句的的總數(shù))。計數(shù)器數(shù)值得增長貫穿監(jiān)視器的生命周期;而在許多情況下它有可能會重置計數(shù)器監(jiān)視器要素。 gauges 表明一個項目的當(dāng)前值(例如,當(dāng)前連接到數(shù)據(jù)庫的應(yīng)用程序的數(shù)量。) 與計數(shù)器值不同于的是,gauges的值可以變高或者變低;他們在任一被測量的點實時的值通常取決于數(shù)據(jù)庫活動的級別。 watermarks 表明一個指標(biāo)在監(jiān)視開始以后所能達(dá)到的最大值或最小值(例如,更新操作所影響的最大行數(shù))。信息要素 提供所有監(jiān)視活動執(zhí)行的細(xì)節(jié)信息(例如,緩沖池名稱、數(shù)據(jù)庫名稱和別名、詳細(xì)路徑等等)。時間戳 表明一個活動或者事件發(fā)生的日期和時間(例如,第一次連接數(shù)據(jù)庫建立的日期和時間)。時間戳被看成是從1970 年1月1 日開始消逝的秒和微妙的數(shù)量的值。時間要素 記錄時間被花費于執(zhí)行一個活動或事件的成本(例如:進(jìn)行排序操作時間花費)。時間要素的值會以從活動或事件開始所流逝的秒和微秒的數(shù)量形式來表現(xiàn)。一些時間要素可以被重置。數(shù)據(jù)庫系統(tǒng)監(jiān)示器使用這些要素的一些組合來獲取監(jiān)視數(shù)據(jù)并且為每一個要素的數(shù)據(jù)存儲提供了幾種選擇。快照和事件監(jiān)視器均可以給予你存放所有被收集的數(shù)據(jù)在文件或數(shù)據(jù)庫表的選擇權(quán),通過屏幕察看或者使用一個定制的程序去處理它。數(shù)據(jù)庫系統(tǒng)監(jiān)視器通過一些使用自描述的數(shù)據(jù)流來將監(jiān)視數(shù)據(jù)返回到客戶端應(yīng)用程序。使用快照監(jiān)視應(yīng)用程序,你可以調(diào)用適當(dāng)?shù)腶pi 獲得快照信息然后處理返回的數(shù)據(jù)流。使用事件監(jiān)視應(yīng)用程序,你事先準(zhǔn)備從文件或命名管道來接收數(shù)據(jù),激活相應(yīng)的事件監(jiān)視器,然后按照剛才接收數(shù)據(jù)那樣處理數(shù)據(jù)流。快照監(jiān)視器向我提到的一樣,快照顯示器被設(shè)計用于收集那些在它控制下的某一特定時間點的db2 udb實例和一些數(shù)據(jù)庫的狀態(tài)的信息。快照對于確定一個數(shù)據(jù)庫系統(tǒng)的狀態(tài)是非常有用的。采用固定的時間間隔,他們能夠提供出一寫讓你觀察取向和辨認(rèn)潛在的問題范圍的信息。快照監(jiān)視通過在命令行處理器(clp)中執(zhí)行g(shù)et snapshot命令或者通過從應(yīng)用程序中調(diào)用db2getsnapshot()和db2ggetsnapshot()(如果使用除c或者c++之外的高級編程語言)api。 開關(guān)雖然快照監(jiān)視器信息有助于辨認(rèn)問題范圍,收集數(shù)據(jù)經(jīng)常會引起額外的處理負(fù)擔(dān)。例如,為了計算執(zhí)行sql語句總的時間花費,db2 數(shù)據(jù)庫管理器必須在sql語句執(zhí)行前后去調(diào)用操作系統(tǒng)級命令用來獲得時間戳信息。 這些系統(tǒng)級調(diào)用的成本可能是昂貴的。其它副作用是增加內(nèi)存的使用:快照監(jiān)視器數(shù)據(jù)是收集和存放在內(nèi)存中而不是在某些特定的表或者外部文件中。為了有助于減少收集快照監(jiān)視器數(shù)據(jù)的過載需求的數(shù)量,db2推薦使用控制被收集新的的數(shù)量和類型的快照監(jiān)視器開關(guān)。像其他基本開關(guān)一樣,每個快照監(jiān)視器都有開和關(guān)兩種狀態(tài)的設(shè)置。當(dāng)快照監(jiān)視器開關(guān)打開的時候,在這個開關(guān)控制之下的一些監(jiān)視器要素的信息被收集起來。相反也是。(注意:一定數(shù)量的監(jiān)視信息是不受這些開關(guān)的控制因此這些信息不管那些開關(guān)被設(shè)置成什么狀態(tài)總會被收集的。)表1 列出了可利用的快照監(jiān)視器開關(guān)參數(shù)并且描述了當(dāng)這個開關(guān)被打開始后可以收集信息的類型。除了timestamp缺省值是打開的以外,所有可利用的快照顯示器缺省都是關(guān)閉的。
表1 。 快照監(jiān)視器開關(guān)參數(shù)
查看開關(guān)設(shè)置在某種程度上,由于快照監(jiān)視器開關(guān)控制著當(dāng)一個快照被打開時縮搜集到的信息的類型和數(shù)量,因此你應(yīng)該在開始你的監(jiān)視進(jìn)程之前搞清楚哪些開關(guān)是打開的而那些是關(guān)閉的。獲得這些信息最簡單的方法就是通過在clp中執(zhí)行g(shù)et monitor switches命令。在多分區(qū)數(shù)據(jù)庫環(huán)境下它的基本語法是:get monitor switches < at dbpartitionnum [partitionnum] > partitionnum 參數(shù)用來說明你需要獲取快照監(jiān)視器開關(guān)參數(shù)狀態(tài)的數(shù)據(jù)庫分區(qū)。注: 尖括號(<>)顯示的參數(shù)是可選的參量,而在方括號([ ])里面的參數(shù)是必須的。獲取和顯示一個單獨分區(qū)數(shù)據(jù)庫的快照監(jiān)視器開關(guān)的狀況,可以執(zhí)行g(shù)et monitor switches命令。假定均使用缺省的設(shè)置,結(jié)果如清單1所示.
清單1 。 運行g(shù)et monitor switches命令的結(jié)果。
從上面可以看到,timestamp這個快照監(jiān)視器開關(guān)的狀態(tài)是on而其他的都是off。在這個開關(guān)狀態(tài)后面顯示的是這個開關(guān)打開的精確日期和時間。改變開關(guān)參數(shù) 在你知道了每一個可用的快照監(jiān)視器開關(guān)的當(dāng)前狀態(tài)以后,你就想在你開始監(jiān)測之前去改變其中的一個或者多個開關(guān)的設(shè)置。你可以通過改變相對應(yīng)的數(shù)據(jù)庫管理器配置參數(shù)(參見表 1)或者調(diào)用應(yīng)用程序級db2monitorswitches() api函數(shù)或執(zhí)行update monitor switches命令在實例級修改快照監(jiān)視器開關(guān)的設(shè)置(該設(shè)置在實例重啟后依然有效) 這個命令的基本語法:
update monitor switches using [[switchid] on | off ,...]
switchid 指明一個或者多個需要改變狀態(tài)的快照監(jiān)視器開關(guān)。(該參數(shù)可以是以下其中的一部分或者是全部:bufferpool, lock, sort, statement, table, timestamp, uow。)要將lock和sort快照監(jiān)視器開關(guān)參數(shù)狀態(tài)設(shè)置為on(實例級別),可以執(zhí)行update monitor switches using lock on sort on命令。獲取數(shù)據(jù) 當(dāng)數(shù)據(jù)庫被激活或者與數(shù)據(jù)庫的連接被建立的時候,快照顯示器自動地開始收集監(jiān)視器數(shù)據(jù)。但是,在你能夠觀看被收集的數(shù)據(jù)之前,你必須選取一個快照。(快照看起來就像是當(dāng)時那個時間點上的監(jiān)視要素的映像。)你可以通過調(diào)用db2getsnapshot() api或者執(zhí)行g(shù)et snapshot命令來得到快照。清單2指明了這個命令的基本語法,databasealias 用來說明需要手機快照監(jiān)視器信息的數(shù)據(jù)庫別名。
清單2 。 get snapshot命令的句法。
僅僅想得到在工資數(shù)據(jù)庫中被應(yīng)用程序保持的鎖定的快照信息,可以執(zhí)行 get snapshot for locks on payroll命令。該命令輸出的工作產(chǎn)品類似于清單3中的結(jié)果 (需要注意的是這只是一個非常簡單的例子。真正監(jiān)視器返回的監(jiān)視數(shù)據(jù)通常要比這個大得多)
清單3 。 對一個數(shù)據(jù)庫使用get snapshot for locks命令得到的快照輸出的樣本。
正如你所看到的,使用get snapshot命令(或者db2getsnapshot() api)可以使用于獲取幾種不同的類型監(jiān)視數(shù)據(jù),它們包括:db2 數(shù)據(jù)庫管理器實例數(shù)據(jù) 同一實例控制下所有活動數(shù)據(jù)庫的數(shù)據(jù)庫數(shù)據(jù) 應(yīng)用程序數(shù)據(jù) 緩沖池活動數(shù)據(jù) 表空間數(shù)據(jù) 表數(shù)據(jù) 鎖數(shù)據(jù)(關(guān)于所有保持鎖定的鎖的信息) 動態(tài)sql 數(shù)據(jù)(在sql語句緩存中的當(dāng)時關(guān)于sql語句的信息) 。 需要注意的是,在快照監(jiān)視器開關(guān)之間有一種直接交互作用可利用并且當(dāng)某一個快照打開的情況下會收集到不同類型的監(jiān)視數(shù)據(jù)。 如果在一個細(xì)節(jié)描述的快照顯示器開關(guān)關(guān)閉的情況下選取與它相關(guān)聯(lián)的監(jiān)視元素的快照,那么監(jiān)視數(shù)據(jù)不會返回任何信息。(在早先例子中,被列為“未收集”信息的原因就是lock的快照監(jiān)視器開關(guān)被設(shè)置為關(guān)閉狀態(tài)了。如果在快照打開的狀態(tài)下沒有獲取到鎖定信息,那么“保持的鎖定”的值就會為0并且鎖定信息列表就不會被提供出來。) 使用sql來捕獲數(shù)據(jù) 在db2 udb的早些版本中,獲取快照監(jiān)視器數(shù)據(jù)唯一的方式就是去執(zhí)行g(shù)et snapshot命令或者從應(yīng)用程序中調(diào)用它對應(yīng)的api函數(shù)。而在db2 udb 8.1中,你還可以通過引用20個可用的快照監(jiān)視器表函數(shù)中的一個來構(gòu)造查詢?nèi)ナ占煺諗?shù)據(jù)。表2列出了這些函數(shù)以及指明他們所能獲取的具體快照信息。
表2. 快照監(jiān)視器的表函數(shù)
用下面的語法將會創(chuàng)建一個引用非數(shù)據(jù)庫管理器級表函數(shù)的查詢:
select * from table ( [functionname]('[dbname]',[partitionnum]) as [correlationname]
在這里functionname 用來說明所使用得快照監(jiān)視器的表函數(shù); dbname 指明需要從那個數(shù)據(jù)庫的快照監(jiān)視器中搜集數(shù)據(jù); partitionnum 說明需要從那個數(shù)據(jù)庫分區(qū)的快照監(jiān)視器中搜集數(shù)據(jù); correlationname 則是查詢產(chǎn)生的結(jié)果數(shù)據(jù)集的名稱。 構(gòu)造一個引用數(shù)據(jù)庫管理器級的快照監(jiān)視器表函數(shù)查詢的語法也是一樣的。不同的是:dbname 參數(shù)不使用。如果你想要獲取一個分區(qū)數(shù)據(jù)庫環(huán)境里當(dāng)前分區(qū)的快照監(jiān)視器數(shù)據(jù),你可以將partitionnum參數(shù)的值設(shè)置為-1;如果你希望獲取所有分區(qū)的快照監(jiān)視器數(shù)據(jù),可以把它設(shè)置為-2。同樣,如果你想獲取當(dāng)前連接數(shù)據(jù)庫的快照信息,你可以把dbname參數(shù)設(shè)定成一個空值,也可以使用一對空的單引號或者用一個cast操作——例如:cast (null as char)如果你想要通過使用快照監(jiān)視器的表函數(shù)snapshot_lock來抓取包含被應(yīng)用程序相關(guān)聯(lián)的當(dāng)前連接的數(shù)據(jù)庫的鎖定數(shù)據(jù)的快照信息,可以執(zhí)行下面的語句:
select * from table (snapshot_lock (cast (null as char), -1) as lock_info
如果我們使用payroll數(shù)據(jù)庫(先前的例子) 作為當(dāng)前的被連接的數(shù)據(jù)庫,那么執(zhí)行g(shù)et snapshot for locks on payroll命令返回的信息將會與先前的那個非常的相似(表3)。重置計數(shù)器 另一個監(jiān)視器要素被稱為計數(shù)器,它保存一個運行期間的具體活動或事件發(fā)生的次數(shù)的數(shù)量的累積。 典型的計數(shù)開始于快照監(jiān)視器開關(guān)打開或與數(shù)據(jù)庫的連接被建立(如果實例級別的監(jiān)視器被使用,計數(shù)開始于應(yīng)用程序第一次建立與該實例控制下的數(shù)據(jù)庫連接的時候) 。計數(shù)一旦開始,他將一直繼續(xù)到適當(dāng)?shù)目煺诊@示器開關(guān)被關(guān)閉或直到所有數(shù)據(jù)庫連接被終止。 但是, 但有時候也可以在你沒有改變一個或更多快照顯示器開關(guān)狀態(tài)和沒有終止和重建所有當(dāng)前活動數(shù)據(jù)庫的連接情況下可以去重置所有計數(shù)器為零。在這種情況下,所有的監(jiān)視器的計數(shù)器可以通過執(zhí)行reset monitor命令去將他們歸零。這個命令的基本語法是:reset monitor all 或者 reset monitor for [database | db] [databasealias] [databasealias]指明名你想要將快照監(jiān)視器的計數(shù)器歸零的數(shù)據(jù)庫別名。如果你想要重置一個實例控制下的所有數(shù)據(jù)庫快照監(jiān)視器的計數(shù)器,可以切換到這個實例下執(zhí)行reset monitor all命令。另一方面,如果你只是想要把與payroll數(shù)據(jù)庫相關(guān)聯(lián)的快照監(jiān)視器的計數(shù)器重置為0的話,那么你可以這么做——執(zhí)行reset monitor for database payroll命令。記住,你不能使用reset monitor命令來有選擇性地對快照監(jiān)視器開關(guān)所控制的特殊的監(jiān)視器組重置他們的計數(shù)器。 反而,你必須將適當(dāng)?shù)目煺毡O(jiān)視器開關(guān)關(guān)閉和然后再打開或者終止并且重建數(shù)據(jù)庫連接。 接下來快照監(jiān)視器只是db2 udb可利用的監(jiān)視工具當(dāng)中的一個,并且在有些時候快照并不是很好的選擇。 在下個章節(jié)中, 我將介紹入何時用事件監(jiān)視器去收集那些快照監(jiān)視器所沒有辦法處理的事件或者活動的監(jiān)視數(shù)據(jù)。