DB2 V9.5工作負(fù)載管理之如何實(shí)現(xiàn)工作負(fù)載
IBM DB2 V9.5 中,新引入的工作負(fù)載管理功能( WLM )可以幫助您標(biāo)識、管理和監(jiān)視數(shù)據(jù)服務(wù)器的工作負(fù)載。本文將通過示例介紹如何實(shí)現(xiàn) DB2 V9.5 的工作負(fù)載管理( WLM )相關(guān)的功能。
工作負(fù)載(WORKLOAD)
工作負(fù)載( WORKLOAD )通過工作所在的數(shù)據(jù)庫連接屬性來標(biāo)識數(shù)據(jù)庫活動。工作負(fù)載( WORKLOAD )是用來分配工作給服務(wù)類( Service Class )的方法,是一個(gè)根據(jù)工作的來源( source )標(biāo)識區(qū)分工作的對象,以方便隨后對工作進(jìn)行相應(yīng)的管理。來源( source )是由工作所在的數(shù)據(jù)庫連接的屬性決定的。
當(dāng)服務(wù)器收到多個(gè)用戶請求,首先將對用戶請求進(jìn)行評估標(biāo)識(此時(shí)處于 WLM 第一階段 標(biāo)識階段),當(dāng)其數(shù)據(jù)庫連接屬性符合某個(gè)已經(jīng)定義的工作負(fù)載,則將其分配給特定工作負(fù)載所在的服務(wù)類中執(zhí)行。如果不能和已經(jīng)定義的工作負(fù)載相匹配,則將用戶請求分配給缺省用戶工作負(fù)載所在的缺省用戶服務(wù)類中執(zhí)行。
當(dāng)服務(wù)器收到系統(tǒng)請求時(shí),將其分配給默認(rèn)系統(tǒng)服務(wù)類中執(zhí)行。
當(dāng)服務(wù)器收到維護(hù)請求時(shí),將其分配給默認(rèn)維護(hù)服務(wù)類中執(zhí)行。
默認(rèn)系統(tǒng)服務(wù)類名為: SYSDEFAULTSYSTEMCLASS,其下有一個(gè)默認(rèn)的服務(wù)子類: SYSDEFAULTSUBCLASS。
默認(rèn)維護(hù)服務(wù)類名為:SYSDEFAULTMAINTENANCECLASS,其下有一個(gè)默認(rèn)的服務(wù)子類:SYSDEFAULTSUBCLASS。
默認(rèn)用戶服務(wù)類名為:SYSDEFAULTUSERCLASS,其下有一個(gè)默認(rèn)的服務(wù)子類:SYSDEFAULTSUBCLASS。
圖 3 . 服務(wù)類和工作負(fù)載
接下來我們繼續(xù)在剛才的 DB2CLP 窗口發(fā)出 ALTER WORKLOAD 命令,使工作負(fù)載 WL_RHETTE 和 WL_DB2ADMIN 失效。然后發(fā)出 DROP WORKLOAD 命令,刪除工作負(fù)載 WL_RHETTE 和 WL_DB2ADMIN。最后發(fā)出 CREATE WORKLOAD 命令,創(chuàng)建工作負(fù)載工 WL_RHETTE 和 WL_DB2ADMIN。工作負(fù)載 WL_RHETTE 對應(yīng)的服務(wù)子類是 subclass_rhette,對應(yīng)的服務(wù)父類是 super_class。工作負(fù)載 WL_DB2ADMIN 對應(yīng)的服務(wù)子類是 subclass_db2admin,對應(yīng)的服務(wù)父類是 super_class。需要注意的是,如果你想刪除一個(gè)工作負(fù)載,那么必須先讓該工作負(fù)載失效。具體如清單8所示:
清單8 . 創(chuàng)建工作負(fù)載 WL_RHETTE 和 WL_DB2ADMIN
C:> db2 -tvf wl_create.sql
alter workload wl_rhette disable
DB21034E 該命令被當(dāng)作 SQL 語句來處理,因?yàn)樗菬o效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_RHETTE " 是一個(gè)未定義的名稱。 SQLSTATE = 42704
alter workload wl_db2admin disable
DB21034E 該命令被當(dāng)作 SQL 語句來處理,因?yàn)樗菬o效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_DB2ADMIN " 是一個(gè)未定義的名稱。 SQLSTATE = 42704
drop workload wl_rhette
DB21034E 該命令被當(dāng)作 SQL 語句來處理,因?yàn)樗菬o效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_RHETTE " 是一個(gè)未定義的名稱。 SQLSTATE = 42704
drop workload wl_db2admin
DB21034E 該命令被當(dāng)作 SQL 語句來處理,因?yàn)樗菬o效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_DB2ADMIN " 是一個(gè)未定義的名稱。 SQLSTATE = 42704
create workload wl_rhette session_user ( 'RHETTE' ) service class subclass_rhette
under super_class
DB20000I SQL命令成功完成。
create workload wl_db2admin session_user ( 'DB2ADMIN' ) service class subclass_db2
admin under super_class
DB20000I SQL命令成功完成。
命令成功完成,工作負(fù)載是通過工作所在的數(shù)據(jù)庫連接屬性來標(biāo)識數(shù)據(jù)庫活動,數(shù)據(jù)庫連接的屬性可以是:
APPLNAME ( ' application - name ' , . . . )
為APPLNAME連接屬性指定一個(gè)或多個(gè)應(yīng)用程序名稱。在列表中同一個(gè)應(yīng)用程序名稱不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。應(yīng)用程序名稱是大小寫敏感的,應(yīng)用程序名稱就是我們執(zhí)行 LIST APPLICATIONS 命令顯示的值。
SYSTEM_USER ( ' authorization – name ' , . . . )
為 SYSTEM USER 連接屬性指定一個(gè)或多個(gè)授權(quán) ID。在列表中同一個(gè)授權(quán) ID 不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
SESSION_USER ( ' authorization – name ' , . . . )
為 SESSION USER 連接屬性指定一個(gè)或多個(gè)授權(quán) ID。需要注意的是,授權(quán) ID 大小寫敏感。在列表中同一個(gè)授權(quán) ID 不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
SESSION_USER GROUP ( ' authorization – name ' , . . . )
為 SESSION_USER GROUP 連接屬性指定一個(gè)或多個(gè)授權(quán) ID。在列表中同一個(gè)授權(quán) ID 不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
SESSION_USER ROLE ( ' authorization – name ' , . . . )
為 SESSION_USER ROLE 連接屬性指定一個(gè)或多個(gè)授權(quán) ID。這里會話授權(quán)ID的角色是指會話授權(quán) ID 所有可用的角色,不管這些角色是怎么獲得的。在列表中同一個(gè)授權(quán) ID 不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
CURRENT CLIENT_USERID ( ' user – id ' , . . . )
為 CURRENT CLIENT_USERID 連接屬性指定一個(gè)或多個(gè)客戶端用戶 ID。在列表中同一個(gè)客戶端用戶 ID 不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
CURRENT CLIENT_APPLNAME ( ' client – application – name ' , . . . )
為 CURRENT CLIENT_APPLNAME 連接屬性指定一個(gè)或多個(gè)應(yīng)用程序名稱。在列表中同一個(gè)應(yīng)用程序名稱不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。這個(gè) client – application – name 是大小寫敏感的,其值就是系統(tǒng)監(jiān)控器輸出中的 " TP Monitor client application name " 值。
CURRENT CLIENT_WRKSTNNAME ( ' workstation – name ' , . . . )
為 CURRENT CLIENT_WRKSTNNAME 連接屬性指定一個(gè)或多個(gè)客戶端工作站名稱。在列表中同一個(gè)客戶端工作站名稱不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
CURRENT CLIENT_ACCTNG ( ' accounting – string ' , . . . )
為 CURRENT CLIENT_ACCTNG 連接屬性指定一個(gè)或多個(gè) accounting string。在列表中同一個(gè)客戶端 accounting string 不能出現(xiàn)多次,否則會報(bào) SQLSTATE 42713 錯(cuò)誤。
如果想查看已經(jīng)定義的工作負(fù)載,可以通過查看系統(tǒng)視圖 SYSCAT.WORKLOADS 的方式查看,也可以通過使用 DB2PD 工具進(jìn)行查看,需要使用 DB2PD 工具的 workloads 選項(xiàng)。繼續(xù)在當(dāng)前 DB2CLP 窗口中,發(fā)出 DB2P 命令,部分輸出信息如清單 9 所示:
清單9 . 查看工作負(fù)載的定義情況
C:> db2pd -workloads -db db2test1
Database Partition 0 - - Database DB2TEST1 - - Active - - Up 0 days 15:58:51
Workload Definition :
Address WorkloadID WorkloadName DBAccess
0x7E69F2E0 3 WL_RHETTE ALLOW
0x7E69F384 4 WL_DB2ADMIN ALLOW
0x7E69F428 1 SYSDEFAULTUSERWORKLOAD ALLOW
0x7E69F4C0 2 SYSDEFAULTADMWORKLOAD ALLOW
Usage Privilege Holders :
Address WorkloadID Type AuthID
0x7E687774 1 GROUP PUBLIC
Local Partition Workload Statistics :
Address WorkloadID WorkloadName NumWLO
0x7E6861C0 1 SYSDEFAULTUSERWORKLOAD 1
0x7E688D60 2 SYSDEFAULTADMWORKLOAD 0
0x7E69F150 3 WL_RHETTE 0
0x7E686070 4 WL_DB2ADMIN 0
我們也可以通過控制中心查看系統(tǒng)視圖 SYSCAT.WORKLOADS,來看一下我們創(chuàng)建的工作負(fù)載情況,具體如圖4所示:
對特定的工作負(fù)載(和一個(gè)特定的連接相關(guān)聯(lián))來說,其會話用戶必須具有該工作負(fù)載的 USAGE 特權(quán),如果想查看工作負(fù)載相關(guān)的 USAGE 特權(quán),可以訪問系統(tǒng)視圖 SYSCAT.WORKLOADAUTH。我們繼續(xù)在當(dāng)前的 DB2CLP 窗口中,發(fā)出 GRANT 命令,把工作負(fù)載 WL_RHETTE 和 WL_DB2ADMIN 的 USAGE 特權(quán)賦給 PUBLIC 組,具體如清單 10 所示:
清單 10 . 把工作負(fù)載 USAGE 權(quán)限分配給 PUBLIC 組
C:> db2 grant usage on workload WL_RHETTE to public
DB20000I SQL命令成功完成。
C:> db2 grant usage on workload WL_DB2ADMIN to public
DB20000I SQL命令成功完成。
下面我們來看一下數(shù)據(jù)庫連接、工作負(fù)載和服務(wù)類在具體的場景中是什么樣子。
首先,我們關(guān)閉當(dāng)前的 DB2CLP 窗口,再打開三個(gè)新的 DB2CLP 窗口,這樣我們就有三個(gè) DB2CLP 窗口,分別稱之為窗口1、窗口2、窗口3。在窗口1中,我們發(fā)出 DB2 CONNECT 命令,連上示例數(shù)據(jù)庫 DB2TEST1,用戶名為 admnistrator,具體如清單 11 所示:
清單11 . 在窗口 1 中使用 admnistrator 用戶連接數(shù)據(jù)庫
C:> db2 connect to db2test1 user administrator using passw0rd
數(shù)據(jù)庫連接信息
數(shù)據(jù)庫服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識 = ADMINIST . . .
本地?cái)?shù)據(jù)庫別名 = DB2TEST1
命令成功完成,下面我們在窗口 2 中使用 RHETTE 用戶連接示例數(shù)據(jù)庫 DB2TEST1,并執(zhí)行 SELECT 語句訪問示例表 PROJEC,做一個(gè)查詢量小的查詢(用 PROJECT 表外連接自己),具體如清單 12 所示:
清單 12 . 在窗口 2 中使用 RHETTE 用戶連接數(shù)據(jù)庫
C:> db2 connect to db2test1 user rhette using passw0rd
數(shù)據(jù)庫連接信息
數(shù)據(jù)庫服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識 = RHETTE
本地?cái)?shù)據(jù)庫別名 = DB2TEST1
C:> db2 select count ( * ) from project , project , project
1
- - - - - - - - - - - - - - - - - - - - - - - - - -
8000
1 條記錄已選擇。
命令成功完成,下面我們在窗口 3 中用 DB2ADMIN 用戶連接示例數(shù)據(jù)庫 DB2TEST1,并執(zhí)行 SELECT 語句訪問示例表 PROJEC,做一個(gè)查詢量小的查詢(用 PROJECT 表外連接自己),具體如清單 13 所示:
清單13 . 在窗口 2 中使用 DB2ADMIN 用戶連接數(shù)據(jù)庫
C:> db2 connect to db2test1 user db2admin using passw0rd
數(shù)據(jù)庫連接信息
數(shù)據(jù)庫服務(wù)器 = DB2 / NT 9.5.0
SQL 授權(quán)標(biāo)識 = DB2ADMIN
本地?cái)?shù)據(jù)庫別名 = DB2TEST1
C:> db2 select count ( * ) from rhette.project , rhette.project , rhette.project
1
- - - - - - - - - - - - - - - - - - - - - - - - - -
8000
1 條記錄已選擇。
命令執(zhí)行成功,下面我們回到窗口 1,通過訪問表函數(shù) wlm_get_service_class_workload_occurrences 來獲取當(dāng)前發(fā)生的工作負(fù)載列表,在返回的結(jié)果集中,還將返回這些工作負(fù)載的一些相關(guān)信息,比如其所在的服務(wù)子類、服務(wù)父類等,具體如清單 14 所示:
清單14 . 在窗口 1 中查看當(dāng)前發(fā)生的工作負(fù)載( workload )
C:>db2 select substr ( session_auth_id , 1 , 8 ) as user,
substr ( char ( application_handle ) , 1 , 7 ) as apphndl,
substr ( workload_name , 1 , 24 ) as workload_name ,
substr ( service_superclass_name , 1 , 19 ) as superclass_name ,
substr ( service_subclass_name , 1 , 18 ) as subclass_name ,
substr ( char ( workload_occurrence_id ) , 1 , 6 ) as wlo_id ,
uow_id from
table ( wlm_get_service_class_workload_occurrences ( cast ( null as varchar ( 128 ) ) ,
cast( nullas varchar ( 128 ) ) , -2 ) ) as scinfo
USER APPHNDL WORKLOAD_NAME SUPERCLASS_NAME
SUBCLASS_NAME WLO_ID UOW_ID
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ADMINIST 580 SYSDEFAULTUSERWORKLOAD SYSDEFAULTUSERCLASS
SYSDEFAULTSUBCLASS 1 2
RHETTE 599 WL_RHETTE SUPER_CLASS
SUBCLASS_RHETTE 1 2
DB2ADMIN 600 WL_DB2ADMIN SUPER_CLASS
SUBCLASS_DB2ADMIN 1 4
3條記錄已選擇。
命令成功完成,在返回結(jié)果中可以看到,當(dāng)前存在 3 個(gè)工作負(fù)載。
窗口 1 中 ADMINISTRATOR 用戶所在的數(shù)據(jù)庫連接,對應(yīng)的工作負(fù)載是系統(tǒng)默認(rèn)用戶工作負(fù)載 SYSDEFAULTUSERWORKLOAD,默認(rèn)用戶工作負(fù)載所對應(yīng)的服務(wù)子類是默認(rèn)用戶服務(wù)子類 SYSDEFAULTSUBCLASS,默認(rèn)用戶工作負(fù)載所對應(yīng)的服務(wù)子類是默認(rèn)用戶服務(wù)父類 SYSDEFAULTUSERCLASS。
窗口 2 中 RHETTE 用戶所在的數(shù)據(jù)庫連接,對應(yīng)的工作負(fù)載是我們開始的時(shí)候在清單 8 中定義的工作負(fù)載 WL_RHETTE,該工作負(fù)載所對應(yīng)的服務(wù)子類是 SUBCLASS_RHETTE,該工作負(fù)載所對應(yīng)的服務(wù)父類是 SUPER_CLASS。
窗口 3 中 DB2ADMIN 用戶所在的數(shù)據(jù)庫連接,對應(yīng)的工作負(fù)載是我們開始的時(shí)候在清單 8 中定義的工作負(fù)載 WL_DB2ADMIN ,該工作負(fù)載所對應(yīng)的服務(wù)子類是 SUBCLASS_DB2ADMIN,該工作負(fù)載所對應(yīng)的服務(wù)父類是 SUPER_CLASS。
下面我看一下同樣的查詢在不同的工作負(fù)載下執(zhí)行速度有什么樣的差別。大家還記得我們在清單 6 中定義的服務(wù)子類 SUBCLASS_RHETTE 和 SUBCLASS_DB2ADMIN,對其代理優(yōu)先級(也就是使用 CPU 資源的優(yōu)先級)做了不同的定義,服務(wù)子類 SUBCLASS_RHETTE 對應(yīng)的代理優(yōu)先級是 DEFAULT,服務(wù)子類 SUBCLASS_DB2ADMIN 的代理優(yōu)先級是 6。
當(dāng)服務(wù)子類的代理優(yōu)先級設(shè)成 DEFAULT 時(shí),服務(wù)子類繼承服務(wù)父類的進(jìn)程優(yōu)先級。也就是說服務(wù)子類 SUBCLASS_RHETTE 繼承服務(wù)父類 SUPER_CLASS 的代理優(yōu)先級,而 SUPER_CLASS 的代理優(yōu)先級也是 DEFAULT。當(dāng)代理優(yōu)先級設(shè)置為 DEFAULT 時(shí),沒有特殊的操作發(fā)生,服務(wù)類中的代理將按照所有的 DB2 線程一樣的優(yōu)先級進(jìn)行調(diào)度。DEDAULT 對應(yīng)的值是 -32768。
服務(wù)子類 SUBCLASS_DB2ADMIN 的代理優(yōu)先級是 6,則意味這代理真正的優(yōu)先級將是正常優(yōu)先級加上 AGENT PRIORITY,并將在下次動作時(shí)生效。比如,如果正常的優(yōu)先級是 20,并且我們把這個(gè)參數(shù)設(shè)置成 6,那么服務(wù)類中的代理的優(yōu)先級是 20+6=26.
在 Windows 平臺,優(yōu)先級為負(fù)值則意味著優(yōu)先級低,所以服務(wù)子類 SUBCLASS_DB2ADMIN 的代理優(yōu)先級比服務(wù)子類 SUBCLASS_RHETTE 高。
在窗口 1、2、3 中都斷開原有的數(shù)據(jù)庫連接。然后在窗口 2 中,使用 RHETTE 用戶連接示例數(shù)據(jù)庫 DB2TEST1,在窗口 3 中,使用 RHETTE 用戶連接示例數(shù)據(jù)庫 DB2TEST1,然后在兩個(gè)窗口中幾乎同時(shí)執(zhí)行如下語句:
db2 select count ( * ) from rhette.project , rhette.project , rhette.project , rhette.project , rhette.project , rhette.project
可以發(fā)現(xiàn)窗口 2 和窗口 3 這條語句執(zhí)行的時(shí)間也差不多。
但當(dāng)我們在窗口 3 中用 DB2ADMIN 連接示例數(shù)據(jù)庫 DB2TEST1 時(shí),還是執(zhí)行剛才的 SELECT 語句,就會發(fā)現(xiàn)窗口 3 比窗口 2 快很多,這是因?yàn)?DB2ADMIN 用戶執(zhí)行的語句所在的服務(wù)子類 SUBCLASS_DB2ADMIN 代理優(yōu)先級高的原因。
如果想查看服務(wù)類或服務(wù)子類執(zhí)行的次數(shù),可以通過訪問表函數(shù) WLM_GET_SERVICE_SUBCLASS_STATS 來查看,比如我們在窗口 1 中發(fā)出如下命令,具體如清單 15 所示:
清單15 . 在窗口 1 中查看服務(wù)類或服務(wù)子類執(zhí)行的次數(shù)
C:> db2 select substr ( service_superclass_name , 1 , 19 ) as superclass_name ,
substr ( service_subclass_name , 1 , 18 ) as subclass_name ,
substr ( char ( dbpartitionnum ) , 1 , 4 ) as part , concurrent_act_top as acttop ,
coord_act_completed_total as completed from
table ( WLM_GET_SERVICE_SUBCLASS_STATS ( cast ( null as VARCHAR ( 128 ) ) ,
cast ( null as VARCHAR ( 128 ) ) , -2 ) ) as scstats order by superclass_name ,
subclass_name , part
SUPERCLASS_NAME SUBCLASS_NAME PART ACTTOP COMPLETED
- - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUPER_CLASS SUBCLASS_DB2ADMIN 0 1 1
SUPER_CLASS SUBCLASS_RHETTE 0 1 4
SUPER_CLASS SYSDEFAULTSUBCLASS 0 0 0
SYSDEFAULTMAINTENAN SYSDEFAULTSUBCLASS 0 0 0
SYSDEFAULTSYSTEMCLA SYSDEFAULTSUBCLASS 0 0 0
SYSDEFAULTUSERCLASS SYSDEFAULTSUBCLASS 0 1 5
6 條記錄已選擇。
C:>
命令執(zhí)行成功,關(guān)于表函數(shù) WLM_GET_SERVICE_SUBCLASS_STATS 更多的信息可以查看 DB2 V9.5 信息中心。另外,還可以通過訪問表函數(shù) WLM_GET_WORKLOAD_STATS 來查看多少工作負(fù)載完成、失敗或者被拒絕,比如我們在窗口 1 中發(fā)出如清單 16 所示的語句:
清單 16 . 在窗口 1 中查看工作負(fù)載的執(zhí)行情況
C:> db2 select substr ( workload_name , 1 , 24 ) as wl_def_name,
concurrent_wlo_top as wlo_top, concurrent_wlo_act_top as wlo_act_top ,
int ( coord_act_completed_total ) as completed,
int ( coord_act_aborted_total ) as aborted,
int( coord_act_rejected_total ) as rejected
from table( WLM_GET_WORKLOAD_STATS ( cast ( null as varchar( 128 ) ) , -2 ) )
as wlstats order by wl_def_name
WL_DEF_NAME WLO_TOP WLO_ACT_TOP COMPLETED ABORTED REJECTED
- - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SYSDEFAULTADMWORKLOAD 0 0 0 0 0
SYSDEFAULTUSERWORKLOAD 1 1 6 0 0
WL_DB2ADMIN 1 1 1 2 0
WL_RHETTE 1 1 4 2 0
4 條記錄已選擇。
相關(guān)文章:
1. 用一個(gè)實(shí)例講解DB2數(shù)據(jù)庫游標(biāo)循環(huán)的問題2. 個(gè)人經(jīng)驗(yàn)總結(jié):DB2數(shù)據(jù)庫技術(shù)關(guān)鍵領(lǐng)域列表3. 解決db2事務(wù)日志已滿及日志磁盤空間已滿問題辦法詳解4. DB2數(shù)據(jù)庫創(chuàng)建存儲過程時(shí)遇到的錯(cuò)誤5. DB2 9數(shù)據(jù)服務(wù)器發(fā)展3部曲6. DB2數(shù)據(jù)庫部分日常實(shí)用操作7. db2 導(dǎo)入導(dǎo)出單個(gè)表的操作詳解8. 使用SQL Server連接服務(wù)器訪問DB2 Server9. DB2編程序小小技巧10. IBM DB2 Connect簡介(1)
