OLTP应用程序的DB2调优技巧
2009-12-12 14:59:20 来源:WEB开发网研究步骤
OLTP 应用程序不应该执行大型排序。大型排序在 CPU 和 I/O 资源方面的成本太高了。通常,SORTHEAP 大小的缺省值(256 个 4KB 页)就足够了。事实上,对于高并发性 OLTP,您可能希望降低这个缺省值。当需要进一步研究时,可以发出下面这条命令:
db2 -v update monitor switches using sort on
然后,让您的应用程序运行一会,然后输入:
db2 -v get snapshot for database on DBNAME
看一下下面这个示例中的输出:
Total sort heap allocated = 0
Total sorts = 1
Total sort time (ms) = 0
Sort overflows = 0
Active sorts = 0
Commit statements attempted = 1
Rollback statements attempted = 0
Dynamic statements attempted = 4
Static statements attempted = 1
Binds/precompiles attempted = 0
根据该输出,可以计算每个事务的排序数目,并可以计算溢出了可用于排序的内存的那部分排序的百分比。 SortsPerTransaction
= (Total Sorts) / (Commit statements attempted + Rollback statements attempted)
PercentSortOverflow
= (Sort overflows * 100 ) / (Total sorts)
经验:如果 SortsPerTransaction 大于 5,它可能表明每个事务的排序太多。如果 PercentSortOverflow 大于 3%,那么可能发生了严重的、未曾预料到的大型排序。发生这种情况时,增加 SORTHEAP 只会隐藏性能问题 - 却无法修正它。这个问题的正确解决方案是通过添加正确的索引改进有问题的 SQL 语句的存取方案。
代理程序的数目(MAXAGENTS、NUM_POOLAGENTS 和 NUM_INITAGENTS)
背景知识
这些是数据库管理器配置参数。
MAXAGENTS 参数表明在任何给定时间接受应用程序请求的数据库管理器代理程序的最大数目。MAXAGENTS 的值应当至少是每个被并发地访问的数据库中的 MAXAPPLS(并发应用程序最大数目)值的总和。如果数据库的数量大于 NUMDB 参数,那么最安全的方案就是使用 NUMDB 和 MAXAPPLS 最大值的乘积。每个额外的代理程序都需要一些资源开销,这些开销在启动数据库管理器时会分配给代理程序。
NUM_POOLAGENTS 参数是用于评定您希望代理程序池增加到多大的准则。如果所创建的代理程序多于该参数值所指明的数目,那么当代理程序执行完自己当前的请求后将终止运行而不是返回给代理程序池。如果该参数的值为 0,将按照需要创建代理程序,在代理程序执行完自己当前的请求后终止运行。
要避免因在并发连接许多应用程序的 OLTP 环境中频繁创建和终止代理程序而产生的成本,请将 NUM_POOLAGENTS 的值增加到接近 MAXAGENTS 值。
NUM_INITAGENTS 参数决定空闲代理程序的初始数量,这些代理程序是在 DB2START 时在代理程序池中创建的。指定初始代理程序数目要合适(尽管并非必要条件),这可以缩短“热身”时间。
建议
在大多数情况下,将 MAXAGENTS 和 NUM_POOLAGENTS 的值设置成略微大于并发应用程序连接的最大预计数目。
让 NUM_INITAGENTS 保留为缺省值会比较好。
如何更改该参数
为了更改这些参数,请运行以下命令: db2 -v update dbm cfg using MAXAGENTS a_value
db2 -v update dbm cfg using NUM_POOLAGENTS b_value
db2 -v update dbm cfg using NUM_INITAGENTS c_value
db2 -v terminate
研究步骤
在运行期间的任何时候,您都可以使用下面这个命令来获取数据库管理器的快照数据: db2 -v get snapshot for database manager
看一下下列输出行: High water mark for agents registered = 4
High water mark for agents waiting for a token = 0
Agents registered = 4
Agents waiting for a token = 0
Idle agents = 0
Agents assigned from pool = 5
Agents created from empty pool = 4
Agents stolen from another application = 0
High water mark for coordinating agents = 4
Max agents overflow = 0
如果您发现“Agents waiting for a token”或“Agents stolen from another application”不等于 0,则可能需要增加 MAXAGENTS 以允许数据库管理器可以使用更多的代理程序。
锁(LOCKLIST、MAXLOCKS 和 LOCKTIMEOUT)
背景知识
这些与锁相关的控制都是数据库配置参数:
LOCKLIST 表明分配给锁列表的存储容量。每个数据库都有一个锁列表,锁列表包含了并发连接到该数据库的所有应用程序所持有的锁。锁定是数据库管理器用来控制多个应用程序并发访问数据库中数据的机制。行和表都可以被锁定。根据对象是否还持有其它锁,每把锁需要 32 个或 64 个字节的锁列表:
需要 64 个字节来持有某个对象上的锁,在这个对象上,没有持有其它锁。
需要 32 个字节来记录某个对象上的锁,在这个对象上,已经持有一个锁。
MAXLOCKS 定义了应用程序持有的锁列表的百分比,在数据库管理器执行锁升级之前必须填充该锁列表。当一个应用程序所使用的锁列表百分比达到 MAXLOCKS 时,数据库管理器会升级这些锁,这意味着用表锁代替行锁,从而减少列表中锁的数量。当任何一个应用程序所持有的锁数量达到整个锁列表大小的这个百分比时,对该应用程序所持有的锁进行锁升级。如果锁列表用完了空间,那么也会发生锁升级。数据库管理器通过查看应用程序的锁列表并查找行锁最多的表,来决定对哪些锁进行升级。如果用一个表锁替换这些行锁,将不再会超出 MAXLOCKS 值,那么锁升级就会停止。否则,锁升级就会一直进行,直到所持有的锁列表百分比低于 MAXLOCKS。MAXLOCKS 参数乘以 MAXAPPLS 参数不能小于 100。
虽然升级过程本身并不用花很多时间,但是锁定整个表(相对于锁定个别行)降低了并发性,而且数据库的整体性能可能会由于对受锁升级影响的表的后续访问而降低。
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››db2 命令选项解释
- ››应用程序的配置管理Poco
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 基础: 表空间和缓冲池
- ››DB2 XML 编程,第 1 部分: 理解 XML 数据模型
更多精彩
赞助商链接