`
ouyida3
  • 浏览: 49858 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于tuxedo进程服务自增长后报错问题分析

 
阅读更多
问题描述:
当tuxedo的进程自动增长后,应用会持续报错:
Connection does not exist (err11)

问题分析:
报错信息来源于操作Altibase时。咨询了altibase厂家认为数据库没问题,所以推测是操作altibase的变量失效了所致。

变量代码:
AltibaseIntf * abdb::AltibaseIntf::getInstance()
{
    static AltibaseIntf dbi;
    return & dbi;
}

static string curTimeStamp("");
由于dbi变量是static,dbi在连接数据库时判断是否连接的变量时间戳也是static,根据我上次的实验证明,static的在linux上替换动态库是会清空内存的,推测tuxedo线程增长的机制与动态库替换相似。(后面经过验证,是第二个static变量导致)

报错代码:
    if (SQL_ERROR == SQLAllocStmt(m_dbc, &m_stmt))
    {
         if (m_dbc == NULL)
            LOG_TRACE(logger, "error-altibase m_dbc is null!");
   
         throwError("SQLAllocStmt出错:");
    }
SQLAllocStmt函数报错。这个函数报错,很有可能就是m_dbc失去了连接,失去连接的原因很有可能就是dbi变量内存清空了。

整体流程:
void QueryRealBillFromMemDB(CFmlBuf &inBuf, CFmlBuf &outBuf)
{
// 使用单例
DetailbillMgrHolder::getInstance().getRealBillFromMemDB(inBuf,outBuf);
// 调用函数
int DetailbillMgr::getRealBillFromMemDB…
// 取得数据库连接(是static)
abdb::AltibaseIntf * abdbi = abdb::AltibaseIntf::getInstance();
// 如果未连接则进行连接,已连接则直接返回,判断是否连接的变量也为static
abdbi =  abdb::connectAltibase(abdbi);
// 这句报错
abdbi->setSql(sql);
}

1 构建环境
先修改tuxedo的ubb文件,比如开发机上的ubb_tp02文件,使得min与max不一致:

tamcbs1l1server SRVGRP="GRPAMCBS1" SRVID=5360 RQADDR="tamcbs1l1" MIN=1 MAX=2 REPLYQ=Y CLOPT="-A -r -e tp02_s
imp -p 1,30:2,30 -- -T"

默认先启动一个进程,然后模拟并发调用,使其自动增长为两个进程。

2 模拟并发调用
调用前只有一个进程:
[builder@crmint-tp02 ~]$
[builder@crmint-tp02 ~]$ps -ef|grep tamcbs1l1server|grep tuxapp|grep 540
tuxapp   60746     1  0 14:31 pts/10   00:00:00 tamcbs1l1server -C dom=ngbss -g 540 -i 5360 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -A -r -e tp02_simp -p 1,30:2,30 -- -T
[builder@crmint-tp02 ~]$

打开2~3个窗口,进程循环调用:
/tuxapp/preloader]$amcbs.sh

调用后几秒钟,自动增长为两个进程,16点30分的就是新的进程:
[builder@crmint-tp02 ~]$
[builder@crmint-tp02 ~]$ps -ef|grep tamcbs1l1server|grep tuxapp|grep 540
tuxapp   60746     1  0 14:31 pts/10   00:00:25 tamcbs1l1server -C dom=ngbss -g 540 -i 5360 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -A -r -e tp02_simp -p 1,30:2,30 -- -T
tuxapp   72538     1 28 16:30 pts/10   00:00:01 tamcbs1l1server -C dom=ngbss -g 540 -i 5361 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -D -A -r -e tp02_simp -p 1,30:2,30 -- -T
[builder@crmint-tp02 ~]$

1,30:2,30的解释:
CLOPT="-A -p 1,30:2,30 -- -T"
为服务器指定命令行参数,这个参数被两个连续减号分成前后 两个 部分
-A:初始化并公告服务进程 中所有的服务
-p:这个参数通常用于MSSQ服务进程,它告诉Tuxedo在什么条件下启动一个新进程,在什么条件下杀死一个新进程。
-p参数可以以队列长度为条件,如”-p 5,6:15,3”,表示在3秒内,如果服务器队列长度超过15则创建一个新的进程实例,在6秒内,如果服务器队列长度小于5,则杀死一个已经存在 的进程实例
-p也可以以服务器负载 为条件,如”-p 500”表示当服务器负载大于500时,就创建一个新的进程 实例,当服务器负载小于500时就杀死一个已经存在 的进程实例 

日志也开始报错:
tpcall [task:1][4]  QAM_OWEFEE_QUERY@TAM_CBS1_L1SVC return: X_RESULTCODE:-1 X_RESULTINFO:QAM_OWEFEE_QUERY执行异常:
调用函数QueryRealBillFromMemDB发生错误:[INDETERMINATE]AltibaseIntf.cpp:76,17AltibaseException--1: SQLAllocStmt出错:[47175921111094]:,Connection does not exist (err11) X_RECORDNUM:1

    lcuName: [task:1]  QAM_OWEFEE_QUERY [call ok:4]     max:212843ms,min:59105ms,average:0.135758s

一段时间不调用后,进程恢复为1个:(注意,把30改为10会更容易恢复到1个进程)
crmint-tp02:[/ngbss/tuxapp/etc]$
crmint-tp02:[/ngbss/tuxapp/etc]$ps -ef|grep tamcbs1l1server|grep tuxapp|grep 540
tuxapp   77356     1 10 16:54 pts/2    00:00:17 tamcbs1l1server -C dom=ngbss -g 540 -i 5360 -u crmint-tp02 -U /ngbss/tuxapp/log/ulog -m 0 -A -p 1,30:2,10 -- -T
crmint-tp02:[/ngbss/tuxapp/etc]$

3 修改代码
static AltibaseIntf dbi;

static string curTimeStamp("");

把dbi的static去掉,报错依旧。
把curTimeStamp的static去掉,报错去除。
证明是curTimeStamp引起。

经过试验证明,去掉static后,报错不再有。即使tuxedo进程增长了,没有报错;进程降下来了,没有报错;然后进程又再升上去,还是没有报错。

4 错误原因分析
把curTimeStamp和timeStamp打印出来观察
第一次调用时:
curTimeStamp:,timeStamp:2009-02-07 00:00:00

第二次调用时:
curTimeStamp:2009-02-07 00:00:00,timeStamp:2009-02-07 00:00:00

因为cur变量用了static,所以第二次会保持不变,数据库重新连接的条件是cur必须小于time,因此,在这种情况下会沿用原来的dbi连接,但是dbi变量已经可能被清空了,所以报错。
if(curTimeStamp < timeStamp)
{
数据库连接
}

5 另外发现的问题
重新发布libAltibaseIntf.so后,不重启会卡死。
原因待续。

6 解决方案
待续
分享到:
评论
1 楼 ouyida3 2013-08-22  
这篇和解决方案那篇加起来领导HaiB看了说不错

相关推荐

    TUXEDO一些常见错误

    - **文件读写错误**:此类错误多由权限问题引起,检查文件和目录的权限设置,确保TUXEDO进程有足够的权限进行读写操作。 - **配置文件错误**:包括但不限于格式错误、路径错误等。仔细检查配置文件的语法和路径设置...

    关于tuxedo学习资料

    其核心功能包括事务管理、进程间通信(IPC)以及服务发现等。 二、Tuxedo架构 Tuxedo架构由客户端、服务器端、管理工具和监控工具组成。客户端通过ORB(对象请求代理)与服务器进行通信,服务器端则包含应用程序和...

    TUXEDO维护

    - **原因分析**:TUXEDO服务数过多或内存泄露。 - **解决步骤**:首先使用`ps aux | head -1; ps aux | grep tuxyy | sort –rnk6`命令检查内存使用情况,若发现服务数过多或内存泄露,及时与华为维护团队沟通,调整...

    tuxedo服务积压时检查是否数据库问题

    当Tuxedo服务出现积压情况时,这可能表明系统存在性能瓶颈或者资源争抢,其中数据库问题是一个常见的原因。本篇文章将深入探讨如何在Tuxedo服务积压时排查并解决可能的数据库问题。 首先,我们需要理解Tuxedo服务...

    Weblogic wtc调用tuxedo服务

    这些配置完成后,WebLogic Server 将能够通过WTC调用Tuxedo服务进行事务处理。在实际操作中,可能还需要考虑其他的配置,如安全设置、性能优化、错误处理和日志记录等。此外,测试和调试是确保配置正确并能正常工作...

    Tuxedo性能跟踪文件stderr格式分析及分析工具

    以下是使用tuxpa.sh工具进行统计分析后的示例结果: 1. **service每分钟明细统计数据**:显示每个service在每分钟内的调用次数、平均调用时间等信息。 2. **service每分钟汇总统计数据**:提供所有service在每分钟...

    Tuxedo服务资源池化方案

    为解决上述问题,提出了一种Tuxedo服务资源池化方案,该方案通过建立资源池化技术,实现了对Tuxedo服务的统一分析、管理和整合。具体实现方案包括以下几个关键模块: 1. 配置管理模块:主要负责中间件服务在特定...

    Java通过Jolt调用Tuxedo服务[参考].pdf

    在完成服务配置后,需要启动Tuxedo管理服务器`tmserv`以及服务进程。在启动前,确保依赖的数据库服务已经运行,因为Tuxedo服务可能依赖于数据库连接。 4. **配置WebLogic与Tuxedo Jolt**: 在WebLogic服务器中,...

    Java通过Jolt调用Tuxedo服务

    Java 通过 Jolt 调用 Tuxedo 服务是一种常见的技术实践,特别是在集成传统企业级应用时。本文将详细阐述如何在特定环境下(Eclipse3.1, Jolt, WebLogic8.1, Tuxedo9.0)实现这一过程。 首先,Jolt 是 BEA Tuxedo ...

    用JAVA调用Tuxedo服务必须的JAR包

    5. **关闭连接**:在完成所有操作后,记得正确关闭与Tuxedo的连接,释放资源。 总的来说,Jolt系列JAR包是Java开发者与Tuxedo系统交互的关键工具,它们使得Java应用能够充分利用Tuxedo的强大功能,如高效的消息传递...

    TUXEDO:基于IPC机制浅析TUXEDO及其应用

    本文通过对Tuxedo的IPC机制进行了深入分析,并结合实际案例提出了优化建议。希望这些内容能帮助读者更好地理解和使用Tuxedo,以应对日益复杂的业务挑战。 #### 参考文献 由于篇幅限制,此处省略具体参考文献。 ###...

    Java通过WTC调Tuxedo服务实例(String)

    Java通过WTC调Tuxedo服务实例,传入类型:String型

    tuxedo快速入门 doc

    3. Client:客户端进程发起服务请求,与Tuxedo服务器进行通信。 4. TUXCONFIG:配置文件,包含了Tuxedo系统的所有配置信息,如服务器定义、网络设置、安全策略等。 三、Tuxedo开发流程 1. 设计服务接口:定义服务...

    delphi 调用Tuxedo服务

    描述中提到的"tuxedo服务端代码",这部分通常包含了Tuxedo服务的实现,包括定义服务操作、处理客户端请求、管理事务状态等功能。服务端通过定义服务接口(如TMXT定义的接口)来暴露服务,并且能够通过Tuxedo的管理...

    tuxedo应用程序开发指南

    2. 服务(Services):Tuxedo中的服务是应用程序逻辑的容器,每个服务可以包含多个进程,负责处理特定类型的事务。 3. 进程(Processes):服务内部的执行单元,处理客户端的请求。 4. 客户端库(Client Libraries)...

    TUXEDO管理 TUXEDO管理.doc

    UBB(Universal Binary Block)文件是 Tuxedo 的配置文件,它定义了服务、进程、网络监听器等关键组件。配置 UBB 文件涉及设置服务名称、进程类型、监听端口、日志级别等参数,对系统的运行和性能有直接影响。 ### ...

    Tuxedo8.1 windows安装包

    3. **Bundled Services**:Tuxedo8.1包含了一系列的服务,如监控、日志记录、性能分析等,这些服务有助于管理和维护复杂的分布式系统。 4. **TUXCONFIG**:这是Tuxedo的配置工具,用于定义服务器、服务、网络设置等...

    Java通过Jolt调用Tuxedo服务[定义].pdf

    3. 调用 Tuxedo 服务的步骤包括准备 Tuxedo 服务端代码、在 Tuxedo 中配置 Jolt 相关文件、启动 Tuxedo 服务、配置 WebLogic 服务与 Tuxedo Jolt 相关的参数、配置 Eclipse 3.1 启动 WebLogic 服务、编写 Eclipse ...

Global site tag (gtag.js) - Google Analytics