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~1\IBM\SQLLIB~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 所示: