DB2 基础:关于 DB2 UDB 监控的一些问题和解答
2010-07-20 00:00:00 来源:WEB开发网在构建或管理应用程序时,取得良好的性能是一个重要的目标。实际上,用户通常期望执行的操作瞬息便能完成,虽然这一点可能不会包含在需求当中。
为了管理所有方面,包括性能,首先必须能够对之进行测量。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 的版本,输出会稍有不同
查看原图(大图)
下面的表展示了用来打开一个快照监视器的命令,以及所收集的信息的类型:
监视器开关 | 收集的信息 | 打开监视器的命令 |
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,监控非常关键。通过按时审查性能数据,您将对企业的工作负载产生更深的理解,并且能够在问题发生之前采取适当行动。
更多精彩
赞助商链接