问题现象
•环境描述
−双节点的RAC集群,OS版本:AIX 7.2TL3SP3,Oracle版本 18.6
•异常描述
−在任意一个节点shutdown abort本节点的instance时:
1) 通过SCAN服务尝试连接的客户端会hang;
2)通过另一节点VIP服务尝试连接的客户端也会hang;
3)已连接的session查询、insert等操作正常,但commit的时候就会hang;
4)alert log日志中,有如下信息:
Warning: 434 processes are still attacheded to shmid 214959281:
−从系统层面看,在一个节点进行oracle shutdown abort后,进程很快被停止,但共享内存的释放却花了不少时间。用ipcs -mab可以看到系统释放共享内存的过程。在434个进程的情况下,共享内存释放耗费了大概2分钟,这个过程结束后,客户端接入正常。若进程更多,则等待需要更长的时间。
−因此,主要问题在于:在一个节点的instance异常的情况下,导致了整个业务系统的核心数据库异常挂起达数分钟之久,将严重影响业务的连续性,需要予以解决。
数据收集
•1. 找一个10G的空闲空间比如/tmp/trace,cd到该目录,开启trace
#trace -anl -d -C all -T10000000 -L20000000 -o trace.raw
•2. 收集进程信息,并trcon开始记录,并重现oracle shutdown abort 耗时30秒问题:
#ps -ekf >> psb.ekf.out
#trcon
重现Oracle shutdown abort慢问题
•3. 重现完成之后,停止trace
#trcstop
#ps -ekf >> psa.ekf.out
•4. 取回如下信息:
#/bin/trcnm > trace.nm
•取回"trace.nm", "/etc/trcfmt", "/tmp/trace"目录下的trace/ps文件.
•视乎系统活动状况,trace文件压缩前大小可能在数百兆或数千兆不等;按分区20个VP,160个逻辑cpu(SMT8)计算,trace文件压缩前的总大小不超过3200MB;
分析结论
•对所抓取系统跟踪文件的分析和建议,从中可以发现:
−在oracle实施shutdown abort操作后,oracle进程一直在申请、释放VMM relalias内存锁(F1000C0020825CF8,与共享内存相关);虽然锁冲突造成的重试并不高,但单个进程的锁等待时间极长,常常超过3秒。
•这一定程度造成了shutdown immediate/abort 时,oracle进程detach共享内存速度较慢。
•从现象看,此问题与一个旧APAR相关(需要激活其改进措施):
IV34380: VMM RELALIAS LOCKING TUNABLE TO IMPROVE MMAP/UNMAP PERFORMANCE APPLIES TO AIX 7100-02
https://www-01.ibm.com/support/docview.wss?uid=isg1IV34380
•
•因此,建议修改如下参数,减少锁冲突:
# vmo -p -o force_relalias_lite=1
Setting force_relalias_lite to 1 in nextboot file
Setting force_relalias_lite to 1
经过验证,vmo参数修改后,oracle shutdown abort造成业务hang住数分钟的问题得到解决。
内存vmo参数force_relalias_lite说明
# vmo -h force_relalias_lite
Help for tunable force_relalias_lite:
Purpose:
If set to 0, a heuristic will be used, when tearing down an mmap region, to determine when to avoid locking the source mmapped segment.
Values:
Default: 0
Range: 0, 1
Type: Dynamic
Unit: boolean
Tuning:
This is a scalability tradeoff, controlled by relalias_percentage, possibly costing more compute time used. If set to 1, the source segment lock is avoided whenever possible, regardless of the value of relalias_percentage.
附录:trace日志
数据库shutdown abort命令键入后,执行exit退出的oracle进程示例1:
数据库shutdown abort命令键入后,执行exit退出的oracle进程示例2: