在Oracle RAC环境中,节点间通信和资源争用是性能问题的高发区。我们经常会碰到节点通信和资源争用的问题,下面给出一个我经常用到的基于 ORADEBUG 和 CRSCTL 的深度排查流程,帮助定位问题根源:
一、节点间通信排查
1. 确认集群网络健康状态
- 检查私网配置
crsctl check cluster -all # 检查集群整体状态
crsctl status res -t -init # 查看网络资源(如ora.net1.network)状态
oifcfg getif # 查看网络接口配置(公网/私网)
- 验证节点间连通性
cluvfy comp nodereach -n all # 检查节点间通信
cluvfy comp network -n all # 验证网络配置一致性
2. 启用集群通信跟踪
- 跟踪CSS(Cluster Synchronization Service)
crsctl debug log css "CSSD:1" # 启用CSS组件跟踪(日志级别1-3)
crsctl debug trace css # 开始CSS跟踪
日志路径:$GRID_HOME/log//cssd/ocrcl*.log
- 跟踪节点心跳(ping监控)
crsctl debug log res ora.crsd:1 # 跟踪CRSD资源通信
crsctl debug log res ora.ctssd:1 # 跟踪时间同步服务
3. 分析通信延迟或丢包
- 使用系统工具
ping <私网IP> # 基础延迟测试
traceroute <私网IP> # 检查路由路径
netstat -s | grep -i "retransmit" # 查看TCP重传(丢包指标)
- Oracle网络诊断
ORADEBUG setmypid
ORADEBUG ipc # 查看IPC缓冲区使用情况
ORADEBUG gerc stack # 跟踪指定进程的IPC栈
二、资源争用排查
1. 全局资源争用(GCS/GES)
- 跟踪Global Enqueue Service (GES)
ORADEBUG setmypid
ORADEBUG event 10704 trace name context forever, level 15 -- 跟踪全局锁操作
日志路径:$ORACLE_BASE/diag/rdbms///trace/*.trc
- 分析Global Cache Service (GCS)延迟
SELECT * FROM gv$cr_block_server; -- 查看块服务进程状态
SELECT * FROM gv$ges_enqueue; -- 查看全局锁队列
2. 集群资源状态监控
- 查看资源争用历史
crsctl status res -v -f # 显示资源详细状态及失败历史
crsctl debug log res "ora..db:1" # 跟踪特定资源(如ora.prod.db)
- 启用资源操作跟踪
crsctl trace res ora.scan1.vip -f # 跟踪VIP资源操作
3. 诊断锁争用(Enqueue/LM)
- 动态性能视图
SELECT * FROM gv$enqueue_stat WHERE eq_type = 'US'; -- 查看用户级锁统计
SELECT * FROM gv$lock WHERE block=1; -- 查找阻塞锁
- ORADEBUG高级跟踪
ORADEBUG setmypid
ORADEBUG event 10046 trace name context forever, level 12 -- SQL跟踪
ORADEBUG event 10200 trace name context forever, level 1 -- 跟踪锁分配
三、日志收集与分析
1. 关键日志文件
- Clusterware日志
$GRID_HOME/log//agent/ohasd/oraagent_oracle.trc
$GRID_HOME/log//crsd/crsd.trc
- 数据库实例日志
$ORACLE_BASE/diag/rdbms///trace/alert_.log
2. 使用DIAGCOLLECT工具
diagcollection.pl --collect --crshome $GRID_HOME --incidenttime <时间范围> # 统一收集集群诊断包
四、常见问题案例
案例1:节点驱逐(Node Eviction)
- 现象
:节点频繁被踢出集群。
- 排查
crsctl lsmodules css # 检查CSS模块状态
grep -i "evict" $GRID_HOME/log//cssd/ocssd.log # 搜索驱逐记录
案例2:GC Buffer Busy
现象
:gc buffer busy 等待事件频发。
排查
SELECT * FROM gv$session WHERE event='gc buffer busy';
ORADEBUG tracefile_name # 确认跟踪文件路径
五、注意事项
- 谨慎使用跟踪工具
:高粒度跟踪(如level 15)可能快速生成GB级日志,建议在Oracle Support指导下操作。
- 时间同步
:确保所有节点时间同步(使用cluvfy comp clocksync验证)。
- 网络优化
:私网建议使用专用高速网络(如InfiniBand),启用Jumbo Frames。
通过上述方法,可系统化定位通信瓶颈或资源争用点,结合AWR/ASH报告进一步关联分析