[转帖]OLTP 应用程序的DB2 调优技巧(3)_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4052 | 回复: 0   主题: [转帖]OLTP 应用程序的DB2 调优技巧(3)        下一篇 
eink
注册用户
等级:上尉
经验:764
发帖:54
精华:0
注册:2012-11-13
状态:离线
发送短消息息给eink 加好友    发送短消息息给eink 发消息
发表于: IP:您无权察看 2012-11-16 16:47:30 | [全部帖] [楼主帖] 楼主

研究步骤

要确定数据库的缓冲池大小是否由 BUFFPAGE 参数所决定,请运行: 

db2 -v connect to DB_NAME
db2 -v SELECT * from SYSCAT.BUFFERPOOLS
db2 -v connect reset
db2 -v terminate


检查结果。如果每个缓冲池都有一个为-1的 NPAGES 值,那么缓冲池大小是由数据库配置中的 BUFFPAGE 参数控制的。

要确定缓冲池大小是否足够大,请在运行应用程序时收集数据库和/或缓冲池的快照。类似于下面的脚本为您提供这些所需的信息: 

db2 -v update monitor switches using bufferpool on
db2 -v get monitor switches
db2 -v reset monitor all
-- run your application --
db2 -v get snapshot for all databases > snap.out
db2 -v get snapshot for dbm >> snap.out
db2 -v get snapshot for all bufferpools >> snap.out
db2 -v reset monitor all
db2 -v terminate


请确保您在断开数据库连接之前发出db2 -v get snapshot。当最后一个应用程序与数据库断开连接时,该数据库停止运行,同时所有快照统计信息将会丢失。要确保一直存在使数据库处于正常运行状态的连接,请使用下列方法之一: 

· 在收集快照的窗口中保持一个单独的连接。

· 使用 DB2 ACTIVATE DATABASE 命令。

在数据库快照或缓冲池快照的快照输出中,查找下列logical readsphysical reads,这样就可以计算出缓冲池命中率,它可以帮助您调优缓冲池: 

-- Related lines from a sample of bufferpool snapshots --
Buffer pool data logical reads = 702033
Buffer pool data physical reads = 0
Buffer pool data writes = 414
Buffer pool index logical reads = 168255
Buffer pool index physical reads = 0


缓冲池命中率表明数据库管理器不需要从磁盘装入页(即该页已经在缓冲池中)就能处理页请求的时间百分比。缓冲池的命中率越高,使用磁盘 I/O 的频率就越低。按如下计算缓冲池命中率: 

(1 - ((buffer pool data physical reads + buffer pool index physical reads) /

(buffer pool data logical reads + pool index logical reads))
) * 100%


这个计算考虑了缓冲池高速缓存的所有页(索引和数据)。理想情况下,该比率应当超过 95%,并尽可能接近 100%。要提高缓冲池命中率,请尝试下面这些方法: 

· 增加缓冲池大小。

· 考虑分配多个缓冲池,如果可能的话,为每个经常被访问的大表所属的表空间分配一个缓冲池,为一组小表分配一个缓冲池,然后尝试一下使用不同大小的缓冲池以查看哪种组合会提供最佳性能。

如果已分配的内存不能帮助提高性能,那么请避免给缓冲池分配过多的内存。应当根据取自测试环境的快照信息来决定缓冲池的大小。

回页首

日志缓冲区大小(LOGBUFSZ

背景知识

LOGBUFSZ 是一个数据库配置参数。它是用于日志缓冲区的参数。它允许您指定数据库共享内存的大小以用作在将日志记录写到磁盘之前这些记录的缓冲区。当下列事件之一发生时会将日志记录写到磁盘: 

· 事务提交。

· 日志缓冲区已满。

· 其它某个内部数据库管理器事件发生时。

将日志记录存在缓冲区将产生更加有效的日志文件 I/O,这是因为这样一来可以降低将日志记录写到磁盘的频率,同时每次可写更多的日志记录。如果对专用的日志磁盘有相当多的读操作,或者希望有较高的磁盘利用率,那么可以增加这个缓冲区的大小。当增加这个参数的值时,也要考虑 DBHEAP 参数,因为日志缓冲区使用的空间由 DBHEAP 参数所控制。

如何更改该参数

我们发现该参数的缺省值为 84KB 页),这对于 OLTP 数据库而言通常不够大。LOGBUFSZ 的最佳值为 128 个或 256 个 4KB 页。例如,可以使用下面这个命令来更改该参数值: 

研究步骤

通过查看下面这个示例中所示各行,使用数据库快照来确定 LOGBUFSZ 参数的值是否为最佳值: 

db2 -v update database cfg for DB_NAME using LOGBUFSZ 256
db2 -v terminate


一般而言,log pages readlog pages written之比应当尽可能小。理想情况下,log pages read的值应为 0,而log pages written的值应很大。当 log pages read 太多时,意味着需要一个较大的 LOGBUFSZ

回页首

应用程序堆大小(APPHEAPSZ

背景知识

APPHEAPSZ 是一个数据库配置参数,它定义了代表某个特定代理程序或子代理程序的数据库管理器可以使用的私有内存页数。在为应用程序初始化代理程序或子代理程序时分配堆。分配的堆大小是处理给予代理程序或子代理程序的请求所需的最小值。当代理程序或子代理程序需要更多的堆空间以处理较大的 SQL 语句时,数据库管理器将按照需要分配内存,所分配的内存大小最大可达到该参数所指定的最大值。

如何更改该参数

下面这条命令可以将缺省值(DB2 EE 为 128 个 4KB 页,DB2 EEE 为 64 个 4KB 页)更改成最佳值: 

Log pages read = 0
Log pages written = 12644


研究步骤

当应用程序接收到一个表明应用程序堆中存储空间不够的错误时,应该增加 APPHEAPSZ 的值。

回页首

排序堆大小(SORTHEAP)和排序堆阈值(SHEAPTHRES

背景知识

SORTHEAP 是一个数据库配置参数,它定义了私有排序所使用的私有内存页的最大数目,或共享排序所使用的共享内存页的最大数目。如果排序是私有排序,那么该参数影响代理程序私有内存。如果排序是共享排序,那么该参数影响数据库的共享内存。每个排序都有单独的由数据库管理器按需分配的排序堆。在排序堆中对数据进行排序。如果由优化器来指导排序堆大小的分配,那么用优化器提供的信息来分配的排序堆的大小要小于由该参数所指定的排序堆大小。

SHEAPTHRES 是一个数据库管理器配置参数。私有和共享排序所使用内存的来源不一样��共享排序内存区的大小是在第一次连接到数据库时根据 SHEAPTHRES 值以静态方式预先确定的。私有排序内存区的大小是不受限制的。对于私有排序和共享排序,应用 SHEAPTHRES 参数的方式不同: 

· 对于私有排序,SHEAPTHRES 是对私有排序在任何给定的时间可以消耗的全部内存的实例级限制。当实例的总私有排序内存消耗量达到这一限制时,为其它进入的私有排序请求而分配的内存会大大减少。

· 对于共享排序,SHEAPTHRES 是对共享排序在任何给定的时间可以消耗的全部内存的数据库级限制。当达到这一限制时,不允许有其它共享排序内存请求,直到总的共享内存消耗量回落到 SHEAPTHRES 所指定的限制以下。

使用排序堆的操作示例包括内存中表的散列连接和操作。阈值的显式定义防止数据库管理器将过多数量的内存用于大量排序。

建议

· 使用数据库系统监视器来跟踪排序活动。

· 使用合适的索引使排序堆的使用降到最低。

· 当需要频繁进行大型排序时,增加 SORTHEAP 的值。

· 如果增加 SORTHEAP,请确定是否还需要调整数据库管理器配置文件中的 SHEAPTHRES 参数。

· 优化器用排序堆大小来确定存取路径。在更改该参数后请考虑重新绑定应用程序(使用 REBIND PACKAGE 命令)。

· 理想情况下,应当将排序堆阈值(SHEAPTHRES)参数合理地设置为在数据库管理器实例中设置的 SORTHEAP 参数最大值的倍数。该参数至少应当是实例中任何数据库所定义的最大 SORTHEAP 的两倍。

如何更改这些参数

要更改 SORTHEAP 和 SHEAPTHRES 的值,请运行以下命令:

db2 -v update db cfg for DB_NAME using applheapsz 256
db2 -v terminate


研究步骤

OLTP 应用程序不应该执行大型排序。大型排序在 CPU 和 I/O 资源方面的成本太高了。通常,SORTHEAP 大小的缺省值(256 个 4KB 页)就足够了。事实上,对于高并发性 OLTP,您可能希望降低这个缺省值。当需要进一步研究时,可以发出下面这条命令:

-- SORTHEAP should be changed for individual database --
db2 -v update db cfg for DB_NAME using SORTHEAP a_value
-- SHEAPTHRES is a database manager parameter --
db2 -v update dbm cfg using SHEAPTHRES b_value
db2 -v terminate


然后,让您的应用程序运行一会,然后输入:

看��下下面这个示例中的输出:

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 大于 5,它可能表明每个事务的排序太多。如果 PercentSortOverflow 大于 3%,那么可能发生了严重的、未曾预料到的大型排序。发生这种情况时,增加 SORTHEAP 只会隐藏性能问题 - 却无法修正它。这个问题的正确解决方案是通过添加正确的索引改进有问题的 SQL 语句的存取方案。

回页首




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论