设为首页 收藏本站
查看: 858|回复: 0

[经验分享] DB2中的maxlocks locklist 参数

[复制链接]

尚未签到

发表于 2016-11-14 10:12:02 | 显示全部楼层 |阅读模式
  maxlocks数据库配置参数用于指定触发锁定升级的百分比。获取触发锁定升级的锁定的表可能不受影响。每个锁在内存中都需要一定的内存空间,为了减少锁需要的内存开销,DB2提供了锁升级这一功能。锁升级是通过对表加上非意图性的表锁,同时释放行锁来减少锁的数目,从而达到减少锁需要的内存开销的目的的。锁升级由数据库管理器自动完成,数据库的配置参数锁列表页面数(LOCKLIST)和应用程序占有百分比(MAXLOCKS)直接影响锁升级的处理.
  应用程序超出允许它具有的总的锁内存百分比(MAXLOCKS值)的情况。因此,数据库执行锁升级,将应用程序的锁内存百分比降低到MAXLOCKS指定的百分比之下。下图说明了更为常见的情况:到达总的锁内存限制,因此执行锁升级来释放锁内存。
  锁升级问题可以通过增加LOCKLIST和MAXLOCKS数据库参数的大小来解决。但是,如果仍然遇到锁定问题,应检查是否因未能提交事务而未释放已更新行上的锁。
  每个数据库都有一个锁列表,该列表包含所有同时连接到数据库的应用程序所持有的锁。在32位平台上,一个对象上的第一个锁要求占64字节,而其他的锁要求占32字节。在64位平台上,第一个锁要求占112字节,而其他锁要求占56字节。
  当一个应用程序使用的LOCKLIST的百分比达到MAXLOCKS时,数据库管理器将执行一次锁升级(lockescalation),在这个操作中将使行锁转换成单独的一个表锁。而且,如果LOCKLIST快要耗尽,数据库管理器将找出持有一个表上最多行锁的连接,并将这些行锁转换成表锁,以释放LOCKLIST内存。锁定整个表会大大降低并发性,死锁的几率也就增加了。
  ●<wbr><wbr><wbr><wbr><wbr><wbr>LOCKLIST表明分配给锁列表的存储容量。每个数据库都有一个锁列表,锁列表包含了并发连接到该数据库的所有应用程序所持有的锁。锁定是数据库管理器用来控制多个应用程序并发访问数据库中数据的机制。行和表都可以被锁定。</wbr></wbr></wbr></wbr></wbr></wbr>
  ●<wbr><wbr><wbr><wbr><wbr><wbr>MAXLOCKS定义了应用程序持有的锁列表的百分比,在数据库管理器执行锁升级之前必须填充该锁列表。当一个应用程序所使用的锁列表百分比达到MAXLOCKS时,数据库管理器会升级这些锁,这意味着用表锁代替行锁,从而减少列表中锁的数量。当任何一个应用程序所持有的锁数量达到整个锁列表大小的这个百分比时,对该应用程序所持有的锁进行锁升级。如果锁列表用完了空间,那么也会发生锁升级。数据库管理器通过查看应用程序的锁列表并查找行锁最多的表,来决定对哪些锁进行升级。如果用一个表锁替换这些行锁,将不再会超出MAXLOCKS值,那么锁升级就会停止。否则,锁升级就会一直进行,直到所持有的锁列表百分比低于MAXLOCKS。MAXLOCKS参数乘以MAXAPPLS参数的值不能小于100。</wbr></wbr></wbr></wbr></wbr></wbr>
  LOCKLIST配置参数的计算方法如下(操作系统为32位平台):
  (1) 计算锁列表大小的下限:(512 * 32 *MAXAPPLS)/4096。其中,512是每个应用程序平均所含锁数量的估计值,32是对象(已有一把锁)上每把锁所需的字节数。
  (2) 计算锁列表大小的上限:(512 * 64 *MAXAPPLS)/4096。其中,64是某个对象上第一把锁所需的字节数。
  (3)对于您的数据,估计可能具有的并发数,并根据您的预计为锁列表选择一个初始值,该值位于您计算出的上限和下限之间。
  MAXLOCKS配置参数的计算方法如下:
  MAXLOCKS = 100 * (512锁/应用程序 * 32字节/锁 *2)/(LOCKLIST * 4096字节)
  该公式允许任何应用程序持有的锁是平均数的两倍。如果只有几个应用程序并发地运行,则可以增大MAXLOCKS,因为在这些条件下锁列表空间中不会有太多争用。
  锁升级会在以下两种情况下被触发:
  ●<wbr><wbr><wbr><wbr><wbr><wbr>某个应用程序请求的锁所占用的内存空间超出了MAXLOCKS和LOCKLIST的乘积大小。这时,数据库管理器将试图通过为提出锁请求的应用程序申请表锁,并释放行锁来节省空间。</wbr></wbr></wbr></wbr></wbr></wbr>
  ●<wbr><wbr><wbr><wbr><wbr><wbr>在一个数据库中已被加上的全部锁所占的内存空间超出了LOCKLIST定义的大小。这时,数据库管理器也将试图通过为提出锁请求的应用程序申请表锁,并释放行锁来节省空间。</wbr></wbr></wbr></wbr></wbr></wbr>
  虽然升级过程本身并不用花很多时间,但是锁定整个表(相对于锁定个别行)降低了并发性,而且数据库的整体性能可能会由于对受锁升级影响的表的后续访问而降低。
  在设计良好的数据库中,很少发生锁定升级。如果锁定升级将并行性降低到不可接受的程度(由lock_escalation监视元素监视),那么就需要分析问题并决定如何解决此问题。
  锁升级是有可能失败的,比如,现在一个应用程序已经在一个表上加有IX锁,表中的某些行上加有X锁,另一个应用程序又来请求表上的IS锁,以及很多行上的S锁,由于申请的锁数目过多引起锁的升级。数据库管理器试图为该应用程序申请表上的S锁来减少所需要的锁的数目,但S锁与表上原有的IX锁冲突,锁升级不能成功。
  如果锁升级失败,引起锁升级的应用程序将接到一个–912的SQLCODE。
  下面我们举一个实际的例子。
  首先,运行下面的命令以打开针对锁的DB2监视器:
  db2 -v update monitor switches using lockon
  db2 -v terminate
  然后收集数据库快照:
  db2 -v get snapshot for database on sample | grep–i lock
  在快照输出中,检查下列各项:
  Locks held currently = 21224
  Lock waits = 24683
  Time database waited on locks (ms) =32875
  Lock list memory in use (Bytes) =87224
  Deadlocks detected = 89
  Lock escalations = 8
  Exclusive lock escalations =12
  Agents currently waiting on locks =0
  Lock Timeouts = 0
  Internal rollbacks due to deadlock =0
  如果“Lock list memory in use(Bytes)”超过定义的LOCKLIST大小的50%,那么就增加LOCKLIST数据库配置参数中的4KB页的数量。
  如果发生了“Lockescalations>0”或“Exclusive lockescalations>0”,则应该或者增大LOCKLIST或者MAXLOCKS,抑或同时增大两者。查看“Locksheld currently”、“Lock waits”、“Time database waited on locks(ms)”、“Agents currentlywaiting on locks”和“Deadlocksdetected”中是否存在高值,如果有的话,就可能是差于最优访问计划、事务时间较长或者应用程序并发问题的症状。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300149-1-1.html 上篇帖子: DB2 自增长列导入、导出测试 下篇帖子: DB2 Error Messages (SQLCODE, SQLSTATE)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表