1.概述
XXX工程师反映在28号的升级后YYY功能不稳定,失败率较高,下面对这一问题进行分析,帮助定位问题。
2.问题分析
2.1.日志分析
生产tuxedo日志内容:
2012-12-30 11:00:04.933 DEBUG [gboss.scom.mwci.CTuxCaller] 22533 CTuxCaller.cpp:1169 sSrvName:ITF_CRM_CANCELFEE
2012-12-30 11:00:04.934 DEBUG [gboss.scom.mwci.CTuxCaller] 22533 CTuxCaller.cpp:1173 (char *)sSvcName.c_str():TAM_CBS1_L2SVC
2012-12-30 11:00:04.952 INFO [eboss.crm.acctmanm] 22213 bills.size():4,acctId:101101271102245,startCycleId:201212,endCycleId:201212
2012-12-30 11:00:04.952 TRACE [gboss.crm.trade.ITF_CRM_PRECEIVEFEE_PRINT] 22203 lcuplugins.cpp:229 [LCU]动态库运行结束
2012-12-30 11:00:04.953 TRACE [gboss.crm.trade.ITF_CCHT_CANCELFEE_HLJ] 22533 lcuplugins.cpp:648 [LCU]执行跨服务调用Tuxedo异常.[INDETERMINATE]CTuxCaller.cpp:1181,13CTuxException-10: [detail:[10][TPESVCERR - server error while handling request]]
2012-12-30 11:00:04.953 TRACE [gboss.crm.trade.ITF_CCHT_CANCELFEE_HLJ] 22533 lcuplugins.cpp:668 [LCU]TuxedoCaller运行结束.
上述标红的日志信息显示调用错误的代码为TPESVCERR - server error while handling request,服务端无法接受该请求。下面分析Tuxedo日志。
Tuxedo日志分析:
084349.nbjk3!tamcbs1l2server.26529.1.0: LIBTUX_CAT:1397: WARN: tpreturn transaction processing failure
084920.nbjk3!TMS_ORA.10542.1.0: gtrid x0 x50ddb141 x5ac8: CMDTUX_CAT:7027: ERROR: tms_timeout xa_rollback returned XAER_RMERR for group GRPAMCBS1
111331.nbjk3!tamcbs1l2server.26529.1.0: gtrid x0 x50ddb141 x6a9b: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
111331.nbjk3!tamcbs1l2server.26529.1.0: gtrid x0 x50ddb141 x6a9f: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
111439.nbjk3!tamcbs1l2server.26529.1.0: gtrid x0 x50ddb141 x6ae1: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
125418.nbjk3!BBL.6883.1.0: gtrid x0 x50ddb141 x4f8b: LIBTUX_CAT:4055: ERROR: No service 'TMS' in group 'GRPITFUIF'
125418.nbjk3!BBL.6883.1.0: gtrid x0 x50ddb141 x4f64: LIBTUX_CAT:4055: ERROR: No service 'TMS' in group 'GRPITFUIF'
144846.nbjk3!TMS_ORA.7871.1.0: CMDTUX_CAT:7027: ERROR: tms_timeout xa_rollback returned -7 for group GRPCSCRM1
上述标红的错误是由tamcbs1l2server报告,而亚联工程师反映将tamcbs1l2server重启后,可以成功完成几笔交易,后面的交易请求失败率较高。下面分析以上错误信息。
2.2.分析xa_start失败原因
Service xa_start returned -9错误代码介绍:
#define XAER_OUTSIDE -9 /* resource manager doing work outside global transaction *
该错误代码是在资源管理器(RM)在全局交易外工作。
出现这种错误有以下两中原因:
1、在开始全局交易前已经有一个本地交易,而且本地交易并未提交或回滚,导致建议全局交易失败。
例如:
Select,delete··········这里进行了数据库的增添改查之类的操作,这些操作会使Tuxedo自动建立一个本地交易,知道这个Server处理完成或在代码中显示的提交或者回滚,该交易才会完成。
Tpbegin()·············这里开始了一个全局交易,由于上边的代码已经建立了一个本地连接,而tuxedo全局事务会对应一个本地连接的事务,这种情况下就会造成tuxedo又想自动启动一个本地事务,相当于一个单线程程序里面同时启动两个事务.这是不可能出现的,同时只能有一个事务。
2、在全局交易超时。如下:
---------->tpbegin() ·······开始全局事务
---------->sql 1 (<---timeout) ···在SQL1处超时,该交易已经超时
---------->sql 2 ·····sql2 会执行失败
---------->sql 3 ········sql3 会导致tuxedo自动生成一个本地交易,这时就会报错误。
--------->tpcommit()/tpabort()交易失败。
可根据一下步骤来查找本地交易的进程或者SQL,该操作需要管理员权限:
检查长时间存在的本地交易。
select xidusn, start_time, ses_addr from v$transaction
找到最早的开始时间
select sid, program, sql_address from v$session where saddr='%ses_addr%';,这里的%ses_addr% 上面SQL查出的%ses_addr%。
找到本地交易的SQL,select sql_text from v$sqltext where address='%sql_address%';这里的%sql_address%为上一条语句查出的%sql_address%。
3.建议
1、查看最近是否有缴费返销所有调用tamcbs1l2server的代码是否有做修改。
2、将代码所有进行数据库修改的操作进行提交后再开始全局交易,尤其是调用tamcbs1l2server前的代码。
3、查看tpcall代码,tpcall或者tpforward的flags参数值(最后一个参数),是否有TPNOTRAN。
4、也可以将tamcbs1l2server调用时的service修改交易参数,以下参数在ubb 的SERVICES字段处修改。
将AUTOTRAN=Y,并且TRAMTIME=$交易超时参数,该参数修改后应进行多次测试,保证系统运行稳定后在投入生产。
5、修改ubb配置文件,查看当天日志,是由于哪个tamcbs1l2server报Service xa_start returned -9错误,格式如下:
140200.nbjk3!tamcbs1l2server.8018.1.0: gtrid x0 x50dfc8e6 x8859: LIBTUX_CAT:481: ERROR: Service xa_start returned -9
8018为报错的server的pid,ps –ef | grep 8018 后输出为:
tamcbs1l2server -C dom=ubss -g 660 -i 5122 -u nbjk3 -U /ngbss/tuxapp/log/ulog -m 0 -A -p 1,30:2,30 -- -T,在配置文件ubb中查找SRVID为660的组,将数据连接的OPENINFO的字符串加上nolocal=t,未修改是的字符串为:
OPENINFO="Oracle_XA:Oracle_XA+acc=P/uop_act1/mfhtgg_3+SqlNet=zwdb_i1+SesTm=120+LogDir=../log"
修改后的字符串为:
OPENINFO="Oracle_XA:Oracle_XA+acc=P/uop_act1/mfhtgg_3+SqlNet=zwdb_i1+SesTm=120+nolocal=t+LogDir=../log"
对于该参数Oracle官方的解释为:、
The nolocal=t option should not cause any performance impact.
The xaerror = -9 (XAER_OUTSIDE) error happens when a server that should be allowing Tuxedo to manage global transactions performs database operations outside of a global transaction.
When nolocal=t is set, we will get an ORA-155 error for the one service call where the application code is performing database operations outside of a global transaction, and subsequent service calls will work fine. If nolocal is NOT set, then a situation where the application code performs database operations outside of a global transaction will cause all subsequent service calls to fail with the "xa_start flags 0 returned -9" error, and the server will need to be rebooted.
Thus, it is much less risky to use nolocal=t and setting this option is recommended.
Additionally, "nolocal=t" is an Oracle Database parameter that can be added to xa_open string to disable local transactions. Tuxedo will just pass the string(nolocal=t) to Oracle DB via xa_open().
对这个参数的添加并不会影响系统性能,而且是推荐添加的参数,建议添加该参数后对系统进行观察,是否会出现该错误。
该贴被funny编辑于2014-2-20 10:46:10该贴被funny编辑于2014-2-21 10:30:52