Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369795
  • 博文数量: 71
  • 博客积分: 4691
  • 博客等级: 上校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-14 15:14
个人简介

who am i ... i'm back.

文章分类

全部博文(71)

文章存档

2014年(4)

2011年(1)

2010年(22)

2009年(17)

2008年(27)

我的朋友

分类:

2008-05-22 18:17:27

TXSeries开发设计应该注意的一些问题

刘睿

 

使用CICS/TXSeries开发设计一个大型的应用系统,应该注意以下要点:

1.         应用设计模式问题

2.         参数配置

3.         发生问题时如何处理

 

下面分别予以说明。

 

 

1.应用设计模式问题

设计模式问题指在应用设计上需做出适当调整的问题,其原因在于没有考虑到CICS/TXSeries的某些用法带来的副作用。主要分为以下两类:

l         分布式调用(LINK/START)的设计

l         CICS守护程序的设计

l         参数调整(包括交易分类)

 

1.1分布式调用(LINK/START)的设计

在进行跨域LINK调用时,如果不使用SYNCONRETURN选项,同ECI程序使用扩展调用效果一样,被调用的程序不能自己发出同步点请求(SYNCPOINT),而且要等待主调程序发出同步点请求(SYNCPOINT)后,被调用的程序占用的cicsas才能被释放。这种情况可能导致一些cicsas数目吃紧,交易超时等问题。

 

在设计CICS/TXSeries跨域调用时,要考虑到采用异步方式会带来的副作用(如果采用以异步见长的MQSeries则无此副作用),这些副作用包括:

l         在被调方会有一个镜像CPMI交易产生的任务,占领一个cicsas的位置,直到主调方发出同步点请求(SYNCPOINT)。CICS如此设计是个历史 原因,CICS异步启动的要求是在另一个终端异步启动交易,而且在实施同步点请求(SYNCPOINT)之前可以多次使用START传输数据到该终端。这 个问题可能造成cicsas数目吃紧,交易超时,并产生ATNI错误信息。

l         在进行同步时,涉及到一个分布式的同步问题,造成响应时间长,并可导致A27K异常中断。A27K错误信息的原因是同步时的通信故障:比如远端的CICS 域不响应或者中断(通信错误15a00002/15a00102),Client停止响应(通信错误15a00007/a0000100),被调方 CICS域忙引起主调方超时(通信错误15a00007/a0000100)。

 

解决问题的办法是:

l         更改跨域的异步调用(CICS START)为同步调用(CICS LINK SYNCONRETURN),可以在被调方自己实施必要的异步调用(CICS START)。

l         给所有涉及分布式调用的交易设置TD:Timeout(单位:分钟。参考建议3-5分钟),TD:DeadLockTimeout(单位:秒。参考建议180 - 300秒)属性,RD:XPRecvTimeout (单位:秒。参考建议60 - 180秒)。只有这样才能有效避免远端CICS域繁忙和网络引起的通信超时。

l         设置交易分类。

 

CICS有多种超时设置,发生作用的时间很复杂,一般来说:

l         TD:Timeout在主动发出ISC请求时发生作用。

l         RD:XPRecvTimeout在被动和异步时发生作用。

 

LINK和START调用的等待情况比较如下:

l         使用跨系统的START调用时:如果使用NOCHECK选项,则不会等待,但是在发出同步点请求(SYNCPOINT)时会等待远端交易启动。任何超时可能产生ATNI和A27K Abend。当然,如果START调用时没有NOCHECK选项,则将等待并能够得到一定的返回码。

l         使用LINK调用时:只有对方执行完毕,才能返回。注意使用本域的LINK调用时,相当于在一个程序中运行。被调用的程序如果发生Abend,主调程序一定Abend。

 

所以在跨系统的调用时,使用LINK调用,在大部分情况下可以根据返回值来取得信息。LINK和START调用的主要返回值解释如下:

1、LINK错误码分析

 

INVREQ(请求非法)

交易状态不对(有无SYNCONRETURN混用)

TRANSID全空

 

LENGERR

DATALENGTH选项为负值

DATALENGTH选项比LENGTH选项长

 

NOTAUTH

权限问题

使用了SYSID选项,但是RSLCheck没有设置为NONE

 

PGMIDERR

PD不存在

PD被disabled.

 

ROLLEDBACK

被LINK的程序无法执行syncpoint

 

SYSIDERR

CD不存在或错误

对方域不存在或已经宕机

网络不通

在本地TD:timeout时,远端交易还在队列

通信错误码:15a00002/15a00102

 

TERMERR

会话失败,TRANSID不存在

在本地TD:timeout时,远端交易还在运行。通信错误码:15a00007/a0000100

RD:MaxTClassLim引起的Reject。通信错误码:15a00007/84b6031

 

2、START错误码分析

 

INVREQ(请求非法)

Hours超范围

Minutes超范围

Seconds超范围

指定REQID但是该TSQ已经存在(在Pool不足时可能出现)

 

IOERR

SFS满

 

ISCINVREQ

ISC失败

 

LENGERR

使用LENGTH(0).

 

NOTAUTH

权限不足

使用了SYSID选项,但是RSLCheck没有设置为NONE

 

SYSIDERR

CD不存在或错误

对方域不存在或已经宕机

网络不通

通信错误码:15a00002/15a00102

 

TERMIDERR

TERMID选项非法

 

TRANSIDERR

TRANSID选项非法

 

 

在使用LINK进行CICS ISC调用时,应当注意恰当的使用LENGTH和DATALENGTH选项。LENGTH选项是必须的,指出通信区的长度。但是发送LINK调用请求时, 经常有请求数据的长度小于返回数据的长度的情况,如果这样的话,请求数据的传输就不需要有LENGTH指定的那么大。因此,还增加了一个可选的参数 DATALENGTH,指明请求数据的长度。恰当使用DATALENGTH选项经常可以减少网络流量,从而提高系统的性能。

 

值得注意的是,在ECI客户程序中,只能指定LENGTH,不能指定DATALENGTH。实际上如果把ECI的通信区全部请空清空成二进制零,系统将自动计算“DATALENGTH”,即从结尾算起的二进制零不会进行网络传输。

 

1.2守护程序调用的设计

在设计CICS/TXSeries守护程序时,必须考虑到以下要点:

l         守护程序必须得到保护,不能异常退出。

l         守护程序不能长时间等待网络通信(比如分布式同步的操作)。

 

针对保护守护程序异常退出的问题:可以使用Abend Handler捕获异常(采用EXEC CICS HANDLE ABEND PROGRAM)。在程序调用的各个级别都可以设置,发生Abend时,CICS会逐级寻找Abend Handler,如果没有,则提交给默认的Abend Handler(默认的一般是做DUMP)。Abend Handler基本上如同正常的CICS程序,但如果采用”EXEC CICS ABEND”结束,则再调用默认的Abend Handler。

 

注意,无法从Abend Handler程序中返回到发生Abend的程序。

 

针对保护守护程序长时间等待网络通信问题:其实不应该在守护程序中直接启动远端交易,无论采用同步还是异步方式。正确的办法是在守护程序中异步启动一个本地交易,该本地交易再启动远端交易(采用同步还是异步方式都可以),再结合超时设置。

 

 

2. 参数调整(包括交易分类)

对于比较大型的TXSeries系统,注意调整以下参数:

l         内存池调整

l         交易分类

l         交易程序驻留内存

l         cicsas数/MaxServer数

l         系统参数

 

2.1内存池调整

在TXSeries的RD中有三种内存池大小设置,包括:

l         MaxRegionPool,是region自己使用的内存。如果cicsas数和连接数很多时,会使用大量的MaxRegionPool来建立CICS内部对象。默认是2M。

l         MaxTSHPool,是共享内存总量。应用程序使用GETMAIN SHARED就会在这个内存池中分配空间。还有些共享对象也会使用此内存池。默认是1M。

l         MaxTaskPrivatePool,每个cicsas的私有内存池,应用程序使用GETMAIN分配的内存在这个内存池中。每个cicsas启动时预 先分配该内存池。举例,如果该值设置为10M,MaxServers等于20,如果20个cicsas都启动,将耗费200M内存。默认是1M。

 

可以使用交易CST2来观察内存池的使用情况,酌情进行调整。但是每次调整必须重新启动域。对较大的系统一些经验值如下:MaxRegionPool=50M,MaxTSHPool=15M + GETMAIN SHARED量,MaxTaskPrivatePool=1M + GETMAIN量(无SHARED选项)。

 

注意:

l         如果使用了GETMAIN SHARED,或者malloc,用完必须从应用释放内存。

l         如果CICS的内存池发生紧缺,会重复报出”CICS is under stress,Short in xxx storage”信息。这时应该提高内存池的大小,并重新冷启动CICS域。

 

2.2 交易分类

通过使用交易分类的方法,可以保证不同种类的交易互不影响,还有利于鉴别错误,并对region起到保护作用。CICS交易(TD)可以分为十类。目的在于限制某一种或某几种交易执行和排队的个数。防止一类交易的爆发或错误占满所有cicsas,影响整个region。

 

修改TD定义中某个交易的TClass参数,可以将该交易归于某一类。该数值为1至10。缺省值为none,表示没有分类。没有分类的交易只受到RD中MaxServers参数的限制,即受到cicsas数目的限制。

 

例如:RD定义中的ClassMaxTasks=10,10,20,1,1,1,5,10,10,30 规定了每一类交易可以运行的上限,自左向右为第1类至第10类。RD定义中的ClassMaxTaskLim=1,1,1,0,0,0,5,10,5,10 规定了每一类交易可以排队的上限数目减1。当正在运行的数目达到了ClassMaxTasks限制后,新的改类交易请求在队列中进行排队。如果队列达到上限,交易被region拒绝,可能出现Abend A141。

cicsupdate –c rd –r $CICSREGION \

        ClassMaxTasks=10,10,20,1,1,1,5,10,10,30 \

        ClassMaxTaskLim=1,1,1,0,0,0,5,10,5,10 \

        MaxRegionPool=50000000 \

        MaxTaskPrivatePool=4194304 \

        MaxTSHPool=20971520

cicsupdate -c td -r $CICSREGION -P CAIP Permanent=no

cicsupdate -c td -r $CICSREGION -P CAIP Permanent=yes TClass=1

cicsupdate -c td -r $CICSREGION -P IPSW Permanent=no

cicsupdate -c td -r $CICSREGION -P IPSW Permanent=yes TClass=2

cicsupdate -c td -r $CICSREGION -P CPMI Permanent=no

cicsupdate -c td -r $CICSREGION -P CPMI Permanent=yes TClass=10

 

在上面的例子当中,CAIP交易被归为第1类交易,该类交易可以同时运行10个,另外可以有0(1-1)个在队列中等待。队列总长度为10+1-1 =10。IPSW交易被归为第2类交易,该类交易可以同时运行10个,另外可以有0(1-1)个在队列中等待。队列总长度为10+1-1=10。CPMI 交易被归为第10类交易,该类交易可以同时运行30个,另外可以有9(10-1)个在队列中等待。队列总长度为30+10-1=39

 

2.3 交易程序驻留内存

另外,如果CICS程序比较大(例如10M以上),反复调用时都从硬盘加载可能会使效率明显降低。这样可以设置PD属性使得程序驻留内存。但是要注意,驻留内存的程序的全局和静态量声明初始化代码不被执行,例如:

int a=1;

static int b=2;

 

2.4 cicsas数/MaxServer数

对于cicsas数/MaxServer数的设置,一般最少要设到CPU个数的3倍。如果计算工作在本地执行,设置过多的cicsas数无助于吞吐量的提高,但可以增加平滑度,当然也消耗了更多的内存。如果本域只作为网关使用,则可以提高cicsas数,具体看实际情况。

 

2.5 系统参数

针对HP和Solaris系统,TXSeries文档要求调整许多系统参数。对于大型系统,经验上要增加10倍。对Solaris系统,还应该调节进程调度表。

 

 

3.发生问题时如何处理

CICS系统发生问题时,无论是开发问题,还是一些版本的缺陷,都应该进行合理的信息收集工作,这样有利于分析错误原因。下面分以下几点进行讨论:

l         ASRA DUMP问题

l         交易挂住或者运行时间过长问题

l         宕机问题

 

3.1 ASRA DUMP问题

ASRA问题的本质是内存越界错误,可以通过分析交易DUMP文件,来找到错误的来源,具体做法如下:

 

l         使用如下方式编译源程序,取得列表文件(.lst)

cicstcl -s ...

或(对AIX)

xlc_r4 -c -qlist

l         设置TD:transaction dump选项:TransDump=yes

重新启动region,则可以产生ASRA DUMP文件

/var/cics_regions//dumps/dir1/ASRA????.dmp01

/var/cics_regions//dumps/dir1/cics.traceback

l         格式化transaction dump文件:

cicsdfmt -r ASRA????.dmp01 > ????.fmt

l         分析dump文件:

n         检查格式化文件????.fmt或traceback文件,找到出错所在偏移量(十六进制),判断是系统问题还是应用问题;若是应用问题,找出出错函数和该函数内出错位置相对偏移量;

n         对照.lst文件,找到出错点对应的行号(十进制);

n         对照.c文件,找到程序出错内容,可仔细检查.lst或dump格式化文件或traceback文件中寄存器变量值等,检查出详细出错原因;

n         修改源程序,重新编译和测试。

 

3.2交易挂住或者运行时间过长问题

分析交易挂住或者运行时间过长问题的方法本质上是要用showProcInfo和dbx等分析该程序是什么,正在做什么。

值得注意的是:

l         TXSeries v5.1可以通过CEMT提供程序名称。

l         使用SNAPSHOT DUMP也可以给出许多信息。

l         使用交易分类可以给出很多鉴别不同交易的信息。

 

一般来说,要按照以下步骤查找原因:

l         使用cicsterm观察交易类型。

l         使用showProcinfo,truss,dbx等观察交易进程。还可以使用fuser或(fuser -x)看服务调用情况。必要时使用SNAPSHOT DUMP。

l         分析应用日志。

 

导致交易挂住或者运行时间过长问题的错误包括:

l         应用死循环。

l         数据库死锁。

l         客户程序使用了ECI扩展调用,并且没有提交或者回滚交易。

l         没有使用SYNCONRETUEN的LINK,并且没有提交或者回滚交易。

l         使用了跨系统的START(在被调用方,会有一个镜像CPMI交易,直到主调方同步点才会释放)。

 

3.3宕机问题

CICS宕机的原因大体分为以下几类:

l         严重的程序错误导致系统内部严重错误

l         数据库连接错误(比如配置问题或者参数不足)

l         压力过大,系统或者CICS参数不足

l         CICS产品缺陷

 

发生错误时,应该及时收取相关的日志文档。这些日志文档包括:

l         console文件

l         symrecs文件

l         CSMT.out文件

l         showProcInfo信息

l         ps –ef信息

l         ipcs -a信息(一般在使用CUC时需要)

 

许多错误可以通过这些日志文档得到准确定位,如果不能定位,可以提交IBM相关人员。

 



阅读(1655) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~