第五章性能调整5-1第五章性能调整我常常遇到这样的情况,CICS的用户说他们编的程序运行起来很慢,需要调整CICS的性能。我的第一反应一般是:问题不在CICS。那么,首先应该检查什么?所谓性能问题一般出在数据库访问的程序处理上,最常见的问题是:锁定或索引类型不正确,于是一步SQL操作运行了数十秒乃至几分钟。看来,熟练地使用C和E-SQL对CICS来说可谓至关重要。性能调整的关键是找出系统性能的瓶颈,这样才能有的放矢。对应用服务器来说,CPU、内存、网络和硬盘都是可能的瓶颈。而实际情况往往是这四种资源都没有被CICS充分利用,那么一般就要查一下数据库编程的问题了。5.1CICS参数的优化5.1.1CICS性能测试举例[一]测试说明:1、目的:测试CICS的性能,对DB2数据库的访问能力。2、时间:2000年1月20日-2000年1月21日3、地点:(北京)IBM公司盈科中心20层SEC实验室4、人员:刘睿、侯云峰、顾春庆、聂华[二]测试环境:1、硬件平台:测试机用途CPU内存硬盘操作系统RS600043P260数据库(DB2)2*200M(Power3)2G2*8GAIXv4.3.2IBMNetfinity5500CICS服务器2*450M(PII)2G4*8GNTserverv4.0IBMPC300CICS客户机400M(PII)196M6GNTserverv4.0第五章性能调整5-2IBMPC300CICS客户机400M(PII)196M6GNTworkstationv4.0IBMPC300CICS客户机400M(PII)196M6GWIN98IBMPC300CICS客户机400M(PII)196M6GWIN95IBMThinkPad770zCICS客户机350M(PII)256M14GNTworkstationv4.0网络环境:16MBPSTokenRing,采用TCP/IP协议2、软件平台:CICSv4.2DB2v5.2&SDK开发工具和测试软件3、数据数据主要存储在数据库的3个表(都有主键)中,采用默认的日志形式。表名数据量备注Test.t_user1,000,000条用户信息(用户号:为主键)Test.t_bill2,000,000条帐单信息(用户号+日期:为主键)Test.t_log=访问数操作记录(每次访问均填写,时间戳为主键)[三]测试依据:1、参数定义:名称定义Ncpu:主机CPU数运行CICSServer的主机的CPU数Msrv:CICS并发处理数CICS的MaxServer参数Sim:CICS并发连接数同时连接CICSServer的CICS客户数H_C:事务处理吞吐量每秒钟完成的CICS事务(transaction)数(单位:1/秒)R_T:客户响应时间CICS客户执行CICS事务的平均响应时间(单位:秒)2、基本公式:经理论和实践证明:设置CICS的MaxServer和MinServer参数均为msrv,且满足:3ncpumsrv30ncpu,内存足够大(不发生换页现象),在高并发(满足sim30ncpu)情况下:H_C=常数R_T=sim/H_C[四]测试内容和结果:不连接数据库的CICS系统:通过CICSServerprogram获取服务器日期和时间。测试结果如下:第五章性能调整5-3Sim:CICS并发连接数100—250H_C:事务处理吞吐量112-120(/秒)CICSserverCPU利用率2(CPU)*100%结论:性能瓶颈在于运行CICSserver的主机CPU,可以通过增加CPU个数或主频,或增加运行CICSserver的主机数目来提高性能。一般CICS事务处理:CICS随机产生用户号码(60000000-60999999),通过CICSServer查询期帐单,每次查询后填写操作记录,记录时间戳和其它信息。CICS服务器通过一阶段提交方式连接数据库。数据库建立在裸设备上,使用两块本地硬盘。如果不对数据库进行进一步的优化,得到如下测试结果:Sim:CICS并发连接数100—250H_C:事务处理吞吐量33-35(/秒)CICSserverCPU利用率2(CPU)*30%-36%DBserverIOWait70%结论:性能瓶颈在于数据库。对数据库进行优化后,得到如下测试结果:Sim:CICS并发连接数100—250H_C:事务处理吞吐量72-79(/秒)CICSserverCPU利用率2(CPU)*75%-88%DBserverIOWait40%-60%DBserverCPUIdle40%-50%结论:性能瓶颈仍在于数据库,可以通过增加硬盘数来提高性能。另外,如果不对数据库进行写操作,测试结果与不连接数据库的CICS系统基本相同,其主要瓶颈仍在运行CICSserver的主机CPU。[五]附录:用于测试的服务程序如下:/*****************************************************************************//*--------------------------HEADERFILES-----------------------------------*/#includeeasycics.h/*****************************************************************************//*------------------------------DEFINES------------------------------------*/#ifdef_WIN32#defineDLLIMPORT__declspec(dllimport)#defineDLLEXPORT__declspec(dllexport)#defineCDECL__cdecl#else#defineDLLIMPORT第五章性能调整5-4#defineDLLEXPORT#defineCDECL#endif#defineDB2#ifdefined(DB2)#defineSQLNOTFOUND100#includesql.h#defineDATABASEcicstest#elifdefined(ORA)#defineSQLNOTFOUND1403#endif/*****************************************************************************//*---------------------------GlobalVariables------------------------------*/EXECSQLINCLUDEsqlca;EXECSQLBEGINDECLARESECTION;charg_Phone[9];charg_User[61];doubleg_fee;EXECSQLENDDECLARESECTION;externchar*pCwa;/*****************************************************************************//*Functions*//*****************************************************************************//**/voidmain(){chars[30];if(InitEasyCics()){ExitEasyCics();return;}第五章性能调整5-5/*Read:*/GetValue(NO,g_Phone);/*Write:*/BeginWrite();RsCreate(3);EXECSQLSELECTu.f_phone_no,f_Usr_name,f_feeINTO:g_Phone,:g_User,:g_feeFROMtest.t_useru,test.t_billbWHERE(b.f_phone_no=u.f_phone_no)and(f_month='1')and(u.f_phone_no=:g_Phone);SetValue(PHONE,g_Phone);SetValue(USER,g_User);sprintf(s,%8.2f,g_fee);SetValue(FEE,s);EXECSQLINSERTINTOtest.t_log(f_time,f_log)values(currenttimestamp,:g_Phone);ExitEasyCics();}清单5-1-15.1.2CICS性能优化及注意事项CICS无须特殊调整,就能得到较好的利用,从另一个角度来说,设置方面的调整只能微调性能,编程方面倒有些值得注意的地方。现在纯粹从CICS角度,将可能影响性能的情况和解决办法总结如下:对TDQ、TSQ等的资源,选择类型恰当的类型,例如read-only和nonrecoverable等存取速度较快。尽量减少记录数目,可以增加记录长度。选择适当的Maximumapplicationservers参数,一般取5-20,最少要大于运行CICS的CPU总数的3倍。增加此参数一般不能增加平均吞吐量,但可以增加平滑度,不过会消耗更多的内存。使用PD的Cacheprogram属性,不过这样使动态更新很不方便。如果可行,用onephase的数据库连接取代标准的xa。在数据库处理时,使用恰当的索引类型。减少锁定的可能性,有时,可以适当更改隔离级别。使用负载平衡机制。第五章性能调整5-65.2CICS自带的负载平衡所谓CICS的负载平衡的含义是使用多个CICS服务器以均衡负载。CICS自带的动态负载平衡机制可以动态地选择CICS服务器,能实现一定的负载均衡。但这种机制也有一些弊端。要实现CICS自带的动态负载平衡,首先要在CICS的客户设置多个CICS服务器的连接。然后激活负载管理器即可。读者可以参照下面的界面示意:图5-2-1缺省的方式是Roundrobin,即轮流访问,无须更多的设置。如果想实现有权重的访问,应选择Biasing方式,并在下面具体设置权重。