毛佳音 (maojy@cn.ibm.com), 高性能解決方案工程師, IBM 2007 年 12 月 29 日 事務(wù)是數(shù)據(jù)庫系統(tǒng)中的核心概念之一。應(yīng)用程序可以通過啟動、提交、回滾等操作來控制一個事務(wù)的執(zhí)行與停止。從應(yīng)用的角度來看,一個事務(wù)往往對應(yīng)一系列緊密關(guān)聯(lián)的用戶操作,因此事務(wù)的性能是影響用戶體驗的重要因素之一。本文提出了一種方法,利用 DB2 的事件監(jiān)測器和快照監(jiān)測器,來分析運行于 DB2 系統(tǒng)的事務(wù)的性能。在分析報告中,提供了事務(wù)的平均執(zhí)行時間,執(zhí)行次數(shù),事務(wù)中每一個 SQL 語句的執(zhí)行時間以及執(zhí)行 SQL 語句時應(yīng)用程序的狀態(tài)。根據(jù)事務(wù)的性能分析報告,數(shù)據(jù)庫管理員和開發(fā)者可以更好的進(jìn)行性能調(diào)優(yōu)。 事務(wù)是數(shù)據(jù)庫系統(tǒng)中的核心概念之一。作為數(shù)據(jù)庫系統(tǒng)的邏輯工作單元(Unit of Work),事務(wù)必須具有四個屬性,即原子性、一致性、隔離性和持久性(ACID)。數(shù)據(jù)庫系統(tǒng)往往通過鎖機制保證事務(wù)的隔離性,通過日志機制保證事務(wù)的持久性。應(yīng)用程序可以通過啟動、提交、回滾等操作來控制一個事務(wù)的執(zhí)行與停止。從應(yīng)用的角度來看,一個事務(wù)往往對應(yīng)一系列緊密關(guān)聯(lián)的用戶操作,例如銀行系統(tǒng)中的存款、轉(zhuǎn)賬等。對于用戶而言,提交一個事務(wù)相當(dāng)于完成某種交易行為,因此執(zhí)行一個事務(wù)前后跨越的時間是影響用戶體驗的因素之一。 數(shù)據(jù)庫系統(tǒng)的性能是評判數(shù)據(jù)庫系統(tǒng)的重要因素之一,DB2 作為一款成功的數(shù)據(jù)庫產(chǎn)品提供了很多性能調(diào)優(yōu)的特征與功能。一方面 DB2 在數(shù)據(jù)庫管理器層和數(shù)據(jù)庫層提供了大量的可配置參數(shù),通過 db2 get/update dbm cfg和db2 get/update db cfg 可以查看和修改這些參數(shù),并且可以通過控制中心(Control Center, db2cc)中的 Configuration Advisor 來獲得優(yōu)化的配置參數(shù)值。另一方面DB2提供了針對查詢的優(yōu)化功能,例如 SQL Explain Facility 可以分析一個 SQL 語句優(yōu)化后的訪問計劃(Access Plan),命令行編輯器(Command Editor)中也提供了訪問計劃的圖形化視圖。但是如果想監(jiān)測和分析一個事務(wù)的性能,例如事務(wù)的執(zhí)行時間,事務(wù)中每一個 SQL 語句的執(zhí)行時間,事務(wù)中的空閑時間等,則無法簡單的通過現(xiàn)有工具來實現(xiàn)。本文將介紹一種分析 DB2 的事務(wù)性能的方法,從而幫助數(shù)據(jù)庫設(shè)計者和管理員調(diào)優(yōu)數(shù)據(jù)庫性能。 一個事務(wù)在邏輯上可以由一組 SQL 語句和一個提交/回滾操作組成。在 DB2 中,事務(wù)由第一個向數(shù)據(jù)庫發(fā)出的 SQL 語句隱式啟動,而不需要發(fā)出啟動事務(wù)的命令。所有后續(xù)的來自同一個應(yīng)用程序的數(shù)據(jù)庫讀寫操作都被歸入用一個事務(wù),直到該應(yīng)用程序發(fā)出 COMMIT(提交)或者 ROLLBACK(回滾)語句。ROLLBACK 語句會把這個事務(wù)造成的對數(shù)據(jù)庫的所有修改都取消掉。如果應(yīng)用程序沒有發(fā)出 COMMIT 或 ROLLBACK 就正常退出了,這個事務(wù)將自動提交。如果在事物的執(zhí)行途中應(yīng)用程序不正常退出,則將自動回滾。一旦發(fā)出了 COMMIT/ROLLBACK 命令,這個命令就無法停止了。由于事務(wù)只是由一串 SQL 語句組成的,所以不存在事務(wù)的物理表示。 在執(zhí)行一個事務(wù)的過程中,數(shù)據(jù)庫和應(yīng)用程序可能處于不同的狀態(tài)。例如在圖 1所示的事務(wù)中,應(yīng)用程序順序執(zhí)行了 3 個 SQL 語句并執(zhí)行了 COMMIT 語句。在 t0 到 t1 時間內(nèi)應(yīng)用程序處于 UOW Executing 狀態(tài)或者 Lock wait,其中 UOW Executing 狀態(tài)是指應(yīng)用程序在執(zhí)行數(shù)據(jù)庫操作, Lock wait 狀態(tài)是指應(yīng)用程序在等待對數(shù)據(jù)庫對象的鎖;在 t1 到 t2 時間內(nèi)處于 UOW Waiting, UOW Waiting 是指應(yīng)用程序當(dāng)前沒有進(jìn)行數(shù)據(jù)庫操作。一個事務(wù)的執(zhí)行過程消耗的時間可能用于執(zhí)行 SQL 語句、執(zhí)行應(yīng)用程序代碼或等待鎖,如果某一類事務(wù)的性能比較差,需要分辨是在哪一個方面消耗的時間,從而做出調(diào)整。 圖 1. 事務(wù)的邏輯組成 ![]()
由于事務(wù)在數(shù)據(jù)庫中沒有一個物理的表示,因此無法直接獲得一個事務(wù)的監(jiān)控信息。本文將介紹一種方法通過 DB2 的事件監(jiān)控器捕獲的事件和快照得到的信息來綜合分析事務(wù)的性能。圖 2為這種方法的流程。 圖 2. 分析事物性能的方法流程圖 ![]() 下面將按照流程圖中的步驟通過一個實驗詳細(xì)介紹分析事物性能的方法。實驗環(huán)境為 DB2 V9.1,操作系統(tǒng)為 Windows XP。實驗中通過壓力測試工具訪問一個部署在 WebSphere Application Server 上的 J2EE 應(yīng)用 Trade6 [4] 來執(zhí)行一系列的數(shù)據(jù)庫操作,同時捕獲數(shù)據(jù)庫的性能數(shù)據(jù),隨后分析得出數(shù)據(jù)庫系統(tǒng)的事務(wù)性能。 圖 3. 實驗環(huán)境 ![]()
用 DB2 事件監(jiān)測器(Event Monitor)來捕獲數(shù)據(jù)庫語句事件 首先需要打開 DB2 的事件監(jiān)控器來捕獲數(shù)據(jù)庫中執(zhí)行的 SQL 語句和事務(wù)語句。在 DB2 V8 中,提供了兩種監(jiān)測器來讓用戶得到系統(tǒng)監(jiān)測信息,即事件監(jiān)測器(Event Monitor)和快照監(jiān)測器(Snapshot Monitor)[1]。這兩種監(jiān)測器在 DB2 V9 中得到了保留 [2]。這兩種監(jiān)測器可以用來捕獲不同類型的數(shù)據(jù)庫系統(tǒng)信息,在本方法中將利用它們來獲得 SQL 語句、事務(wù)語句的執(zhí)行信息和應(yīng)用程序的狀態(tài)信息。由于這些監(jiān)測器本身會帶來一些系統(tǒng)開銷,例如在進(jìn)入和完成 SQL 語句的時候需要加入系統(tǒng)調(diào)用,并且需要分配更多的內(nèi)存來保存監(jiān)測數(shù)據(jù),因此一般情況下這些監(jiān)測器是禁用的。在啟動應(yīng)用程序之前,需要運行如下命令創(chuàng)建并打開針對 SQL 語句和事務(wù)語句的事件監(jiān)測器:
其中第一步需要新建一個目錄,本例中給出在 Windows 系統(tǒng)下的命令,生成的目錄需要給數(shù)據(jù)庫管理員賬號讀寫權(quán)限。第二步用 db2 命令行工具[3]創(chuàng)建一個事件監(jiān)控器,監(jiān)控語句事件。在 DB2 中有很多種事件可以被監(jiān)控,應(yīng)根據(jù)需要選擇被監(jiān)控的事件類型,由于監(jiān)控本身有比較大的性能開銷,盡量不要選擇無關(guān)事件。在這一步中 write to file 子句后面的參數(shù)必須是一個存在的并且可寫的目錄,否則在第三步打開監(jiān)測器的時候會出現(xiàn)錯誤。第三步即通過 db2 命令行工具打開事件監(jiān)測器。在實驗結(jié)束后需要將事件導(dǎo)出成文本形式,以供后面繼續(xù)分析:
最后一步用于關(guān)閉事件監(jiān)測器。下面是一個導(dǎo)出的文本文件的例子,部分無關(guān)信息被省略。 清單 1. 語句事件文件
可以看出,該文件由一組事件記錄組成,每一條記錄有一個唯一的編號和一組屬性,如應(yīng)用程序句柄,操作類型,開始時間,結(jié)束時間等。主要內(nèi)容如表 1所示。 表 1. 事件記錄屬性列表
用 DB2 快照(Snapshot)獲得應(yīng)用程序的狀態(tài) 如前所述,在應(yīng)用程序執(zhí)行的過程中可能處于不同的狀態(tài),因此需要同時打開DB2快照監(jiān)測器捕獲應(yīng)用程序狀態(tài)信息。打開DB2快照的命令如下:
這些快照監(jiān)測器默認(rèn)設(shè)置是關(guān)閉的,可以通過如下命令查看其狀態(tài):db2 get dbm cfg。在實驗結(jié)束后,如需要關(guān)閉快照監(jiān)測器,可使用 db2 update 命令關(guān)閉,將打開命令中的 ON 改為 OFF 即可。 與事件監(jiān)測器不同,快照監(jiān)測器不是自動捕獲信息的,而是需要通過用戶發(fā)出快照命令才執(zhí)行。因此在實驗過程中,需要不斷的發(fā)出針對應(yīng)用程序的快照命令,并將結(jié)果保存到文件中。執(zhí)行快照的命令如下:
其中TRADEDB為數(shù)據(jù)庫名稱。下面是一個應(yīng)用程序的快照結(jié)果,部分無關(guān)信息被省略。 清單 2. 快照監(jiān)測器輸出結(jié)果
本步的任務(wù)是處理從上一節(jié)中得到的事件記錄文件 eventmon.txt,將其中無關(guān)的事件過濾掉。一個事件記錄文件往往會包含很多種事件,例如 SQL 語句事件、事務(wù)語句事件、數(shù)據(jù)庫連接事件、死鎖時間等。由于在本方法中只關(guān)心語句事件,因此需要將所有的非語句事件過濾掉。在事件記錄文件中,每一個事件的第一行均為一個事件序號和事件名稱:
SQL 語句和事務(wù)語句的事件名稱均為“Statement Event…”,因此可以將名稱不是“Statement Event…”的事件全部過濾掉,得到語句事件文件。
本步的任務(wù)是將屬于同一事務(wù)的語句事件聚為一類,將原本無關(guān)的語句事件劃分為一組事務(wù)的實例,每個事務(wù)實例中包含其執(zhí)行的 SQL 語句和事務(wù)語句。 圖 4. 事務(wù)分組 ![]() 由于數(shù)據(jù)庫系統(tǒng)是支持并發(fā)訪問的,即不同的應(yīng)用程序可能同時進(jìn)行數(shù)據(jù)庫操作,因此捕獲到的語句事件可能是多個事務(wù)交叉進(jìn)行的。例如圖 4 所示,SQL Event 1,SQL Event 2 和 Commit 1 是由一個應(yīng)用程序執(zhí)行的一個事務(wù),而 SQL Event 3-6 和 Commit 2 是另一個應(yīng)用程序執(zhí)行的事務(wù)。 但是在輸出的事件記錄文件中,SQL Event 3 在 Commit 1 之前。因此不能簡單的通過 Commit/Rollback 語句事件來作為區(qū)分事務(wù)的邊界。 在 DB2 中,事件監(jiān)測器的事件記錄中有兩個屬性 Appl Id 和 Appl Seq number,這兩個屬性一起唯一地標(biāo)識一個事務(wù),每當(dāng)事務(wù)結(jié)束(即 COMMIT 或 ROLLBACK 終止工作單元)時,Appl Seq number 就會遞增。在本方法中就是通過這兩個屬性來劃分事務(wù)的。通過程序或文本處理軟件將上一節(jié) 中得到的語句事件文件按照 Appl Id 和 Appl Seq number 分類,將這兩個值相同的作為一個事務(wù)。 清單 3. 事務(wù)實例文件
在上一節(jié)中已經(jīng)生成了關(guān)于事務(wù)實例的執(zhí)行信息報告,可以從中得到一個事務(wù)實例中各個SQL語句的執(zhí)行時間以及語句之間的等待時間。但是在數(shù)據(jù)庫操作中,往往會反復(fù)的執(zhí)行同一個類型的事務(wù)。例如一個網(wǎng)上銀行系統(tǒng),登陸、轉(zhuǎn)賬等事務(wù)會被不同的應(yīng)用程序不斷的調(diào)用。這樣就會出現(xiàn)一種現(xiàn)象,即一個數(shù)據(jù)庫系統(tǒng)的事務(wù)實例報告中,有很多實例屬于同一個事務(wù)類型。屬于同一個類型的實例是由同一段應(yīng)用程序代碼執(zhí)行的,但是參數(shù)值可能有所不同。如登陸事務(wù),每次登陸的用戶賬號可能不一致。 為了統(tǒng)計同一類型的事務(wù)的性能,還需要將事務(wù)實例按照類型劃分,然后計算其中的SQL語句的平均、最大最小時間。如何判斷哪些事務(wù)實例屬于同一類型是一個比較復(fù)雜的問題。由于在系統(tǒng)運行過程中一個事務(wù)類型的邏輯會發(fā)生變化,例如登陸事務(wù)可能會根據(jù)密碼正確與否執(zhí)行不同的SQL語句序列,所以很難全自動的將事務(wù)實例分類,最好引入一定的規(guī)則來作為判斷的依據(jù)。常見的分類方法有:
按照如上方法劃分之后,可以得到如表 2 所示的事務(wù)性能數(shù)據(jù): 表 2. 事務(wù)類型性能報告 ![]()
綜合事務(wù)類型信息和應(yīng)用程序狀態(tài),得到事務(wù)性能分析報告 在上一節(jié)中得到的事務(wù)性能數(shù)據(jù)已經(jīng)比較詳細(xì)的反映了一個數(shù)據(jù)庫系統(tǒng)中的事務(wù)執(zhí)行情況,包括該類型事務(wù)執(zhí)行的次數(shù),執(zhí)行時間,其中每一個 SQL 語句的執(zhí)行時間以及每兩個 SQL 語句之間的等待時間。數(shù)據(jù)庫管理員和開發(fā)者可以根據(jù)這些數(shù)據(jù)決定是否需要調(diào)優(yōu)一個事務(wù)的性能,以及應(yīng)該調(diào)整哪一個 SQL 語句。 針對某一個 SQL 語句,如果其執(zhí)行時間比較長,往往有兩種可能,一種是其在等待其他數(shù)據(jù)庫操作釋放鎖,另一種是該 SQL 語句自身比較復(fù)雜,需要較多的 CPU 計算資源或 I/O 操作。為了區(qū)分是哪一種原因,需要將快照得到的應(yīng)用程序狀態(tài)和事務(wù)性能數(shù)據(jù)綜合分析。 應(yīng)用程序的快照中包含應(yīng)用程序 ID 和快照時間戳。比較快照結(jié)果文件和事務(wù)實例文件中應(yīng)用程序 ID 和發(fā)生時間相同的記錄,可以得到該應(yīng)用程序在執(zhí)行一個 SQL 語句時的狀態(tài),是 UOW Executing 還是 Lock wait。將應(yīng)用程序狀態(tài)的統(tǒng)計信息加入事務(wù)性能報告,則可以幫助數(shù)據(jù)庫管理員和開發(fā)者找到調(diào)優(yōu)該 SQL 語句的方法。 表 3. 事務(wù)性能報告 ![]()
數(shù)據(jù)庫的事務(wù)性能分析比 SQL 語句性能分析粒度大,比調(diào)整數(shù)據(jù)庫參數(shù)影響的范圍小。本文介紹的方法通過利用 DB2 的監(jiān)測工具和對監(jiān)測數(shù)據(jù)的分析,得到關(guān)于事務(wù)的性能報告,為數(shù)據(jù)庫性能調(diào)優(yōu)提供了更多的信息。在典型的 OLTP 系統(tǒng)中,一個前端的界面操作往往對應(yīng)后端數(shù)據(jù)庫的一個事務(wù),因此提高事務(wù)的性能對于終端用戶的體驗有較為直接的改善。 學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
|