[异常等待事件latch undo global data]分析

  故障类型

大量latch:undo global data的争用,导致数据库整体性能下降

 

现象错误号

数据库整体响应下降

 

故障描述

 

本文档主要针对某客户核心系统早上6点55分左右出现性能异常,应用响应超时持续长达10分钟,询问后得知由于双十一,日结推迟两小时,完成时间为11号早上7点。在仔细诊断过程中,结合相应时间段的Oracle性能报告,定位相关SQL,最终结论为同时高并发的insert和delete相同表格ACCOUNT_JNLS引起大量latch:undo global data的争用,导致数据库整体性能下降。具体分析如下。

 

  故障原因分析

ASH 报告对比

数据库整体会话数

11 月9、10日6:50:~7:00

11 月11日6:50:~7:00


从数据库整体会话数看 11 号当天明显高于 9 10 号两天,近 5~6 倍。

 

 

 

Top User Events

11 月9、10日6:50:~7:00


11 月11日6:50:~7:00


从数据库Top User Events来看11号当天等待事件相对于9、10号两天较为异常,数据库大部分等待都花费latch:undo global data争用上。

 

SQL 等待

11 月9、10日6:50:~7:00

11 月11日6:50:~7:00

对比9、10日,11号当天相同SQL语句执行次数明显上升,除此之外 at6cgwnx1ajpb 6d9shb2ma1f2d两条insert和for update

语句在前两天是不曾出现的并且产生了大量的latch: undo global data、enq: TX - row lock contention等待,占据了整体的40%之多。

备注: at6cgwnx1ajpb对应SQL语句INSERT INTO account_jnls ( serial_no , account_jnls_no , trans_jnls_no ,……)

6d9shb2ma1f2d 对应SQL语句SELECT area_code , account_no , product_code , gl_class , virtual_flag , real_flag , collect_flag , balance_type , balance_ctrl , sync_flag , cur_type , spot_type , close_flag , max_acc_cycle_no , max_clearing_times , dayend_cycle_no , TO_CHAR(acc_date, :"SYS_B_0") , TO_CHAR(last_acc_date, :"SYS_B_1") , TO_CHAR(open_date, :"SYS_B_2") , TO_CHAR(close_date, :"SYS_B_3") , detail_cnt , debit_amt , credit_amt , debit_cnt , credit_cnt , balance , pre_clearing_times , pre_times_balance , pre_times_dcnt , pre_times_damt , pre_times_ccnt , pre_times_camt , pre_cycle_no , pre_balance , pre_debit_cnt , pre_credit_cnt , pre_debit_amt , pre_credit_amt , dac FROM account_dynamic WHERE account_no = :account_no__0 FOR UPDATE

 

结合ash报告初步判定由于并发insert引起大量latch:undo global data的争用,但是理论上单一insert是不会引起undo争用,进一步排查awr。

AWR 报告对比

数据库top 5

11 月9、10日6:00:~7:00

11 月11日6:00:~7:00

从数据库整体awr报告来看出现了异常latch: undo global data等待,DB CPU所占的时间也从原来的50%左右下降到30%。

 

TOP SQL

从AWR latch: undo global data 为数据库TOP 5 wait event, 查看了该语句就是一条简单的insert values语句(9、10日的报告中并未发现相同SQL),执行频率每小时63620次,单条的执行速度还可以,但是为什么会这么多的latch undo 呢?

进一步查看undo相关的latch

KSLBEGIN 是一种get latch时的非常快的宏,在取得latch后调用KSLEND,ktudba 像是一种从usn 转换data block address的宏

@ Latch Miss Sources

@ ——————

@ undo global data ktudba: KSLBEGIN 0 117,271,003 115,396,045
@ .@ .@ ktu.h:

@ ——

@ #define ktudba(usn, dbap, scnp, arspp) \

@ ktuGetUsegDba((usn), (dbap), (scnp), (arspp), \

@ NULLP(ub2), NULLP(ksqn), NULLP(uword))

@ .

@ ktuGetUsegDba – Kernel Transaction Undo convert from usn to DBA

从latch统计来看存在争用,并非insert单独引起,此时猜测相同表格上存在delete操作,进一步查看sql统计部分,如下:

此时相同表格上确实存在delete操作,通过SQL*Plus客户端连接执行。到此时整个现象已经很明显了

 

故障总结及建议

综合上述分析判断,本次性能故障主要原因是相同表格上同时执行delete和insert操作引起latch:undo global data争用,导致整体性能下降。建议排查应用是否由于日结延迟引起此类问题的出现。


请使用浏览器的分享功能分享到微信等