DB2 V9.5工作負載管理之如何實現工作負載
IBM DB2 V9.5 中,新引入的工作負載管理功能( WLM )可以幫助您標識、管理和監視數據服務器的工作負載。本文將通過示例介紹如何實現 DB2 V9.5 的工作負載管理( WLM )相關的功能。
工作負載(WORKLOAD)
工作負載( WORKLOAD )通過工作所在的數據庫連接屬性來標識數據庫活動。工作負載( WORKLOAD )是用來分配工作給服務類( Service Class )的方法,是一個根據工作的來源( source )標識區分工作的對象,以方便隨后對工作進行相應的管理。來源( source )是由工作所在的數據庫連接的屬性決定的。
當服務器收到多個用戶請求,首先將對用戶請求進行評估標識(此時處于 WLM 第一階段 標識階段),當其數據庫連接屬性符合某個已經定義的工作負載,則將其分配給特定工作負載所在的服務類中執行。如果不能和已經定義的工作負載相匹配,則將用戶請求分配給缺省用戶工作負載所在的缺省用戶服務類中執行。
當服務器收到系統請求時,將其分配給默認系統服務類中執行。
當服務器收到維護請求時,將其分配給默認維護服務類中執行。
默認系統服務類名為: SYSDEFAULTSYSTEMCLASS,其下有一個默認的服務子類: SYSDEFAULTSUBCLASS。
默認維護服務類名為:SYSDEFAULTMAINTENANCECLASS,其下有一個默認的服務子類:SYSDEFAULTSUBCLASS。
默認用戶服務類名為:SYSDEFAULTUSERCLASS,其下有一個默認的服務子類:SYSDEFAULTSUBCLASS。
圖 3 . 服務類和工作負載
接下來我們繼續在剛才的 DB2CLP 窗口發出 ALTER WORKLOAD 命令,使工作負載 WL_RHETTE 和 WL_DB2ADMIN 失效。然后發出 DROP WORKLOAD 命令,刪除工作負載 WL_RHETTE 和 WL_DB2ADMIN。最后發出 CREATE WORKLOAD 命令,創建工作負載工 WL_RHETTE 和 WL_DB2ADMIN。工作負載 WL_RHETTE 對應的服務子類是 subclass_rhette,對應的服務父類是 super_class。工作負載 WL_DB2ADMIN 對應的服務子類是 subclass_db2admin,對應的服務父類是 super_class。需要注意的是,如果你想刪除一個工作負載,那么必須先讓該工作負載失效。具體如清單8所示:
清單8 . 創建工作負載 WL_RHETTE 和 WL_DB2ADMIN
C:> db2 -tvf wl_create.sql
alter workload wl_rhette disable
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_RHETTE " 是一個未定義的名稱。 SQLSTATE = 42704
alter workload wl_db2admin disable
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_DB2ADMIN " 是一個未定義的名稱。 SQLSTATE = 42704
drop workload wl_rhette
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_RHETTE " 是一個未定義的名稱。 SQLSTATE = 42704
drop workload wl_db2admin
DB21034E 該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器命令。在
SQL 處理期間,它返回:
SQL0204N " WL_DB2ADMIN " 是一個未定義的名稱。 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命令成功完成。
命令成功完成,工作負載是通過工作所在的數據庫連接屬性來標識數據庫活動,數據庫連接的屬性可以是:
APPLNAME ( ' application - name ' , . . . )
為APPLNAME連接屬性指定一個或多個應用程序名稱。在列表中同一個應用程序名稱不能出現多次,否則會報 SQLSTATE 42713 錯誤。應用程序名稱是大小寫敏感的,應用程序名稱就是我們執行 LIST APPLICATIONS 命令顯示的值。
SYSTEM_USER ( ' authorization – name ' , . . . )
為 SYSTEM USER 連接屬性指定一個或多個授權 ID。在列表中同一個授權 ID 不能出現多次,否則會報 SQLSTATE 42713 錯誤。
SESSION_USER ( ' authorization – name ' , . . . )
為 SESSION USER 連接屬性指定一個或多個授權 ID。需要注意的是,授權 ID 大小寫敏感。在列表中同一個授權 ID 不能出現多次,否則會報 SQLSTATE 42713 錯誤。
SESSION_USER GROUP ( ' authorization – name ' , . . . )
為 SESSION_USER GROUP 連接屬性指定一個或多個授權 ID。在列表中同一個授權 ID 不能出現多次,否則會報 SQLSTATE 42713 錯誤。
SESSION_USER ROLE ( ' authorization – name ' , . . . )
為 SESSION_USER ROLE 連接屬性指定一個或多個授權 ID。這里會話授權ID的角色是指會話授權 ID 所有可用的角色,不管這些角色是怎么獲得的。在列表中同一個授權 ID 不能出現多次,否則會報 SQLSTATE 42713 錯誤。
CURRENT CLIENT_USERID ( ' user – id ' , . . . )
為 CURRENT CLIENT_USERID 連接屬性指定一個或多個客戶端用戶 ID。在列表中同一個客戶端用戶 ID 不能出現多次,否則會報 SQLSTATE 42713 錯誤。
CURRENT CLIENT_APPLNAME ( ' client – application – name ' , . . . )
為 CURRENT CLIENT_APPLNAME 連接屬性指定一個或多個應用程序名稱。在列表中同一個應用程序名稱不能出現多次,否則會報 SQLSTATE 42713 錯誤。這個 client – application – name 是大小寫敏感的,其值就是系統監控器輸出中的 " TP Monitor client application name " 值。
CURRENT CLIENT_WRKSTNNAME ( ' workstation – name ' , . . . )
為 CURRENT CLIENT_WRKSTNNAME 連接屬性指定一個或多個客戶端工作站名稱。在列表中同一個客戶端工作站名稱不能出現多次,否則會報 SQLSTATE 42713 錯誤。
CURRENT CLIENT_ACCTNG ( ' accounting – string ' , . . . )
為 CURRENT CLIENT_ACCTNG 連接屬性指定一個或多個 accounting string。在列表中同一個客戶端 accounting string 不能出現多次,否則會報 SQLSTATE 42713 錯誤。
如果想查看已經定義的工作負載,可以通過查看系統視圖 SYSCAT.WORKLOADS 的方式查看,也可以通過使用 DB2PD 工具進行查看,需要使用 DB2PD 工具的 workloads 選項。繼續在當前 DB2CLP 窗口中,發出 DB2P 命令,部分輸出信息如清單 9 所示:
清單9 . 查看工作負載的定義情況
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
我們也可以通過控制中心查看系統視圖 SYSCAT.WORKLOADS,來看一下我們創建的工作負載情況,具體如圖4所示:
對特定的工作負載(和一個特定的連接相關聯)來說,其會話用戶必須具有該工作負載的 USAGE 特權,如果想查看工作負載相關的 USAGE 特權,可以訪問系統視圖 SYSCAT.WORKLOADAUTH。我們繼續在當前的 DB2CLP 窗口中,發出 GRANT 命令,把工作負載 WL_RHETTE 和 WL_DB2ADMIN 的 USAGE 特權賦給 PUBLIC 組,具體如清單 10 所示:
清單 10 . 把工作負載 USAGE 權限分配給 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命令成功完成。
下面我們來看一下數據庫連接、工作負載和服務類在具體的場景中是什么樣子。
首先,我們關閉當前的 DB2CLP 窗口,再打開三個新的 DB2CLP 窗口,這樣我們就有三個 DB2CLP 窗口,分別稱之為窗口1、窗口2、窗口3。在窗口1中,我們發出 DB2 CONNECT 命令,連上示例數據庫 DB2TEST1,用戶名為 admnistrator,具體如清單 11 所示:
清單11 . 在窗口 1 中使用 admnistrator 用戶連接數據庫
C:> db2 connect to db2test1 user administrator using passw0rd
數據庫連接信息
數據庫服務器 = DB2 / NT 9.5.0
SQL 授權標識 = ADMINIST . . .
本地數據庫別名 = DB2TEST1
命令成功完成,下面我們在窗口 2 中使用 RHETTE 用戶連接示例數據庫 DB2TEST1,并執行 SELECT 語句訪問示例表 PROJEC,做一個查詢量小的查詢(用 PROJECT 表外連接自己),具體如清單 12 所示:
清單 12 . 在窗口 2 中使用 RHETTE 用戶連接數據庫
C:> db2 connect to db2test1 user rhette using passw0rd
數據庫連接信息
數據庫服務器 = DB2 / NT 9.5.0
SQL 授權標識 = RHETTE
本地數據庫別名 = DB2TEST1
C:> db2 select count ( * ) from project , project , project
1
- - - - - - - - - - - - - - - - - - - - - - - - - -
8000
1 條記錄已選擇。
命令成功完成,下面我們在窗口 3 中用 DB2ADMIN 用戶連接示例數據庫 DB2TEST1,并執行 SELECT 語句訪問示例表 PROJEC,做一個查詢量小的查詢(用 PROJECT 表外連接自己),具體如清單 13 所示:
清單13 . 在窗口 2 中使用 DB2ADMIN 用戶連接數據庫
C:> db2 connect to db2test1 user db2admin using passw0rd
數據庫連接信息
數據庫服務器 = DB2 / NT 9.5.0
SQL 授權標識 = DB2ADMIN
本地數據庫別名 = DB2TEST1
C:> db2 select count ( * ) from rhette.project , rhette.project , rhette.project
1
- - - - - - - - - - - - - - - - - - - - - - - - - -
8000
1 條記錄已選擇。
命令執行成功,下面我們回到窗口 1,通過訪問表函數 wlm_get_service_class_workload_occurrences 來獲取當前發生的工作負載列表,在返回的結果集中,還將返回這些工作負載的一些相關信息,比如其所在的服務子類、服務父類等,具體如清單 14 所示:
清單14 . 在窗口 1 中查看當前發生的工作負載( 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條記錄已選擇。
命令成功完成,在返回結果中可以看到,當前存在 3 個工作負載。
窗口 1 中 ADMINISTRATOR 用戶所在的數據庫連接,對應的工作負載是系統默認用戶工作負載 SYSDEFAULTUSERWORKLOAD,默認用戶工作負載所對應的服務子類是默認用戶服務子類 SYSDEFAULTSUBCLASS,默認用戶工作負載所對應的服務子類是默認用戶服務父類 SYSDEFAULTUSERCLASS。
窗口 2 中 RHETTE 用戶所在的數據庫連接,對應的工作負載是我們開始的時候在清單 8 中定義的工作負載 WL_RHETTE,該工作負載所對應的服務子類是 SUBCLASS_RHETTE,該工作負載所對應的服務父類是 SUPER_CLASS。
窗口 3 中 DB2ADMIN 用戶所在的數據庫連接,對應的工作負載是我們開始的時候在清單 8 中定義的工作負載 WL_DB2ADMIN ,該工作負載所對應的服務子類是 SUBCLASS_DB2ADMIN,該工作負載所對應的服務父類是 SUPER_CLASS。
下面我看一下同樣的查詢在不同的工作負載下執行速度有什么樣的差別。大家還記得我們在清單 6 中定義的服務子類 SUBCLASS_RHETTE 和 SUBCLASS_DB2ADMIN,對其代理優先級(也就是使用 CPU 資源的優先級)做了不同的定義,服務子類 SUBCLASS_RHETTE 對應的代理優先級是 DEFAULT,服務子類 SUBCLASS_DB2ADMIN 的代理優先級是 6。
當服務子類的代理優先級設成 DEFAULT 時,服務子類繼承服務父類的進程優先級。也就是說服務子類 SUBCLASS_RHETTE 繼承服務父類 SUPER_CLASS 的代理優先級,而 SUPER_CLASS 的代理優先級也是 DEFAULT。當代理優先級設置為 DEFAULT 時,沒有特殊的操作發生,服務類中的代理將按照所有的 DB2 線程一樣的優先級進行調度。DEDAULT 對應的值是 -32768。
服務子類 SUBCLASS_DB2ADMIN 的代理優先級是 6,則意味這代理真正的優先級將是正常優先級加上 AGENT PRIORITY,并將在下次動作時生效。比如,如果正常的優先級是 20,并且我們把這個參數設置成 6,那么服務類中的代理的優先級是 20+6=26.
在 Windows 平臺,優先級為負值則意味著優先級低,所以服務子類 SUBCLASS_DB2ADMIN 的代理優先級比服務子類 SUBCLASS_RHETTE 高。
在窗口 1、2、3 中都斷開原有的數據庫連接。然后在窗口 2 中,使用 RHETTE 用戶連接示例數據庫 DB2TEST1,在窗口 3 中,使用 RHETTE 用戶連接示例數據庫 DB2TEST1,然后在兩個窗口中幾乎同時執行如下語句:
db2 select count ( * ) from rhette.project , rhette.project , rhette.project , rhette.project , rhette.project , rhette.project
可以發現窗口 2 和窗口 3 這條語句執行的時間也差不多。
但當我們在窗口 3 中用 DB2ADMIN 連接示例數據庫 DB2TEST1 時,還是執行剛才的 SELECT 語句,就會發現窗口 3 比窗口 2 快很多,這是因為 DB2ADMIN 用戶執行的語句所在的服務子類 SUBCLASS_DB2ADMIN 代理優先級高的原因。
如果想查看服務類或服務子類執行的次數,可以通過訪問表函數 WLM_GET_SERVICE_SUBCLASS_STATS 來查看,比如我們在窗口 1 中發出如下命令,具體如清單 15 所示:
清單15 . 在窗口 1 中查看服務類或服務子類執行的次數
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:>
命令執行成功,關于表函數 WLM_GET_SERVICE_SUBCLASS_STATS 更多的信息可以查看 DB2 V9.5 信息中心。另外,還可以通過訪問表函數 WLM_GET_WORKLOAD_STATS 來查看多少工作負載完成、失敗或者被拒絕,比如我們在窗口 1 中發出如清單 16 所示的語句:
清單 16 . 在窗口 1 中查看工作負載的執行情況
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 條記錄已選擇。
相關文章:
