Question & Answer
Question
请简单介绍内部注册变量APM_THROTTLE=60的用法?
Answer
当语句集中器(即statement concentrator: DB CFG stmt_conc=LITERALS)打开时,比如说编译下面的语句:
SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO='000020'
编译的时候上面的语句其实会被转化为为语句:
SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO=:L0
在编译结束前,最初的语句(即转化前的语句)会被从package cache里面清除掉。 在绝大多数时候这种设计是最优的,但是在某些场景下,这个行为(即把转化前语句从package cache里面清除的行为)也可能会带来一些负面影响。 比如我们有应用重复提交下面的语句到服务器执行:
SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO='000020'
这种情况下,如果不清理转化前语句是会带来收益的。
还有一些时候,频繁清理转化的语句会导致SQLO_LT_sqlra_anchor_stmt__latch的竞争。 比如说从db2pd -latch看到下面的现象:
且从stack数据看到上面latch的直接或者间接竞争者,有较大部分正在调用sqlra_cache_del_empty_stmt():
sqlra_hash_del_stmt__FP13SQLO_MEM_POOLP17sqlra_anchor_stmtP17sqlra_cached_stmtPi + 0x39C
sqlra_cache_del_empty_stmt__FP8sqlrr_cbP17sqlra_anchor_stmtP17sqlra_cached_stmtPi + 0x88
0sqlra_csm_dec_and_clean_statement__FP8sqlrr_cbP17sqlra_cached_stmt + 0x2C8
sqlra_sqlC_free_section__FP8sqlrr_cbP25sqlra_sql_context_siblingi@OL@21253 + 0x54
sqlra_sqlC_free_section__FP8sqlrr_cbP25sqlra_sql_context_siblingi + 0x254
sqlra_sqlC_get_stmt__FP8sqlrr_cbPUcUiUciP17sqlra_cached_stmtPi + 0x6C8
sqlra_get_section__FP8sqlrr_cbPUcsT2T3T2UsUlP16db2UCprepareInfoP15db2UCCursorInfoiUi + 0x1FC
sqlrr_sql_request_pre__FP14db2UCinterfaceUiiP16db2UCprepareInfoP15db2UCCursorInfo + 0x2E4
sqlrr_prepare__FP14db2UCinterfaceP16db2UCprepareInfo + 0xB38
如果出现上面这种情况,而你又没有别的更好方法解决问题的时候,或许可以尝试这个内部变量:
db2set APM_THROTTLE=60 (需要重起实例生效)
上面设置生效后,上面所说的转换前语句不会从package cache被清除, 一定程度上可以减少sqlra_cache_del_empty_stmt()的调用频率,缓解SQLO_LT_sqlra_anchor_stmt__latch的竞争。
但是这也会带来负面作用,就是package cache里面充斥了大量转换前语句, 随着这些语句在package cache里面滋生,性能有可能在一段时间后再次恶化,所以, 建议在"APM_THROTTLE=60"打开的情况下,定期执行下面命令清理package cache:
db2 "FLUSH PACKAGE CACHE DYNAMIC"
Was this topic helpful?
Document Information
Modified date:
16 June 2018
UID
swg22016560