350 likes | 716 Views
性能调优. 刘睿. 概要. 调节 OS 调节网络通信 调节磁盘 I/O 调节 SFS/CICS 参数 调节应用 使用集群. 调节 OS. 调节 ulimit 参数. 用 ulimit –a 观察:
E N D
性能调优 刘睿
概要 • 调节OS • 调节网络通信 • 调节磁盘I/O • 调节SFS/CICS参数 • 调节应用 • 使用集群
调节ulimit参数 • 用ulimit –a观察: • AIX:修改AIX的cics用户的限制数值(在/etc/security/limits文件) fsize = -1 fsize_hard = -1 core = -1 cpu = -1 data = -1 rss = -1 stack = -1 nofiles = -1 • Solaris:set rlim_fd_max = 8192set rlim_fd_cur = 4096 • HPUX:调节内核参数:maxfiles=1024…
AIX:调节文件高速缓存等 • 如果内存不够,可以减少文件高速缓存:vmo -r -o minperm%=10vmo -r -o maxperm%=15vmo -r -o maxclient%=15 • 环境变量: • AIXTHREAD_SCOPE=S • AIXTHREAD_MUTEX_DEBUG=OFF • AIXTHREAD_RWLOCK_DEBUG=OFF • AIXTHREAD_COND_DEBUG=OFF
调节内核参数 • 基本内核参数建议比基本要求再扩大(比如10倍)。 • 对AIX来说,可能要调节单用户的进程数(默认128)。 • AIX: LDR_CNTRL环境变量:Unset 0(default) 256 MBLDR_CNTRL=MAXDATA=0x10000000 1 256 MB LDR_CNTRL=MAXDATA=0x20000000 2 512 MB LDR_CNTRL=MAXDATA=0x30000000 3 768 MB LDR_CNTRL=MAXDATA=0x40000000 4 1 GB LDR_CNTRL=MAXDATA=0x50000000 5 1.24 GB LDR_CNTRL=MAXDATA=0x60000000 6 1.5 GB LDR_CNTRL=MAXDATA=0x70000000 7 1.75 GB LDR_CNTRL=MAXDATA=0x80000000 8 2 GB • 例:使用命名共享内存段和双共享内存段LDR_CNTRL=NAMEDSHLIB=CICS,doubletext32
Solaris:调节进程调度表 对进程的优先级进行调整: 先观察: dispadmin -c TS -g >/tmp/result 生成的文件最后一列是Level(0-59),第一列是ts_quantum(200-30)。 将ts_quantum列全部改为40后,再导入系统: dispadmin -c TS -s /tmp/result #注:每次重启OS后要重新进行修正。
调节TCP/IP参数 • 调节TCP/IP参数 • 增大TCP/IP发送/接受的缓冲区大小 • 减少TCP/IP keep alive的值。 • AIX例:no -p -o tcp_keepidle=600no -p -o sb_max=1048576no -p -o tcp_sendspace=1048576no -p -o tcp_recvspace=1048576 • SUN-Solaris例:ndd -set /dev/tcp tcp_max_buf 10485760ndd -set /dev/tcp tcp_xmit_hiwat 1048576ndd -set /dev/tcp tcp_recv_hiwat 1048576 • HP-UX例:ndd -h supporttedndd -get /dev/tcp '?‘ndd -set /dev/tcp tcp_keepalive_interval 300000ndd -set /dev/tcp tcp_conn_request_max 1024 • Windows例:修改“HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters”:KeepAliveInterval=1000KeepAliveTime=300,000
调节侦听器 • 对TX v5.0以及以前的版本,增多LD,使每个LD支持的并发客户机少于200。 • 对TX v5.1以及以后的版本,修改LD:TCPProcessCount,使每个LD进程支持的并发客户机少于200。 • 注意Windows客户系统的负载均衡导致多个连接。 • 推荐使用硬件的负载均衡器。 • 调节DCE • 用RPC_UNSUPPORTED_NETIFS屏蔽其余不用的网卡
优化DCE的网络配置 • CICS服务器运行在RPC层次上,进程间的通讯以及CICS服务器与SFS服务器的通讯都是由RPC调用完成,不恰当的DCE配置降低CICS运行性能,延长CICS服务器启动时间。 • 简化DCE的配置: • 1) 仅使用RPC方式:cicscp -v create dce -R • 2) 使用环境变量RPC_SUPPORTED_PROTSEQS指定RPC通讯所用的通讯协议,取值为ncadg_ip_udp即使用UDP(取值为ncacn_ip_tcp即使用TCP):RPC_SUPPORTED_PROTSEQS=ncadg_ip_udp • 设置寻找顺序 • CICS客户程序寻找服务器或CICS服务器使用SFS服务器前先通过RPC端口映射服务寻找服务器的服务端口,如果没有特别设置,寻找动作在所有可用的网卡上搜索,时间可能很长,会影响CICS服务器的启动时间或响应时间。设置CICS_HOSTS环境变量指定一串IP地址或主机名,规定RPC端口寻找的顺序,可以减少寻找时间。 • 通常较优的设置是指定一个专用的网卡作为RPC绑定的网卡,用RPC_UNSUPPORTED_NETIFS屏蔽其余不用的网卡,设置CICS_HOSTS环境变量指向这个网卡所用的IP地址。
优化DCE的网络配置(续) • 屏蔽不用的网卡和IP地址RPC提供通讯端口映射服务,CICS服务进程与SFS服务器调用RPC把服务绑定在网络适配卡上,如果一台机器有多个网络适配卡,RPC设置又没有特别指定,服务会被绑定在所有网卡上,可能降低性能。所以需要在DCE启动前设置如下的环境变量。 • 在AIX和Solaris环境下: • RPC_UNSUPPORTED_NETIFS环境变量指定被屏蔽的网卡,规定RPC把服务绑定在其余的网卡上。设置“RPC_UNSUPPORTED_NETIFS=<unused_network_adapter(冒号间隔)>”。其中unused_network_adapter为RPC不用的网卡名。可使用“netstat -in”或者“ifconfig -a”观察网卡配置。#例:RPC_UNSUPPORTED_NETIFS=en1:en2 • HACMP环境中配置网卡在切换后接管新的IP地址,有可能原来被屏蔽的网卡在切换后被RPC重新使用,这时可以使用RPC_UNSUPPORTED_NETADDRS环境变量指定被屏蔽的IP地址,而不是屏蔽网卡。设置“RPC_UNSUPPORTED_NETADDRS=<unused_network_address(冒号间隔)>”。其中unused_network_address为RPC不用的网络地址(DCE3.2支持)。#例:RPC_UNSUPPORTED_NETADDRS=9.181.3.189:10.0.2.157 • 在HP-UX环境下: • RPC_SUPPORTED_NETIFS环境变量指定被使用的网卡,规定RPC把服务绑定在使用的网卡上。设置“RPC_SUPPORTED_NETIFS=<used_network_adapter(冒号间隔)>”。其中used_network_adapter为RPC用的网卡名。可使用“netstat -in”或者“ifconfig -a”观察网卡配置。#例:RPC_SUPPORTED_NETIFS=if_0:if_1 • HACMP环境中配置网卡在切换后接管新的IP地址,有可能原来被屏蔽的网卡在切换后被RPC重新使用,这时可以使用RPC_SUPPORTED_NETADDRS环境变量指定被使用的IP地址,而不是屏蔽网卡。设置“RPC_SUPPORTED_NETADDRS=<used_network_address(冒号间隔)>”。其中used_network_address为RPC用的网络地址。#例:RPC_SUPPORTED_NETADDRS=9.181.3.189:10.0.2.157
调节磁盘I/O的通用做法 • 在AIX上,可以采用“filemon -o <文件名>”和“trcstop”命令观察逻辑卷使用的频率。 • 建立独立的文件系统 • /var/cics_servers • /var/cics_regions • /var/cics_regions/<REGION>/log 注:使用CICS两阶段提交会大量使用/var/cics_regions/<REGION>/log,为它建立单独的逻辑卷或盘阵。 • 使用RAM Disk缓存常用的文件系统,比如log,或者EasyCICS缓冲区。 • 经常调用的程序要驻留内存。
EasyCICS v2.28使用文件系统作为缓存的设置步骤示例 • 创建供EasyCICS使用的缓存文件系统mkdir /var/cicstmpchown -R cics:cics /var/cicstmp • 在Region的environment文件中加入:(如果不加入此项,则还是使用TSQ)ECB_DIR=/var/cicstmp • 使用自动保护/清理程序:参见ecbuf的readme文件 • 1) 编译:cc -o ecbuf ecbuf-unix.c • 2) 在后台执行之:nohup ./ecbuf /var/cicstmp 1800 & • 如果使用了多Region的ISC:(单Region不需要此步骤) • 1) 按照EasyCICS的全局配置规则配置CD等 • 2) 定义ECB程序make -f ecb.unix.mkcicsadd -c pd -r ... ECB PathName="..." RSLKey=public
EasyCICS v2.28使用AIX的RAMDisk作为缓存的设置步骤示例 • 创建供EasyCICS使用的RAMDiskmkramdisk 1500Mls -l /dev | grep rammkfs -V jfs /dev/ramdisk0mkdir /var/cicstmpmount -V jfs -o nointegrity /dev/ramdisk0 /var/cicstmpchown -R cics:cics /var/cicstmp#注:如果要删除该RAMDiskrmramdisk ramdisk0 • 在Region的environment文件中加入:(如果不加入此项,则还是使用TSQ)ECB_DIR=/var/cicstmp • 使用自动保护/清理程序:参见ecbuf的readme文件 • 1) 编译:cc -o ecbuf ecbuf-unix.c • 2) 在后台执行之:nohup ./ecbuf /var/cicstmp 1800 & • 如果使用了多Region的ISC:(单Region不需要此步骤) • 1) 按照EasyCICS的全局配置规则配置CD等 • 2) 定义ECB程序make -f ecb.unix.mkcicsadd -c pd -r ... ECB PathName="..." RSLKey=public
内存使用和减少磁盘I/O相关的调节 • 调节内存池 • 使用CSTD观察。 • MaxRegionPool与并发和吞吐量相关。典型值:40M-120M • MaxTSHPool。与并发和吞吐量,以及是否使用CICS共享内存相关。典型值:10M-??M • MaxTaskPrivatePool与应用是否使用CICS私有内存相关。典型值:1M-??M • 缓冲常用的程序: • 设置RD:ProgramCacheSize为1个cicsas最多可以缓存的程序数。 • 设置PD:Resident=yes • 更新被缓存的程序的方法是“CEMT SET PROGRAM NEWCOPY”
内存使用和减少磁盘I/O相关的调节(续) • RD:ClassTableSize设置CD, FD, PD, RD, TSD, WD, TD, TDD, XAD,UD, MD, JD, LD, GD, OD5, 50, 50, 1, 50, 50, 50, 20, 5, 50, 1, 20, 5, 5, 20| || -- PD--2 X 客户连接数 • Use Hash Buckets • RD:TasksSHNumBuckets: • size of hash table to find everything else in task shared pool (TS/TD, CWA, Shared Getmain, TCTUA). • Default is 512. Keep same or make TasksSHNumBuckets 10x bigger. • RD:LoadDataNumBuckets: size of hash table to find maps & tables in task shared pool.
如何调整CICS应用服务器的并发度 • 针对不同的环境(CPU、内存、硬盘、网络、操作系统、数据库、开发工具)和应用,通过测试来确定最佳的RD:MaxServer设置。 • 适当增加cicsas数,可以充分利用多CPU的性能,提高整体的吞吐量。 • 对于主要用于IO通信以及网关类应用的CICS域,应该增大MaxServer数。 • 应用服务器个数增加,即数据库的并发用户数增加,数据库的响应性能就可能会相应下降。 • 限制应用服务器个数的第二个原因是操作系统调度进程的开销会随着总进程数的增加而增加。 • 例如可以通过CST3,观察以下几个统计数值:Num Trans Started (本统计期内运行事务总数,可以计算出事务平均处理量)Times AppServs Full (应用服务器个数不足以致事务请求要排队等待的次数,可以判断出应用服务器是否严重不足)Peak Number Tasks (业务高峰期的事务处理量) • 通常设置RD:MinServer=RD:MaxServer可以得到最佳的响应时间。但是可能造成两方面的害处: • 在系统闲时不能腾出内存给其它应用 • 如果应用有缺陷(比如内存泄漏等),会逐渐积累,成为更大的故障。 • 对于RD:MinServer!=RD:MaxServer的情况,适当增加RD:ServerIdleLimit,可以减少起停cicsas的次数,提高响应速度。 • 分成多个事务类,为每个事务类分别指定应用服务器个数和队列的限制。涉及的参数包括:RD:ClassMaxTasks, RD:ClassMaxTaskLim, TD:TClass, ECI_PARMS::eci_tpn
其它可调的CICS参数 • 间隔参数 • RD:IntrospectInterval默认为10(分钟),系统非常稳定后可设置为0。 • RD:CheckpointInterval默认为1000(记录),可以增大。 • WD:RecoverTerminal#例:cicsupdate -c wd -r CICS01 MDCL Permanent=no RecoverTerminal=nocicsupdate -c wd -r CICS01 MDCI Permanent=no RecoverTerminal=no
环境变量 • 通用: • CICS_PROGRAM_PATH=… • AIX: • CICS_NORTL_CICSAS=1 • AIXTHREAD_SCOPE=S • AIXTHREAD_MUTEX_DEBUG=OFF • AIXTHREAD_RWLOCK_DEBUG=OFF • AIXTHREAD_COND_DEBUG=OFF
使用Timeouts避免长时间等待 • EciTimeout (s)The time in seconds to wait for a response from the CICS server. • (对CICS_TCP:) TD:Timeout (m)Conversational timeout value (mins) - This attribute specifies, in minutes, how long CICS waits for terminal input when running this transaction. • TD:DeadlockTimeout (s)This attribute specifies, in seconds, how long CICS allows the transaction to wait when CICS has detected a possible deadlock. • (对PPC_TCP, PPC_GATEWAY:) CD:AllocationTimeout (s)Specifies how many seconds a front-end transaction waits for a back-end transaction to be started over a communications link. • RD:XPRecvTimeout (s)。(对TXSeries v4.2,使用CICS_XP_RECV_TIMEOUT)This attribute specifies the interval in seconds that CICS waits before timing out ComSU_XPRecv calls. • (对LOCAL_SNA:)CICS_SNA_RECEIVE_TIMEOUT (s)在region的environment文件中设置此环境变量,格式如下:CICS_SNA_RECEIVE_TIMEOUT="SYS1,N1,SYS2,N2,SYS3,N3,SYS5,N5,. . .SYSn,Nn"
EciTimeout • ECI超时后返回-6,服务器10秒中内Force Purge程序产生A147。 • 如果使用扩展调用,且返回了LUW Token,即使返回ECI非0,也要主动进行提交或回滚。否则服务器cicsas一直等待。
TD:Timeout • TD:Timeout与EciTimeout不同。TD:Timeout对本地程序的运行时间没有约束,只针对会话间隔的时间。强制停止本地交易只能使用force purge。 • TD:Timeout + CICSTCP + LINK • 主调方调用后,等待达到TD:Timeout时,远程程序还正在执行主调方:ReturnCode=81 (TERMERR),15a00007/8640000被调方:10秒后发生A147 • 主调方调用后,等待达到TD:Timeout时,远程程序还在队列中:主调方:ReturnCode=81 (TERMERR),15a00007/8640000被调方:无信息 • 如果达到被调域的请求队列的限制数,直接被Reject:主调方(CICSTCP):ReturnCode=81 (TERMERR),15a00007/84b6031主调方(PPCTCP):ReturnCode=53 (SYSIDERR),15a00002/15a00102被调方:无信息 • 如果客户机/远端域使用扩展调用调用本地域程序,设置服务程序被调用的时间间隔超时(发生ATNI)。#注:不计算服务程序本身的运行时间。 • TD:Timeout对PPCTCP, LocalSNA, PPCGateway不起作用。
CD:AllocationTimeout • CD:AllocateTimeout属性(默认60秒)是PPCTCP做CICS LINK调用时等待被调用方分配cicsas的最大时间 • 如果被调方AS全忙,则导致连接超时请求仍在远端域请求队列:主调方:ReturnCode=53 (SYSIDERR),15a00003/15a00109被调方:等待直到可以执行请求时,有5次重试(间隔2秒),WIN返回10061,UNIX system error 79(ECONNREFUSED),10秒后发生A141和15a00007/a0000100。为防止此错误,可以增加CD:AllocateTimeout,或者增加被调方AS数。#注:由于被调方忙,请求进入队列,无论如何都会产生AllocateTimeout,导致主调方永远超时。这是因为完成调用的时间赶不上队列积累的时间。
调节SFS参数 • 修改SSD(/var/cics_servers/SSD/SSD.stanza),例: • BufferPoolSize=20000 //缺省1000,单位1024 • OpThreadPoolSize=60 //缺省12,优化配置到并发使用SFS的最大AS数加1。 • ResThreadPoolSize=15 //原:3 • Checkpoint=25000 //原:5000
调节PPCGateway • 调节线程池 • 调节GSD:ThreadPoolSize。默认为10,可增大。
数据库访问 • 减少全局交易 • Use one phase Switch Load File for XAD • To relieve the workload of RPC, I suggest they use CICSTCP instead of PPCTCP if they have already changed everything to one phase commit. • Change "CICS LINK" to "CICS LINK SYNCONRETURN". If there are DB manipulations before "CICS LINK", Make sycpoint before "CICS LINK" if possible. • Use ECI_NO_EXTEND instead of ECI_EXTENDED if possible. • 减少锁定的影响 • 降低隔离级别 • 提交次数 • 减少锁定的时间 • 采用动态XA,减少锁 • 尤其减少跨服务器节点的锁。
CICS通信区要用NULL填充 abcd : LINKAGE SECTION 01 DFHCOMMAREA PIC X(500). : : LINK PROGRAM (abcd) COMMAREA (comm) LENGTH (500) : 0 20 21 500 500 bytes received Data x’00’ 500 bytes sent 20 bytes transmitted LESS DATA TRANSMITTED • 使用二进制0清空CICS通信区 • 在LINK时使用DATALENGTH属性。
其它注意事项 • Disable EDFcicstran -l <lang> -e <file>Avoid -e option to reduce overhead of EDF check on every CICS API call • 数据库调节最关键 • 适当使用Main取代Aux的TSQ;尽量使用Unrecoverable的资源。
TXSeries负载均衡和高可用性的实现方法 • 硬件的实现 • 应用级实现 • CTG/CUC的工作负载管理器 • CTG/CUC的用户出口程序 • 通过MQ集群的实现 • TXSeries目前的集群实现