一次ITL锁导致的系统问题

一次ITL锁导致的系统问题
2011年系统发生的一次问题,现在总结一下。oracle 9.2.0.8 +hpux 11.31
问题描述
第一次:
9:23 CRM系统突然死机,登陆后提示“访问的服务器正忙”,9:35CRM可以登录,但很不稳定,且知识短信无法发送。经测试10:45左右CRM系统恢复正常
影响:呼损增加1364,30S接通率86.68%
第二次:
14:15 CRM系统突然死机,登陆后提示“访问的服务器正忙” ,经测试14:20恢复正常
影响:呼损增加1227,接通率88.5%
第三次:
18:20 CRM系统突然死机,登陆后提示“访问的服务器正忙” ,经测试19:10左右恢复正常
影响:呼损增加2986,接通率77.70%

原因分析:
故障时段主机、数据库均为报错。通过故障时段的statspack报告,基本可以定位由于enqueue等待事件导致数据库响应慢
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~                                                     % Total
Event                                               Waits    Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
enqueue                                           443,596   1,181,401    77.17
db file sequential read                        38,464,588     244,809    15.99
CPU time                                                       57,062     3.73
buffer busy waits                               3,861,116      18,131     1.18
latch free                                        841,297      16,169     1.06

通过下图也可以看出,故障时段基本和enqueue等待事件的时间相吻合
一次ITL锁导致的系统问题_第1张图片
什么原因导致了突然出现enquue锁呢?需要找到具体锁的类型和相关sql。
由于是oracle 9i版本,没有ash来查询历史数据,只能依托statspack和其它一些手段。
通过statspack报告enqueue部分,没有看出异常
Enqueue activity for DB: SIEBDB  Instance: siebdb  Snaps: 28352 -28361
-> Enqueue stats gathered prior to 9i should not be compared with 9i data
-> ordered by Wait Time desc, Waits desc

                                                        Avg Wt         Wait
Eq     Requests    Succ Gets Failed Gets       Waits   Time (ms)     Time (s)
-- ------------ ------------ ----------- ----------- ------------- ------------
US       33,418       33,418           0         830         10.17            8
RO           12           12           0           1      3,414.00            3
SQ       12,172       12,172           0         210          2.56            1
HW       19,830       19,830           0         122          1.15            0
CI       11,214       11,214           0           2          3.50            0

通过监控软件和部署的脚本,发现了一些情况
1,    被hang住的都是对同一个SIEBEL.S_EVT_ACT表的  insert操作(INSERT INTO SIEBEL.S_EVT_ACT….)

2,    在一个时间点,该insert操作等待的row lock都被同一sid 持有,并且等待的对象都是改表或者表的索引(例如S_EVT_ACT_M51等索引)

LDAPUSER (session 2862) waiting for row lock held by LDAPUSER (4688)
 on SIEBEL.S_ACT_EMP_M4 file 212 block 0 row 0 from last 6.05 minutes
with sql statement =
INSERT INTO SIEBEL.S_EVT_ACT ( CONFLICT_ID, LAST_UPD, CREATED, L AST_UPD_BY, CREATED_BY, MODIFICATION_NUM, ROW_ID, PYMNT_FLG, PCT _COMPLETE, TARGET_PER_ADDR_ID, TODO_PLAN_START_DT, TODO_PLAN_END _DT, OWNER_POSTN_ID, PR_CONTAINER_ID, OWNER_OU_ID, PR_ORDER_ID, OWNER_LOGIN, OWNER_PER_ID, PR_PRDINT_ID, PR_SYMPTOM_CD, EVT_PRIO RITY_CD, PRIV_FLG, APPT_REPT_FLG, ROW_STATUS, SCHED_LOCKED_FLG, DO_NOT_ROUTE_FLG, TODO_ACTL_START_DT, EVT_STAT_CD, STATUS_RPT_FL G, CAL_DISP_FLG, TEMPLATE_FLG, TODO_CD, WC_TYPE_CD, TARGET_OU_ID , SRA_SR_ID, ACTIVITY_UID, ALARM_FLAG, AMT_CURCY_CD, AMT_EXCH_DT , ASSET_ID, ASGN_USR_EXCLD_FLG, ALLOW_BREAK_FLG, EST_COST_CURCY_ CD, EST_COST_EXCH_DT, SUBTYPE_CD, SRA_TYPE_CD, COMMENTS_LONG, CR EATOR_LOGIN, COST_CURCY_CD, NAME, PYMNT_DEV_AMT, CAL_TYPE_CD, TO DO_ACTL_END_DT, DONE_FLG, APPT_START_DT, DURATION_HRS, EST_RMNG_ WRK_TM, COST_EXCH_DT, EXP_RLTD_FLG, ACT_CREATED_BY, ACT_CREATED_ DT, MAX_PYMNT_AMT, LOC_DESC, ASSESS_2)
VALUES (:B1, :B2, :B3, :B 4, :B5, :B6, :B7, :B8, :B9, :B10, :B11, :B12, :B13, :B14, :B15, :B16, :B17, :B18, :B19, :B20, :B21, :B22, :B23, :B24, :B25, :B26 , :B27, :B28, :B29, :B30, :B31, :B32, :B33, :B34, :B35, :B36, :B 37, :B38, :B39, :B40, :B41, :B42, :B43, :B44, :B45, :B46, :B47, :B48, :B49, :B50, :B51, :B52, :B53, :B54, :B55, :B56, :B57, :B58 , :B59, :B60, :B61, :B62, :B63, :B64)

3,通过趋势分析,也可以看到,该语句的执行时间在故障时段明显变长,日常执行0.05秒的sql,故障时段执行时间为几十秒,可以确定改语句执行时间过长导致系统慢

 
     SNAP_TIME    TOATL_TIME_S    TOTAL_EXEC    AVG_TIME_S
492    2011/2/21 6:00:02    9.84    201    0.049
493    2011/2/21 7:00:04    36.31    708    0.051
494    2011/2/21 8:00:02    204.14    4974    0.041
495    2011/2/21 9:00:01    568.21    11379    0.05
496    2011/2/21 10:00:05    425457.91    5998    70.933
497    2011/2/21 11:00:05    378466.25    6416    58.988
498    2011/2/21 12:00:01    1012.35    19215    0.053
499    2011/2/21 13:00:02    925.61    21508    0.043
500    2011/2/21 14:00:06    1065.74    20180    0.053
501    2011/2/21 15:00:03    106894.8    15857    6.741
502    2011/2/21 16:00:01    1059.73    21133    0.05
503    2011/2/21 17:00:03    1285.53    23760    0.054
504    2011/2/21 18:00:04    1097.4    23492    0.047
505    2011/2/21 19:00:02    478983.09    8471    56.544
506    2011/2/21 20:00:04    454237.92    10323    44.003
507    2011/2/21 21:00:03    714.61    22230    0.032
508    2011/2/21 22:00:01    668.31    20590    0.032
509    2011/2/21 23:00:04    517.94    16200    0.032
510    2011/2/22 0:00:02    245.1    7870    0.031

原因定位:

 由于被阻塞的sql为insert语句,插入操作不会导致锁表动作,因此排除常见了row lock,seq lock等,怀疑为ITL锁。
 statspack的ITL部分,ITL锁数量明显异常,正常只有10个左右
 

Top 5 ITL Waits per Segment for DB: SIEBDB  Instance: siebdb  Snaps: 28352 -2836
-> End Segment ITL Waits Threshold:       100

                                           Subobject  Obj.           ITL
Owner      Tablespace Object Name          Name       Type         Waits  %Total
---------- ---------- -------------------- ---------- ----- ------------ -------
SIEBEL     SIEB_IDX   S_EVT_ACT_M51                   INDEX        1,215   56.07
SIEBEL     SIEB_IDX   S_EVT_ACT_M52                   INDEX          455   21.00
SIEBEL     SIEB_IDX   S_EVT_ACT_F57                   INDEX          407   18.78
SIEBEL     SIEB_DATA  S_ACT_EMP                       TABLE           40    1.85
SIEBEL     SIEBEL_LAR CX_LOG1_M1                      INDEX           13     .60

 锁等待阻塞的语句,主要为对表SIEBEL.S_EVT_ACT的insert语句,该表为记录客服业务活动的表(这也说明了为什么未影响营业厅crm业务)。同时,故障时段,ITL冲突明显增加,而且主要集中在S_EVT_ACT表的相关索引上,与被阻塞的INSERT语句相符。因此造成交易缓慢的直接原因是S_EVT_ACT表的相关索引上的ITL槽位冲突。 当insert操作被ITL锁阻塞时,应用表现为系统hang住。这时,客服人员一般不会关闭应用,而是会重新打开web再次登录,由于登录的会话过多,导致OM服务器连接数逐渐增加,直到使用率100%。这个时候,再次登陆便会出现“访问的服务器正忙”的提示。
 ITL锁的简单原因分析
 1.    一个并发语句会使用一个ITL锁,超过了INITRANS(初始事务数)的保留设定(默认设定为2),并发交易高会出现ITL征用情况,理论上INITRANS可扩展到255(MAXTRANS),但实际应用中数据会被data占用,造成有些交易没有足够的ITL槽位可用。
备注:如图,Siebel DB db_block_size=8k
 
2.      交易提交变慢,持有的ITL槽位不能及时释放,同样造成后续交易没有足够的ITL槽位可用。

后续措施
  原因定位后,解决就很容易了。通过修改主要业务表S_EVT_ACT表的相关索引的ITL槽位数(INITRANS)加大到50,系统再也没有出现ITL锁

你可能感兴趣的:(sql,服务器,crm,insert,login,conflict)