IBM 的 DB2 V9.5 引入並完善了工作負載管理(WORKLOAD MANAGEMENT)功能,使得我們可以更深入地洞察系統的運行情況並更好地控制資源和性能。在 DB2 V9.5 中,新引入的工作負載管理功能(WLM)可以幫助您標識、管理和監視數據服務器的工作負載。本文將重點介紹 DB2 V9.5 關於工作負載管理(WLM)的新特性以及相關的概念,並結合實際的例子幫助大家理解和提高。
構建數據庫環境
首先我們在 Windows XP 環境下安裝 DB2 ESE V9.5,安裝完成後,打開一個 DB2CLP 窗口,發出CREATE DB 命令,創建示例數據庫 DB2TEST1,命令中需要指定數據庫代碼頁或數據庫代碼集,因為在 DB2 V9.5 中所有創建的數據庫默認情況下數據庫代碼頁都是 1208,數據庫代碼集都是 UTF-8,這點和之前的版本不一樣。如果想把數據庫代碼頁設置成 1386,數據庫代碼集設置成 GBK,就需要在 CREATE DB 命令中把數據庫代碼頁設置成 1386 或者把數據庫代碼集設置成 GBK。具體如清單 1 所示:
清單 1. 創建示例數據庫 DB2TEST1
C:> DB2 CREATE DATABASE DB2TEST1 USING CODESET GBK TERRITORY CN COLLATE
USING SYSTEM PAGESIZE 4096
DB20000I CREATE DATABASE 命令成功完成。
命令執行成功,這樣我們創建了一個示例數據庫 DB2TEST1。繼續在這個 DB2CLP 窗口中發出 GET DB CFG 命令,查看示例數據庫 DB2TEST1 的配置參數,我們可以看到數據庫地域是 CN,數據庫代碼頁被設置成了 1386,數據庫代碼集被設置成了 GBK。另外,在 DB2 V9.5 新增了幾個參數,分別是數字兼容性、Varchar2 兼容性、十進制浮點捨入方式、啟用 XML 字符操作和 WLM 收集時間間隔(分鐘),這些參數的具體信息可以查看 DB2 信息中心。查看示例數據庫 DB2TEST1 配置參數的詳細情況請參見清單 2 所示:
清單 2. 查看示例數據庫 DB2TEST1 配置參數
C:> db2 get db cfg for db2test1
數據庫 db2test1 的數據庫配置
數據庫配置發行版級別 = 0x0c00
數據庫發行版級別 = 0x0c00
數據庫地域 = CN
數據庫代碼頁 = 1386
數據庫代碼集 = GBK
數據庫國家/地區代碼 = 86
數據庫整理順序 = UNIQUE
備用整理順序 ( ALT_COLLATE ) =
數字兼容性 = OFF
Varchar2 兼容性 = OFF
數據庫頁大小 = 4096
動態 SQL 查詢管理 ( DYN_QUERY_MGMT ) = DISABLE
對此數據庫的發現支持 ( DISCOVER_DB ) = ENABLE
限制訪問 = NO
缺省查詢優化類 ( DFT_QUERYOPT ) = 5
並行度 ( DFT_DEGREE ) = 1
在算術異常時繼續 ( DFT_SQLMATHWARN ) = NO
缺省刷新有效期 ( DFT_REFRESH_AGE ) = 0
缺省維護的選項( DFT_MTTB_TYPES )的表類型 = SYSTEM
保留的高頻值的數目 ( NUM_FREQVALUES ) = 10
保留的分位點數目 ( NUM_QUANTILES ) = 20
十進制浮點捨入方式 ( DECFLT_ROUNDING ) = ROUND_HALF_EVEN
. . . . . . . . . .
自調整內存 ( SELF_TUNING_MEM ) = ON
數據庫共享內存大小(4 KB) ( DATABASE_MEMORY ) = AUTOMATIC
數據庫內存阈值 ( DB_MEM_THRESH ) = 10
鎖定列表的最大存儲量(4 KB) ( LOCKLIST ) = AUTOMATIC
每個應用程序的鎖定百分比列表 ( MAXLOCKS ) = AUTOMATIC
程序包高速緩存大小(4 KB) ( PCKCACHESZ ) = AUTOMATIC
共享排序的排序堆域值(4 KB) ( SHEAPTHRES_SHR ) = AUTOMATIC
排序列表堆(4 KB) ( SORTHEAP ) = AUTOMATIC
. . . . . . . . . .
自動維護 ( AUTO_MAINT ) = ON
自動數據庫備份 ( AUTO_DB_BACKUP ) = OFF
自動表維護 ( AUTO_TBL_MAINT ) = ON
自動 runstats ( AUTO_RUNSTATS ) = ON
自動語句統計信息 ( AUTO_STMT_STATS ) = OFF
自動統計信息概要分析 ( AUTO_STATS_PROF ) = OFF
自動概要文件更新 ( AUTO_PROF_UPD ) = OFF
自動重組 ( AUTO_REORG ) = OFF
啟用 XML 字符操作 ( ENABLE_XMLCHAR ) = YES
WLM 收集時間間隔(分鐘) ( WLM_COLLECT_INT ) = 0
繼續在這個 DB2CLP 窗口中,發出 DB2LEVEL 命令,查看 DB2 的版本信息,需要注意 DB2 代碼發行版是 " SQL09050 ",工作負載管理(WLM)是從 DB2 V9.5 開始的,具體如清單 3 所示:
清單 3. 查看示例數據庫 DB2TEST1 的版本情況
C:> db2level
DB21085I 實例 " DB2_01 " 使用 " 32 " 位和 DB2 代碼發行版 " SQL09050 ",級別標識為" 03010107 "。
參考標記為 " DB2 v9.5.0.808 "、" s071001 " 和 " NT3295 ",修訂包為 " 0 "。
產品使用 DB2 副本名 " DB2COPY2 " 安裝在 " C:PROGRA~1IBMSQLLIB~1 " 中。
我們在操作系統中存在兩個用戶,分別是 RHETTE,和 DB2ADMIN,密碼都是 passw0rd。我們使用RHETTE 用戶在 DB2CLP 窗口中連上示例數據庫 DB2TEST1,執行帶有 CREATE TABLE 語句的腳本 project.sql,創建示例表 PROJECT,具體如清單 4 所示:
清單 4 . 創建示例表 PROJECT
C:> db2 connect to db2test1
數據庫連接信息
數據庫服務器 = DB2 / NT 9.5.0
SQL 授權標識 = RHETTE
本地數據庫別名 = DB2TEST1
C:>db2 -tvf project.sql
CREATE TABLE "RHETTE"."PROJECT" ( "PROJNO" CHAR ( 6 ) NOT NULL ,
"PROJNAME" VARCHAR ( 24 ) NOT NULL WITH DEFAULT '' , "DEPTNO" CHAR ( 3 ) NOT NULL ,
"RESPEMP" CHAR ( 6 ) NOT NULL , "PRSTAFF" DECIMAL ( 5 , 2 ) , "PRSTDATE" DATE ,
"PRENDATE" DATE , "MAJPROJ" CHAR ( 6 ) ) IN "USERSPACE1"
DB20000I SQL命令成功完成。
ALTER TABLE "RHETTE"."PROJECT" ADD CONSTRAINT "PK_PROJECT" PRIMARY KEY ( "PROJNO" )
DB20000I SQL命令成功完成。
CREATE INDEX "RHETTE"."XPROJ2" ON "RHETTE"."PROJECT" ( "RESPEMP" ASC)
ALLOW REVERSE SCANS
DB20000I SQL命令成功完成。
繼續在 DB2CLP 窗口中插入測試數據,然後發出 SELECT 語句,我們可以看到這些數據,具體如清單 5 所示:
清單 5 . 插入數據到示例表 PROJECT 中
C:> db2 select * from project
PROJNO PROJNAME DEPTNO RESPEMP PRSTAFF PRSTDATE PRENDATE MAJPROJ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AD3100 ADMIN SERVICES D01 000010 6.50 2002-01-01 2003-02-01 -
AD3110 GENERAL ADMIN SYSTEMS D21 000070 6.00 2002-01-01 2003-02-01
AD3100
AD3111 PAYROLL PROGRAMMING D21 000230 2.00 2002-01-01 2003-02-01
AD3110
AD3112 PERSONNEL PROGRAMMING D21 000250 1.00 2002-01-01 2003-02-01
AD3110
AD3113 ACCOUNT PROGRAMMING D21 000270 2.00 2002-01-01 2003-02-01
AD3110
IF1000 QUERY SERVICES C01 000030 2.00 2002-01-01 2003-02-01 -
IF2000 USER EDUCATION C01 000030 1.00 2002-01-01 2003-02-01 -
MA2100 WELD LINE AUTOMATION D01 000010 12.00 2002-01-01 2003-02-01 -
MA2110 W L PROGRAMMING D11 000060 9.00 2002-01-01 2003-02-01
MA2100
MA2111 W L PROGRAM DESIGN D11 000220 2.00 2002-01-01 1982-12-01
MA2110
MA2112 W L ROBOT DESIGN D11 000150 3.00 2002-01-01 1982-12-01
MA2110
MA2113 W L PROD CONT PROGS D11 000160 3.00 2002-02-15 1982-12-01
MA2110
OP1000 OperaTION SUPPORT E01 000050 6.00 2002-01-01 2003-02-01 -
OP1010 OperaTION E11 000090 5.00 2002-01-01 2003-02-01
OP1000
OP2000 GEN SYSTEMS SERVICES E01 000050 5.00 2002-01-01 2003-02-01 -
OP2010 SYSTEMS SUPPORT E21 000100 4.00 2002-01-01 2003-02-01
OP2000
OP2011 SCP SYSTEMS SUPPORT E21 000320 1.00 2002-01-01 2003-02-01
OP2010
OP2012 APPLICATIONS SUPPORT E21 000330 1.00 2002-01-01 2003-02-01
OP2010
OP2013 DB/DC SUPPORT E21 000340 1.00 2002-01-01 2003-02-01
OP2010
PL2100 WELD LINE PLANNING B01 000020 1.00 2002-01-01 2002-09-15
MA2100
20 條記錄已選擇。
定義服務類(SERVICE CLASS)
服務類的目的是為工作運行定義一個執行環境,這個環境包含可用的資源和不同的執行阈值,當你定義一個工作負載時,你必須為之指定對應的服務類。如果你沒有顯式的定義工作負載,用戶數據庫請求會被認為是系統默認的工作負載,其對應的服務類是系統默認的用戶服務類。所有的系統數據庫請求,對應的都是默認系統服務類。
所有的數據庫請求都是在服務類中執行的,並且在服務類中獲得相應的資源。所有的連接都是映射到工作負載上的,所有的工作負載都是映射到服務類上的。針對服務類中資源分配的情況,可以定義相應的阈值,來進行限定。DB2 的服務類擁有兩層結構:服務父類(Service Superclass)和服務子類(Service Subclass)。
當你使用服務類時,你可以通過控制這個服務類的一系列屬性,使不同的工作具有不同的優先級。比如,你可以設置服務類中工作的 I/O 頁預取優先級,設置服務類中所有代理的 CPU 優先級,你還可以通過不同類型的阈值控制服務類中工作所使用的資源。
下面我們打開一個 DB2CLP 窗口,發出 ALTER SERVICE CLASS 命令,使服務類 super_class、服務子類subclass_rhette、subclass_db2admin 失效,接著發出 DROP SERVICE CLASS 命令,刪除服務類和服務子類。需要注意的是,如果你想刪除一個服務父類(service superclass),需要保證所有相關的服務子類、工作負載、連接、動作、阈值等都無效。DROP SERVICE CLASS 命令成功完成後,發出 CREATE SERVICE CLASS 命令,創建我們需要的服務父類和服務子類,具體如清單 6 所示:
清單 6 . 創建服務類和服務子類
C:> db2 -tvf create_serviceclass.sql
alter service class subclass_rhette under super_class disable
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N " SUPER_CLASS " 是一個未定義的名稱。 SQLSTATE = 42704
alter service class subclass_db2admin under super_class disable
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N " SUPER_CLASS " 是一個未定義的名稱。 SQLSTATE = 42704
alter service class super_class disable
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N " SUPER_CLASS " 是一個未定義的名稱。 SQLSTATE = 42704
drop service class subclass_rhette under super_class
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N " SUPER_CLASS " 是一個未定義的名稱。 SQLSTATE = 42704
drop service class subclass_db2admin under super_class
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N " SUPER_CLASS " 是一個未定義的名稱。 SQLSTATE = 42704
drop service class super_class
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在
SQL 處理期間,它返回:
SQL0204N " SUPER_CLASS " 是一個未定義的名稱。 SQLSTATE = 42704
create service class super_class
DB20000I SQL命令成功完成。
create service class subclass_rhette under super_class agent priority
default prefetch priority default collect activity data on all with details
and values collect aggregate activity data base collect aggregate request data base
DB20000I SQL命令成功完成。
create service class subclass_db2admin under super_class agent priority 6
prefetch priority high
DB20000I SQL命令成功完成。
名稱成功完成,需要注意的是我們在執行 CREATE SERVICE CLASS 命令時,指定了多個選項,下面來分別介紹一下:
AGENT PRIORITY DEFAULT or AGENT PRIORITY integer-constant
代理進程的優先級實際是 CPU 的優先級。
需要注意的是,使用這個屬性只適用於用戶請求對應的服務類,不適合系統數據庫請求對應的系統服務類。你可以使用這個屬性把當前服務類中代理的線程優先級和其他服務類區別開來。
AGENT PRIORITY integer-constant:指定運行在服務類中的代理相對於操作系統優先級的相對值。 AGENT PRIORITY DEFAULT:和運行在 DB2 中的線程一樣的正常優先級。默認值是 DEFAULT。當代理優先級設置為 DEFAULT 時,沒有特殊的操作發生,服務類中的代理將按照所有的 DB2 線程一樣的優先級進行調度。DEDAULT 對應的值是 -32768。
當這個參數設置成 DEFAULT 以外的值時,代理真正的優先級將是正常優先級加上 AGENT PRIORITY,並將在下次動作時生效。比如,如果正常的優先級是 20,並且我們把這個參數設置成 6,那麼服務類中的代理的優先級是 20+6=26.
當服務父類的代理優先級設成 default 時,那麼這個服務父類中的代理將按照和操作系統調度 DB2 線程一樣的優先級進行調度。當服務子類的代理優先級設成 default 時,服務子類繼承服務父類的進程優先級。默認的服務子類的代理優先級不能進行修改。
在 Linux 和 UNIX 平台,integer-constant 的值可以是 -20 到 20(值越小代表的優先級越高),在Windows 平台,integer-constant 的值可以是 -6 到 6(值越小代表的優先級月低)。
PREFETCH PRIORITY
你可以使用這個參數來控制服務類中代理的預取優先級。可選的值有 high, medium, low. 當你設置了這個參數,服務類中的代理對應的預取順序在下次將按照你設置的值進行。如果你在一個預取請求提交後再修改這個參數的值,那麼這個預取請求將不受新的設置參數值映像。
DEFAULT :對一個數據庫服務父類來說,默認的值是 medium 預取順序。當你對數據庫服務子類指定默認值時,服務子類將繼承相應的服務父類的預取優先級。
HIGH :把預取優先級設成高的。
MEDIUM :把預取優先級設成中的。
LOW :把預取優先級設成低的。
COLLECT ACTIVITY DATA
指定當動作完成後服務類中執行的每個動作信息都發送到相應的事件監控器中。默認值是 COLLECT ACTIVITY DATA NONE。COLLECT ACTIVITY DATA 子句只適用於服務子類。
NONE :指定將不收集這個服務類中執行每個動作信息。
ON COORDINATOR DATABASE PARTITION: 指定只收集動作所在數據庫分區上的動作數據。
ON ALL DATABASE PARTITIONS : 指定收集所有數據庫分區上的動作數據。但是,動作細節和值還是只在動作所在的數據庫分區上收集。
WITHOUT DETAILS : 指定語句和編譯環境不發送給事件監控器。
WITH DETAILS : 指定將語句和編譯環境發送給事件監控器。
AND VALUES : 指定把動作相關的輸入數據值發送給相應的事件監控器。
COLLECT AGGREGATE ACTIVITY DATA
指定捕獲這個服務類相關的 aggregate activity data 並發送給相應的事件監控器。這些信息將被定期收集,收集的頻率受工作負載管理收集時間間隔配置參數 (wlm_collect_int) 數據庫配置參數控制。默認值是 COLLECT AGGREGATE ACTIVITY DATA NONE. COLLECT AGGREGATE ACTIVITY DATA 子句只適用於服務子類。
BASE : 指定這個服務類的基本 aggregate activity data 將被捕獲並發送給相應的事件監控器。
EXTENDED : 指定這個服務類的所有 aggregate activity data 將被捕獲並發送給相應的事件監控器。
NONE : 指定將不捕獲這個服務類的 aggregate activity data 。
COLLECT AGGREGATE REQUEST DATA
指定捕獲這個服務類相關的 aggregate request data 並發送給相應的事件監控器。這些信息將被定期收集,收集的頻率受工作負載管理收集時間間隔配置參數 (wlm_collect_int) 數據庫配置參數控制。 默認值是COLLECT AGGREGATE ACTIVITY DATA NONE。 COLLECT AGGREGATE ACTIVITY DATA 子句只適用於服務子類。
BASE :指定這個服務類的基本 aggregate request data 將被捕獲並發送給相應的事件監控器。
NONE :指定將不捕獲這個服務類的 aggregate request data 。
工作負載管理收集時間間隔配置參數(wlm_collect_int)
此參數指定工作負載管理(WLM)統計信息的收集和復位時間間隔(以分鐘為單位)。
每隔 x wlm_collect_int 分鐘(其中 x 是 wlm_collect_int 參數的值),就會收集所有工作負載管理統計信息並將它們發送至任何活動統計信息事件監視器,然後復位統計信息。如果存在活動事件監視器,那麼將根據該事件監視器的創建方式,將統計信息寫入文件或表。如果它不存在,那麼將只復位統計信息,而不進行收集。
可以使用統計信息事件監視器收集的工作負載管理統計信息來監視短期和長期系統行為。由於可以將結果合並在一起來獲得長期行為,所以可以使用較小的時間間隔來同時獲得短期系統行為和長期系統行為。但是,由於必須手動合並不同時間間隔中的結果,這將使分析變得復雜。如果不需要手動合並結果,那麼較小的時間間隔會導致不必要的開銷增大。因此,減小時間間隔以捕獲較短期的行為,並且在只分析長期行為就已足夠的情況下,增大時間間隔以減少開銷。
需要對每個數據庫定制時間間隔,而不是對每個 SQL 請求、命令調用或應用程序進行定制。沒有其他配置參數需要考慮。
注: 所有 WLM 統計信息表函數都返回自上次復位統計信息以來累積的統計信息。將按此配置參數指定的時間間隔定期復位統計信息。
需要注意的是,默認的服務子類 SYSDEFAULTSUBCLASS,自動為每個服務父類自動創建一個。我們可以通過系統視圖 SYSCAT.SERVICECLASSES,或者通過 db2pd 加 –serviceclasses 選項進行查看定義的服務類。
繼續在 DB2CLP 窗口中,發出 DB2PD 命令,查看我們創建的服務類情況,我們可以看到服務父類SUPER_CLASS,服務子類 SUBCLASS_RHETTE、SUBCLASS_DB2ADMIN,以及默認創建的服務子類SYSDEFAULTSUBCLASS,具體如清單7所示:
清單 7 . 查看窗口的服務類
Database Partition 0 - - Database DB2TEST1 - - Active - - Up 0 days 06 : 26 : 15
Service Classes:
. . . . . . . . . .
Service Class Name = SUPER_CLASS
Service Class ID = 14
Service Class Type = Service Superclass
Default Subclass ID = 15
Service Class State = Enabled
Agent Priority = Default
Prefetch Priority = Default
Outbound Correlator = None
Work Action Set ID = N/A
Collect Activity Opt = None
Num Connections = 0
Last Statistics Reset Time = 2007 - 12 - 27 13:33:05.000000
Num Coordinator Connections = 0
Coordinator Connections HWM = 0
Associated Workload Occurrences ( WLO ) :
AppHandl [ nod - index ] WL ID WLO ID UOW ID WLO State
Service Class Name = SYSDEFAULTSUBCLASS
Service Class ID = 15
Service Class Type = Service Subclass
Parent Superclass ID = 14
Service Class State = Enabled
Agent Priority = Default
Prefetch Priority = Default
Outbound Correlator = None
Collect Activity Opt = None
Collect Aggr Activity Opt = None
Collect Aggr Request Opt = None
Act Lifetime Histogram Template ID = 1
Act Queue Time Histogram Template ID = 1
Act Execute Time Histogram Template ID = 1
Act Estimated Cost Histogram Template ID = 1
Act Interarrival Time Histogram Template ID = 1
Request Execute Time Histogram Template ID = 1
Access Count = 0
Last Stats Reset Time = 2007-12-27 13:33:05.000000
ActivitIEs HWM = 0
ActivitIEs Completed = 0
ActivitIEs Rejected = 0
ActivitIEs Aborted = 0
Associated Agents:
EDU ID AppHandl [ nod-index ] WL ID WLO ID UOW ID Activity ID
Associated Non-agent threads:
PID TID Thread Name
Service Class Name = SUBCLASS_RHETTE
Service Class ID = 16
Service Class Type = Service Subclass
Parent Superclass ID = 14
Service Class State = Enabled
Agent Priority = Default
Prefetch Priority = Default
Outbound Correlator = None
Collect Activity Opt = On all partitions with details and values
Collect Aggr Activity Opt = Base
Collect Aggr Request Opt = Base
Act Lifetime Histogram Template ID = 1
Act Queue Time Histogram Template ID = 1
Act Execute Time Histogram Template ID = 1
Act Estimated Cost Histogram Template ID = 1
Act Interarrival Time Histogram Template ID = 1
Request Execute Time Histogram Template ID = 1
Access Count = 0
Last Stats Reset Time = 2007-12-27 13:33:05.000000
ActivitIEs HWM = 0
ActivitIEs Completed = 0
ActivitIEs Rejected = 0
ActivitIEs Aborted = 0
Associated Agents:
EDU ID AppHandl [ nod-index ] WL ID WLO ID UOW ID Activity ID
Associated Non-agent threads:
PID TID Thread Name
Service Class Name = SUBCLASS_DB2ADMIN
Service Class ID = 17
Service Class Type = Service Subclass
Parent Superclass ID = 14
Service Class State = Enabled
Agent Priority = 6
Prefetch Priority = High
Outbound Correlator = None
Collect Activity Opt = None
Collect Aggr Activity Opt = None
Collect Aggr Request Opt = None
Act Lifetime Histogram Template ID = 1
Act Queue Time Histogram Template ID = 1
Act Execute Time Histogram Template ID = 1
Act Estimated Cost Histogram Template ID = 1
Act Interarrival Time Histogram Template ID = 1
Request Execute Time Histogram Template ID = 1
Access Count = 0
Last Stats Reset Time = 2007-12-27 13:33:05.000000
ActivitIEs HWM = 0
ActivitIEs Completed = 0
ActivitIEs Rejected = 0
ActivitIEs Aborted = 0
Associated Agents:
EDU ID AppHandl [ nod-index ] WL ID WLO ID UOW ID Activity ID
Associated Non-agent threads:
PID TID Thread Name
我們也可以通過控制中心查看系統視圖 SYSDEFAULTSUBCLASS,來看一下我們創建的服務類情況,具體如圖 2 所示:
圖 2 . 查看已定義的服務類