WEB开发网
开发学院数据库DB2 DB2 基础:关于 DB2 UDB 监控的一些问题和解答 阅读

DB2 基础:关于 DB2 UDB 监控的一些问题和解答

 2010-07-20 00:00:00 来源:WEB开发网   
核心提示:在构建或管理应用程序时,取得良好的性能是一个重要的目标,DB2 基础:关于 DB2 UDB 监控的一些问题和解答,实际上,用户通常期望执行的操作瞬息便能完成,通过按时审查性能数据,您将对企业的工作负载产生更深的理解,虽然这一点可能不会包含在需求当中,为了管理所有方面

在构建或管理应用程序时,取得良好的性能是一个重要的目标。实际上,用户通常期望执行的操作瞬息便能完成,虽然这一点可能不会包含在需求当中。

为了管理所有方面,包括性能,首先必须能够对之进行测量。DB2 UDB on Linux、UNIX 和 Windows 包括了很多用来测量性能和跟踪系统活动的工具。这些工具允许根据数据库管理员(DBA)、应用程序开发人员和系统管理员所需的任何级别的粒度来测量活动。

监控的目标

监控的三个主要目标是问题确定、性能管理和趋势分析。问题确定的意思很明显:您或者某个人已经检测到一个问题,并力图解决这个问题。问题确定要求知道当前发生的事情,什么正在导致这一问题,或者是什么最近曾导致这一问题,知道这些是必需的。确定了问题原因,再加上一定的性能管理,同时又把握了趋势,那么便可以避免大多数问题。

性能管理使您可以最优地使用系统资源,并有助于确保避免某些问题。通过使用性能管理信息和技巧,可以尽量避免花在问题确定上的时间,并增加总体的用户满意程度。

趋势分析又将性能管理带到了一个新的层面,在这个级别上,将保存历史数据,并使用这些数据来判断资源使用上的增长情况和趋势。趋势可以帮助您识别总体性能活动的变化,并在必要时规划硬件的升级。而且,如果出现了意料之外的变化(不同于趋势所显示的),仍可以问这样的问题:“是什么发生了变化”?

DB2 的使用趋势通常与业务活动一致,但未必总是如此。业务单元常常知道它在哪些时期比较忙,但是可能并不理解这些时期对系统资源的影响。至于系统负载问题,可以将系统活动与昨天或上个星期、上个月或者去年同一时间的情况相比较,发现两个时期之间的变化,这样做很有用。理解了这些资源使用趋势,有利于调优决策,尤其是那些与数据库管理器和数据库配置参数有关的调优。

监视器的类型

为了帮助实现这些监控目标,DB2 提供了两种类型的监视器:快照监视器和事件监视器。快照监视器显示给定时间点上的活动。您可以将它看成是系统活动的一张图片。这样您便可以看到是什么应用程序正连接到数据库,还可以诊断锁问题,并允许查看缓冲池、表空间和表的使用情况,以及正在执行的语句。如果保存历史数据,并不时地比较快照,那么快照监视器会变得更加有用。

事件监视器与快照不同,它可以捕捉一段时间内您所感兴趣的特定范围内所发生的所有事情。事件监视器不只是拍一张快照,可以将它看作是一部电影,这部电影可以捕捉随时间流逝而发生的事情。在很多事件的开始和结束,DB2 都会产生事件记录。虽然当一个问题发生时,快照是最为有用的,但是,对于跟踪系统历史使用情况,例如系统 chargeback、资源规划和趋势分析,事件是最精确的。

在 DB2 Version 8 中,由于可以直接将事件监视器写入 DB2 表中,并且可以使用快照表功能将快照存储到 DB2 表中,因此保存历史信息变得更加容易。

快照监视器

要使用快照监视器,首先必须使用以下命令将监视器开关打开:

db2 update monitor switches using bufferpool on lock on sort on statement on table on uow on

也可以在数据库管理器配置中控制监视器开关,不过,对于表监视器开关存在一个例外,因为您必须总是使用上述命令来启动它。

要检查监视器开关的状态,可以使用 Get Monitor Switches 命令:

取决于 DB2 的版本,输出会稍有不同
DB2 基础:关于 DB2 UDB 监控的一些问题和解答

查看原图(大图)

下面的表展示了用来打开一个快照监视器的命令,以及所收集的信息的类型:

监视器开关 收集的信息 打开监视器的命令
Buffer Pool 缓冲池使用情况统计信息 db2 update monitor switches using BUFFERPOOL on
Lock Info 已经出现的锁和死锁的数量 db2 update monitor switches using LOCK on
Sort Info 排序溢出,排序的数量 db2 update monitor switches using SORT on
Statement 查看 DB2 服务器上当前在运行的 SQL 语句(这对于发现长时间运行的语句很有用) db2 update monitor switches using STATEMENT on
Table Activity 读和写使用情况统计信息 db2 update monitor switches using TABLE on
Timestamp Info 时间戳信息(很多快照功能都需要该信息) db2 update monitor switches using TIMESTAMP on
Unit of Work 在开始和停止时所包括的工作单元的统计信息及状态 db2 update monitor switches using UOW on

注解: 通常,打开快照开关所导致的开销非常小,因为在内部,大部分数据已经在 DB2 中。但通常,您只需打开语句开关和锁开关。因为工作负载的缘故,如果将所有开关打开,则可能招致 2% 到 5% 的额外开销。

一旦打开了开关,便可以查看已经提供的数据。要查看一个快照,可以使用 GET SNAPSHOT 命令。图 3 展示了可以用来查看 DB2 内部状态的命令:

快照 命令
Buffer Pool db2 get snapshot for bufferpools on database_name
Locks db2 get snapshot for locks on database_name
Dynamic SQL db2 get snapshot for dynamic sql on database_name
Table Activity db2 get snapshot for tables on database_name
Applications db2 get snapshot for applications on database_name
Tablespace db2 get snapshot for tablespaces on database_name
Database db2 get snapshot for database on database_name
Database Manager db2 get snapshot for DBM

从命令行看来,显然有很多的输出。这也显示了将输入写入 DB2 表中的好处。当构建好监视器并开始收集数据时,通过一些计算就可以将这些数据归纳成有用的信息。

编写自己的快照监视器

虽然可以很轻松地获得快照,不过最好还是再深入一点,使用 DB2 中新的表函数。这样,您不仅可以进行问题确定,还可以进行性能管理和趋势分析。

表函数允许通过 select 语句显示性能数据。如果将 insert 语句与子查询一起使用,那么返回的数据便可以存储到 DB2 表中。

创建快照监视器的三个步骤是:

创建快照表。

用一个脚本填充快照表。

从数据生成报告。

一共有 20 种快照功能,但最重要的 4 个功能是数据库、缓冲池、表空间和表。下面的例子对缓冲池进行快照。

建立快照表

要创建快照表,可以从 SYSCAT. FUNCPARMS 系统表获得列定义。该表将使用 insert 语句填充数据。

-- UPQ020 Create a table to store buffer pool snapshots 
-- The snapshot is stored into this table using UPS021 
-- 
-- UPQ022 and following will contain SQL to report from 
-- these tables. 
-- 
CREATE TABLE BP_SNAP ( 
SNAPSHOT_TIMESTAMP   TIMESTAMP, 
POOL_DATA_L_READS    BIGINT, 
POOL_DATA_P_READS    BIGINT, 
POOL_DATA_WRITES     BIGINT, 
POOL_INDEX_L_READS    BIGINT, 
POOL_INDEX_P_READS    BIGINT, 
POOL_INDEX_WRITES    BIGINT, 
POOL_READ_TIME      BIGINT, 
POOL_WRITE_TIME     BIGINT, 
POOL_ASYNC_DATA_RD    BIGINT, 
POOL_ASYNC_DT_WRT    BIGINT, 
POOL_ASYNC_IX_WRT    BIGINT, 
POOL_ASYNC_READ_TM    BIGINT, 
POOL_ASYNC_WR_TIME    BIGINT, 
POOL_ASYNC_DT_RDRQ    BIGINT, 
DIRECT_READS       BIGINT, 
DIRECT_WRITES      BIGINT, 
DIRECT_READ_REQS     BIGINT, 
DIRECT_WRITE_REQS    BIGINT, 
DIRECT_READ_TIME     BIGINT, 
DIRECT_WRITE_TIME    BIGINT, 
POOL_ASYNC_IX_RDS    BIGINT, 
POOL_DATA_TESTORE    BIGINT, 
POOL_INDEX_TESTORE    BIGINT, 
POOL_INDEX_FESTORE    BIGINT, 
POOL_DATA_FESTORE    BIGINT, 
UNREAD_PREF_PGS     BIGINT, 
FILES_CLOSED       BIGINT, 
BP_NAME         CHAR(18), 
DB_NAME         CHAR(8), 
DB_PATH         VARCHAR(255), 
INPUT_DB_ALIAS      CHAR(8) ) 
In userspace1; 

www.db-hq.net上公开提供了该 DDL。以下是用于条目 UPS025 的 URL,它将定义所有 4 个表:

http://www.db-hq.net/Articles/db2luw/perfluw/LUWv8SNP/UPS025.sql

将该文本复制并粘贴到一个文件中,然后将其保存在您的计算机上。您可以使用以下命令创建这些表:

db2 -tvf UPS025.sql 

填充快照表

要将单个的快照表存储到 BP_SNAP 表中,可以使用以下 SQL:

-- UPQ021 Store a snapshot into a table. 
-- The table is created using UPQ020 
-- In the near future, this query will be incorporated into a shell script. 
-- 
-- UPQ022 and following will contain SQL to report from 
-- these tables. 
-- 
INSERT INTO BP_SNAP 
SELECT 
 SNAPSHOT_TIMESTAMP, 
 POOL_DATA_L_READS, 
 POOL_DATA_P_READS, 
 POOL_DATA_WRITES, 
 POOL_INDEX_L_READS, 
 POOL_INDEX_P_READS, 
 POOL_INDEX_WRITES, 
 POOL_READ_TIME, 
 POOL_WRITE_TIME, 
 POOL_ASYNC_DATA_READS, 
 POOL_ASYNC_DATA_WRITES, 
 POOL_ASYNC_INDEX_WRITES, 
 POOL_ASYNC_READ_TIME, 
 POOL_ASYNC_WRITE_TIME, 
 POOL_ASYNC_DATA_READ_REQS, 
 DIRECT_READS, 
 DIRECT_WRITES, 
 DIRECT_READ_REQS, 
 DIRECT_WRITE_REQS, 
 DIRECT_READ_TIME, 
 DIRECT_WRITE_TIME, 
 POOL_ASYNC_INDEX_READS, 
 POOL_DATA_TO_ESTORE, 
 POOL_INDEX_TO_ESTORE, 
 POOL_INDEX_FROM_ESTORE, 
 POOL_DATA_FROM_ESTORE, 
 UNREAD_PREFETCH_PAGES, 
 FILES_CLOSED, 
 BP_NAME, 
 DB_NAME, 
 DB_PATH, 
 INPUT_DB_ALIAS 
FROM TABLE( SNAPSHOT_BP( 'perfdb', -1 )) as SNAPSHOT_BP; 

这样就有了一行数据。为了使之更加有用,可以下载下面的 shell 脚本,并用该脚本填充 4 个快照表:

http://www.db-hq.net/Articles/db2luw/perfluw/LUWv8SNP/UPS024.sql

解释快照输出

快照的很多方面都是毋需解释的,而其他一些方面则需要进行某种计算。

用于获得快照数据的最简单的查询是:

-- UPQ022 Our first sample query for snapshot data. 
-- 
-- The table is created using UPQ020, and populated using UPQ021 
-- In the near future, UPQ021 will be incorporated into a shell script. 
-- 
SELECT SNAPSHOT_TIMESTAMP AS TSTAMP, POOL_DATA_L_READS AS DATA_LREADS, 
 POOL_DATA_P_READS AS DATA_PREADS, POOL_DATA_WRITES AS DATA_WRITES, 
 POOL_INDEX_L_READS AS IX_LREADS, BP_SNAP.POOL_INDEX_P_READS AS IX_PREADS  
FROM BP_SNAP; 

注意:缓冲池调优是提高 DB2 性能的最佳机会。对于缓冲池调优的完全讨论超出了本文的范围,但是对这个重要的方面进行调查研究是值得的。下面的 Microsoft Excel 工作簿(workbook)链接可以作为进行这方面研究的一个良好开端。也可以在网络上寻找关于该话题的其他文章。

为了使结果在命令行中有更好的可读性,有些列没有选。当然,也可以在 SELECT 语句的 WHERE 子句中添加条件,只报告异常。

很多条件同时适用于缓冲池和表空间。缓冲池是内存中的区域。对缓冲池的测量将体现整体性能。表空间是文件,对表空间的测量将体现个体的性能。

快照类型 条件 注释
寻找被频繁读写的行这些是最繁忙的表。审查索引,以确保最快的访问
缓冲池频繁读取物理页如果内存允许,应增加缓冲池。使用内存来避免物理 I/O
缓冲池/表空间被关闭的数据库文件应该为 0如果这个数字不为 0,则应加大 MAXFILOP 参数的值
缓冲池/表空间命中率应该高特别是索引应该有较高的命中率,以确保良好的性能
缓冲池/表空间异步读应该少异步读需要预取,这意味着将要执行很多的 I/O。应创建更多或更好的索引
缓冲池/表空间同步写应该少与异步读相比,异步写比较好,因为异步写意味着事务不必为写而等待
数据库排序溢出应该少排序溢出意味着要对磁盘上的临时文件进行很多的读和写。或许应该增加 SORTHEAP / SHEAPTHRES
数据库确保足够的 DBHEAP运行时 DBHEAP 的值不能过低。使用数据库快照中的 DB_HEAP_TOP 列来查看 DBHEAP 使用的高水位标记
数据库包缓存命中率应该高(>95%)检查包缓存的查找与插入,以避免从磁盘到缓存的装载时间
数据库编目缓存的命中率应该高(>95%)检查编目缓存的查找与插入,以避免从磁盘到缓存的装载时间
数据库对于锁要考虑很多方面。超时、死锁和逐步升级都表明存在延迟和问题

缓冲池计算

DB2 System Monitor Guide and Reference 包含了一系列的公式,您可以使用这些公式来判断缓冲池的效率。我自动化了这些公式,并将它们放在一个 Excel 工作簿中。

该 Excel 工作簿包含三个电子表格(spreadsheet)。第一个电子表格是对缓冲池性能比率的计算。第二个电子表格是通过 Open Database Connectivity (ODBC) 将 DB2 数据放入 Excel 的一个示例。第三个电子表格是使用 Excel 图表功能制图的一个示例。下面是该工作簿的链接:

http://db-hq.net/downloads/BP%20Analysis.xls

事件监视器

您可以使用事件监视器来全面了解活动。事件监视器可以显示从开始到结束的活动,常常由一个开始事件记录和一个结束事件记录组成。事件监视器最常用于连接、锁和语句。

事件监视器的输出可以写入到文件中、命名管道中,或者在 DB2 Version 8 启动时写入到 DB2 表中。该输出可以是成块的,也可以不是成块的。如果输出是成块的,则可以确保不丢失数据,但是在产生大量记录的繁忙的系统上,这可能会导致较大的问题。通常应该避免成块的输出,对于语句事件监视器更是如此,因为数据库实例可能会崩溃。您可以将事件监视器的粒度限制到一个用户或应用程序。

如果要编写自己的程序来获取监视器数据,那么命名管道(Named pipe)很有用。如果系统繁忙,则使用命名管道可以避免对 DB2 产生性能影响。

连接事件对于跟踪一个用户或应用程序对系统的使用很有用。该数据使您可以识别性能较差的程序、负载较重的用户以及使用趋势。如果每天审查该数据,那么就有机会与用户讨论数据库操作的相关问题,还可以为用户提供 SQL 方面的培训或调整物理设计,以便更好地支持用户对 DB2 的使用。

一次可以定义和激活多个事件监视器。为了不导致问题,连接事件的数量通常会被设定到一个相当低的水平。下面的 SQL 语句为所有连接定义了一个事件监视器:

CREATE EVENT MONITOR dlmon FOR CONNECTIONS WRITE TO TABLE; 

建立了事件监视器之后,需要使用以下语句打开事件监视器:

SET EVENT MONITOR dlmon STATE=1; 

也可以将事件监视器设置成在数据库启动时自动启动。上述语句的执行会创建以下 4 个表:

connheader_dlmon

conn_dlmon

connmemuse_dlmon

control_dlmon

注意:缓冲池调优是提高 DB2 性能的最佳机会。对于缓冲池调优的全面讨论超出了本文的范围,但是,对这个重要的方面进行调查研究是值得的。可以将下面的 Microsoft Excel 工作簿(workbook)链接可以作为一个良好的开端。也可以在网络上寻找关于该话题的其他文章。在 developerWorks 上有一些很好的示例:
DB2 基础:表空间和缓冲池
调优 DB2 UDB v8.1 及其数据库的最佳实践

结束语

对于理解企业如何使用 DB2,监控非常关键。通过按时审查性能数据,您将对企业的工作负载产生更深的理解,并且能够在问题发生之前采取适当行动。

Tags:DB 基础 关于

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接