通过工作单元事件监视器来计算不同应用程序或工作负载所使用的 CPU 时间

此主题显示在日常数据库操作中使用工作单元事件监视器的一种方法。 在某些业务环境中,将对部门的应用程序所使用的处理时间进行计费。您可使用工作单元事件来记录不同应用程序、工作负载或服务类所使用的 CPU 时间。此信息转而可用于为系统资源执行计费的记账应用程序。

开始之前

CREATE EVENT MONITOR 语句需要页大小至少为 8K 的表空间来存储事件监视器生成的未格式化事件 (UE) 表。除非在 CREATE EVENT MONITOR 语句中显式命名了表空间,否则使用数据库的缺省表空间。

关于此任务

此任务描述“拒付”记账的一个基本场景。 在随后的示例中,将跟踪在系统上执行的所有工作。 通过收集的数据,将创建一些显示不同应用程序使用的 CPU 时间的报告。
根据您的组织的建立方式,根据工作负载跟踪系统事件可能是恰当的。 或者,您也可以按特定工作负载,甚至按不同用户查看不同服务超级类中使用的 CPU 时间。如果数据写入到关系表(如本任务中的示例所示),那么您可使用 SQL 以几乎无限制的方法来查询和显示数据。
注: 工作单元中的活动可运行在不同服务子类中。因此,按服务子类聚集工作单元信息是不恰当的。如果要按服务类聚集 CPU 时间,请改用活动事件监视器。

过程

  1. 创建一个工作单元事件监视器以在工作单元完成时捕获其有关信息。
    例如,要创建一个名为 TRACKWORK 的事件监视器,您可使用以下 SQL:
    CREATE EVENT MONITOR TRACKWORK FOR UNIT OF WORK WRITE TO UNFORMATTED EVENT TABLE
    此语句创建一个写入到无格式事件 (UE) 表的工作单元事件监视器。UE 表与事件监视器自身 TRACKWORK 具有相同名称,并且 UE 表存储在缺省表空间中。
  2. 通过运行以下命令告知数据库管理器您要收集数据库上完成的所有工作单元的事件信息:
    UPDATE DATABASE CONFIGURATION FOR dbname USING MON_UOW_DATA BASE
    此命令将导致在工作单元完成时,有关在数据服务器上执行的所有工作单元的信息发送到活动的工作单元事件监视器。有关控制收集的工作单元数据范围的更多信息,请参阅配置数据收集
  3. 接着,激活事件监视器:
    SET EVENT MONITOR TRACKWORK STATE 1
    注: 缺省情况下,事件监视器在数据库激活时自动启动,因为缺省情况下应用 AUTOSTART 选项。但是,由于此事件监视器是在已经活动的数据库中创建的,因此您必须使用 SET EVENT MONITOR 命令手动启动此事件监视器。
    从此时起,工作单元事件监视器将在每个工作单元运行完成时捕获其信息。当每个工作单元完成时,事件监视器会将事件的记录添加到 UE 表 TRACKWORK。
  4. 当您准备好收集用于报告的数据,必须从 UE 表 TRACKWORK 中提取记录。

    您可使用 EVMON_FORMAT_UE_TO_XML 或 EVMON_FORMAT_UE_TO_TABLES 过程来转换 UE 表中的数据,从而以 XML 格式或关系格式来查看此信息。或者,也可使用 db2evmonfmt 工具创建事件监视器返回的信息的文本报告。 此示例显示使用 EVMON_FORMAT_UE_TO_TABLES 创建关系表,您可以通过适合您的需求的任何方式来查询这些关系表。

    CALL EVMON_FORMAT_UE_TO_TABLES 
       ('UOW', NULL, NULL, NULL, NULL, NULL, NULL, -1, 'SELECT * FROM TRACKWORK')
    EVMON_FORMAT_UE_TO_TABLES 过程检查由事件监视器生成的 UE 表 TRACKWORK;此过程从 UE 表中选择每个记录,然后从这些记录中,在两个关系表中创建包含工作单元事件监视器收集的数据的行:
    • UOW_EVENT
    • UOW_METRICS
    第一个表包含最常用的监视元素以及与捕获的每个事件相关联的指标。第二个表包含每个事件的详细度量值。
    备注:
    • 如果您在步骤 2 中为 MON_UOW_DATA 配置参数指定 PKGLIST 而非 BASE,那么 EVMON_FORMAT_UE_TO_TABLES 过程将创建第三个名为 UOW_PACKAGE_LIST 的表。此表包含与工作单元相关的程序包列表信息。但是,在此示例中,由于仅收集基本监视元素(请参阅步骤 2),因而此表不包含任何数据。(有关如何使用程序包列表的更多信息,请参阅Unit of work event monitor package listing information。)
    • UOW_METRICS 列中的值还可在 UOW_METRICS 表的 METRICS 列中包含的 XML 文档中找到。为了更加方便以及面向列的访问,这些值在 UOW_METRICS 表中提供。
  5. 对先前步骤中生成的表进行查询以查看应用程序使用 CPU 时间的方式。 随后的语句将返回在工作单元事件监视器初始化后,由系统上不同用户使用的 CPU 时间总计的统计分析。(此示例假定客户机应用程序已经使用 sqleseti API 或通过您正在使用的任何应用程序开发环境(如 IBM® Rational® Application Developer for WebSphere® Software)将其自身与数据库对应。
    SELECT SUBSTR(E.CLIENT_USERID,1,10) AS CLIENT_ID,
           SUBSTR(E.CLIENT_APPLNAME,1,80) AS CLIENT_APP, 
           SUBSTR(E.CLIENT_WRKSTNNAME,1,10) AS WKSTN,
           SUM(M.TOTAL_CPU_TIME) AS CPU_TIME  
           FROM UOW_EVENT E, UOW_METRICS M 
    WHERE  M.APPLICATION_ID = E.APPLICATION_ID
       AND M.UOW_ID = E.UOW_ID 
       AND M.MEMBER = E.MEMBER 
    GROUP BY E.CLIENT_USERID, E.CLIENT_APPLNAME, E.CLIENT_WRKSTNNAME
    ORDER BY CPU_TIME DESC;
    上述查询将返回下列结果:
    CLIENT_ID  CLIENT_APP                                                                       WKSTN      CPU_TIME            
    ---------- -------------------------------------------------------------------------------- ---------- --------------------
                                                                                                                      987770013
               DB2BATCH                                                                                               249375000
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003021324173                        91181678
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1004201047173                        66097348
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191536588                        28824420
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191536434                        27555568
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221122075                        16203116
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221118191                        15759227
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221531062                        15630121
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221117466                        15236718
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221116141                        14607249
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003251550366                        14427883
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051054311                         1312500
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051053301                         1296875
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051139066                         1296875
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003051152281                         1281250
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003041230283                         1046875
                                                                                                asrisk2                 1031250
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003291503479                          515625
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003251506219                          484375
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221444488                          453125
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003021323249                          406250
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003251544498                          296875
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003171431559                          171875
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003041227488                          156250
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003221117188                          109375
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003021333329                           62500
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191502148                           62500
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191527385                           62500
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191528492                           62500
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191530518                           62500
               CLP C:\DOCUME~1\ALLUSE~1\APPLIC~1\IBM\DB2\DB2COPY1\DB2\TMP\CCSCRIPT1003191533265                           62500
               CLP C:\Documents and Settings\All Users\Application Data\IBM\DB2\DB2COPY1\DB2DAS                           62500
  6. 此时,工作单元事件监视器 TRACKWORK 仍在收集信息。 根据您要如何跟踪不同应用程序、用户或工作负载使用的 CPU 时间,可选择采取下列一项操作:
    • 如果您要每天计算 CPU 使用情况,那么可保留此工作单元事件监视器处于活动状态。每天运行 EVMON_FORMAT_UE_TO_TABLES 过程以仅检索前一天的耗用时间指标:
      CALL EVMON_FORMAT_UE_TO_TABLES 
           ('UOW', NULL, NULL, NULL, NULL, NULL, NULL, -1, 
            'SELECT * FROM TRACKWORK 
            WHERE (DATE(EVENT_TIMESTAMP)=(CURRENT DATE - 1 DAY))'
           )
      通过此方法,EVMON_FORMAT_UE_TO_TABLES 过程生成的三个关系表继续增长,从而不断提供 CPU 使用情况历史记录。步骤 5 中的查询返回自使用 EVMON_FORMAT_UE_TO_TABLES 过程首次创建表后,累计的 CPU 时间总计。您可修改该查询以仅显示前一天的结果,如下所示:
      SELECT SUBSTR(E.CLIENT_USERID,1,10) AS CLIENT_ID,
             SUBSTR(E.CLIENT_APPLNAME,1,80) AS CLIENT_APP, 
             SUBSTR(E.CLIENT_WRKSTNNAME,1,10) AS WKSTN,
             SUM(M.TOTAL_CPU_TIME) AS CPU_TIME  
             FROM UOW_EVENT E, UOW_METRICS M 
      WHERE  M.APPLICATION_ID = E.APPLICATION_ID
         AND M.UOW_ID = E.UOW_ID 
         AND M.MEMBER = E.MEMBER 
         AND(DATE(E.EVENT_TIMESTAMP)=(CURRENT DATE - 1 DAY))
      GROUP BY E.CLIENT_USERID, E.CLIENT_APPLNAME, E.CLIENT_WRKSTNNAME
      ORDER BY CPU_TIME DESC;
      
      
      提示: 如果您要每天跟踪 CPU 使用情况,但还要管理在系统上收集的数据量,那么在更新关系表后,从 UE 表中移除不再需要的数据。例如,要从 UE 表 TRACKWORK 中删除前一天收集的数据,请使用类似以下的 DELETE 语句:
      DELETE FROM TRACKWORK WHERE (DATE(EVENT_TIMESTAMP)=(CURRENT DATE - 1 DAY))
      当事件监视器处于活动状态时,其将挂起针对任何表(即事件监视器将信息写入到任何表)的意向互斥 (IX) 表锁定,从而避免在事件监视器仍在使用这些表的情况下删除这些表。当正在删除更大数量的行时,DELETE 语句将获取更大数量的行锁定。在此情况下,可能发生锁定升级,因为行锁定可能转换为表锁定。由于事件监视器已具有针对表的锁定,因此对表锁定的这一请求可导致 DELETE 语句挂起。
      要避免这种情况,在发出 DELETE 语句前请首先考虑设置锁定超时:
      SET CURRENT LOCK TIMEOUT 60
      如果增加锁定超时时间段没有解决该问题,请尝试删除更小的数据子集,如更小时间段的记录(例如,6 或 12 个小时)。此方法要求更少的锁定,这将减少发生锁定升级的可能性。

      您还可根据平衡存储需求以及查看历史数据的需要来删减 EVMON_FORMAT_UE_TO_TABLES 生成的关系表。

    • 如果您完成了 CPU 时间计算,可通过执行以下步骤来停止事件监视器信息的收集并删除事件监视器及其相关表:
      1. 使用 SET EVENT MONITOR TRACKWORK STATE 0 命令为此事件监视器信息禁用工作单元的收集。
      2. 使用 DROP EVENT MONITOR 语句删除事件监视器自身。
      3. 使用 DROP TABLE 语句删除与事件监视器相关的表。在此情况下,总共有四个要删除的表:
        • TRACKWORK,用于从事件监视器收集信息的 UE 表
        • UOW_EVENT
        • UOW_METRICS
        • UOW_PACKAGE_LIST
      4. 可选:如果没有其余的活动事件监视器,那么您可能要使用以下命令更新数据库配置从而不收集任何工作单元事件信息:
        UPDATE DATABASE CONFIGURATION FOR dbname USING MON_UOW_DATA NONE

变体:收集特定工作负载的指标

前一个示例向您演示了如何捕获在系统上执行的所有工作的工作单元指标。使用 UPDATE DATABASE CONFIGURATION 命令设置收集的数据的范围可能导致收集的信息超过您的预期。例如,您希望仅跟踪由特定工作负载完成的工作。在这种情况下,不必启用对整个数据库上工作单元信息的收集(如步骤 2 中所示),而是可使用 CREATE 或 ALTER WORKLOAD 语句指定 COLLECT UNIT OF WORK DATA 子句。此子句使得事件监视器仅收集指定工作负载的数据。例如,要收集名为 PAYROLL 的工作负载的工作单元数据,请使用以下语句:
ALTER WORKLOAD PAYROLL COLLNECT UNIT OF WORK DATA BASE
您可通过对每个工作负载运行 ALTER WORKLOAD 语句而收集多个工作负载的数据。

其余步骤是相同的,但步骤 5 除外,您需要在该步骤中将查询更改为类似如下内容:

SELECT E.WORKLOAD_NAME, 
       SUM(M.TOTAL_CPU_TIME) AS CPU_TIME 
       FROM UOW_EVENT E, UOW_METRICS M 
WHERE  M.APPLICATION_ID = E.APPLICATION_ID 
   AND M.UOW_ID = E.UOW_ID 
   AND M.MEMBER = E.MEMBER 
GROUP  BY E.WORKLOAD_NAME
ORDER  BY CPU_TIME DESC
前置语句报告为其启用了指标收集的每个工作负载 CPU 时间:
WORKLOAD                       CPU_TIME
------------------------------ --------------------
PAYROLL                                  2143292042
MARKETING                                 492784916

  2 record(s) selected.