在构建或管理应用程序时,取得良好的性能是一个重要的目标。实际上,用户通常期望执行的操作瞬息便能完成,虽然这一点可能不会包含在需求当中。
为了管理所有方面,包括性能,首先必须能够对之进行测量。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
填充快照表
要将