GES(Global Enqueue Services,全局队列服务)是Oracle RAC中的核心组件之一,与GCS(Global Cache Services,全局缓存服务)共同构成了Cache Fusion的基础架构。V$GES_STATISTICS动态性能视图汇聚了主要的GES/GCS统计信息,是诊断RAC集群间通信和锁管理问题的重要工具。

本文将V$GES_STATISTICS中的75个统计项按功能分类整理,并提供中英文对照说明,帮助DBA快速定位RAC性能问题。

数据来源:V$GES_STATISTICS的底层数据来自内部视图X$KJISFT。本文基于Oracle 10.2.0.1.0版本整理。

一、消息发送与接收统计

这组统计项反映了RAC节点间的消息通信情况,是判断集群互联网络(Interconnect)性能的关键指标。

ID 统计项名称 说明
0 messages sent directly 进程成功直接发送消息到远程实例的次数(未被阻塞、无流量控制)
1 messages flow controlled 因可用tickets不足而无法直接发送消息的次数
2 messages sent indirectly 间接发送的消息数。可能原因:被要求流量控制、之前发往同一目标节点的消息失败、GCS/GES操作被冻结
3 messages received logical LMS接收到的逻辑消息数(来自远程或本地客户端)
61 messages received actual LMS从远程实例接收的实际消息数。单个实际消息可包含多个逻辑消息(批量发送)
4 flow control messages sent 发送的流量控制消息数
5 flow control messages received 接收的流量控制消息数

诊断要点:如果messages flow controlledmessages sent indirectly数值较高,说明集群互联网络可能存在拥塞,需检查网络带宽和延迟。

二、GCS/GES消息处理统计

这组统计项反映了GCS(缓存融合)和GES(全局锁)消息的处理情况。

ID 统计项名称 说明
6 gcs msgs received 接收的GCS消息数
7 gcs msgs process time(ms) GCS消息处理总时间(毫秒)
8 ges msgs received 接收的GES消息数
9 ges msgs process time(ms) GES消息处理总时间(毫秒)

计算平均处理时间:

GCS平均处理时间 = gcs msgs process time(ms) / gcs msgs received
GES平均处理时间 = ges msgs process time(ms) / ges msgs received

三、LMD/LMS进程消息统计

LMD(Lock Manager Daemon)和LMS(Lock Manager Server)是RAC中处理全局锁和缓存融合的关键后台进程。

ID 统计项名称 说明
10 msgs causing lmd to send msgs 导致LMD发送消息的请求数
11 lmd msg send time(ms) LMD发送消息的总时间(毫秒)
65 msgs causing lms to send msgs 导致LMS发送消息的请求数
66 lms msg send time(ms) LMS发送消息的总时间(毫秒)

注意:这些统计项记录的是"导致发送消息的请求数",而非实际发送的消息数。例如,LMS收到一个请求后可能发送4条消息,但统计值只增加1。要获取LMS实际发送的消息数,需查询V$SESSTAT中对应LMS会话的gcs messages sentges messages sent

四、Side Channel消息统计

Side Channel用于确保CR块或当前块传输的可靠性。

ID 统计项名称 说明
12 gcs side channel msgs actual 发送到其他节点的实际Side Channel消息数
13 gcs side channel msgs logical 从本节点传输到其他节点的块数(逻辑消息数)

技术说明:当发送CR块或当前块时,发送方会额外发送一条可靠消息通知接收方(如"我已发送100个块")。参数_side_channel_batch_size定义单条消息中包含的Side Channel消息数。对于可靠的IPC技术(如RSM、HyperFabric),该值应为0;对于不可靠的IPC技术(如UDP),该值应增大。

五、GCS锁转换统计

这组统计项反映了GCS锁的授予和转换情况,是分析Cache Fusion性能的核心指标。

立即授予(Immediate Converts)

ID 统计项名称 说明
18 gcs immediate (null) converts NULL锁立即授予次数
19 gcs immediate cr (null) converts CR请求的NULL锁立即授予次数
20 gcs immediate (compatible) converts 共享锁立即授予次数
21 gcs immediate cr (compatible) converts CR请求的共享锁立即授予次数

阻塞和排队(Blocked/Queued Converts)

ID 统计项名称 说明
22 gcs blocked converts 锁无法立即授予,位于转换队列头部的次数
23 gcs queued converts 锁无法立即授予,且转换队列中存在冲突锁的次数
24 gcs blocked cr converts CR请求因锁正在转换或处于排他模式而无法授予的次数

诊断要点:gcs blocked convertsgcs queued converts数值高表示存在严重的锁争用,需分析热点块和应用设计。

六、BAST(Blocking AST)统计

BAST是阻塞异步陷阱,当锁请求与现有持有者冲突时触发。

ID 统计项名称 说明
25 gcs compatible basts 发送给兼容锁持有者的BAST数
26 gcs compatible cr basts (local) CR请求可授予锁,BAST发送给本地角色的持有者
60 gcs compatible cr basts (global) 锁请求兼容,但因块全局脏而无法从磁盘读取
27 gcs cr basts to PIs CR请求发送到持有满足条件的PI缓冲区的实例

七、GCS拒绝与错误统计

ID 统计项名称 说明
14 gcs pings refused Master节点发送BAST到Holder节点,但Holder无法处理(通常因块不存在或ping队列已满)
15 gcs writes refused 写请求被拒绝次数(RAC中全局脏块的写入由GCS协调)
16 gcs error msgs 因竞态条件导致的错误消息数(通常需要发送额外消息解决)
17 gcs out-of-order msgs 直接发送时,来自同一实例的两条消息在Master节点乱序到达的次数
37 gcs retry convert request 因竞态条件导致转换请求需要重试的次数

八、GCS资源动态分配统计

ID 统计项名称 说明
28 dynamically allocated gcs resources 实例启动后动态分配的GCS资源数
29 dynamically allocated gcs shadows 实例启动后动态分配的GCS shadows数

重要提示:这两个值正常情况下不应持续增长。如果持续增长,可能是内存泄漏或默认资源不足。可通过隐含参数_gcs_resources_gcs_shadows调整默认值,但应视为Bug并联系Oracle支持。

九、CR块与Undo块统计

ID 统计项名称 说明
38 gcs regular cr 数据块的CR请求数
39 gcs undo cr Undo块的CR请求数
48 gcs forward cr to pinged instance CR请求转发到正在转换GCS资源的实例
49 gcs cr serve without current lock 由不持有当前锁的实例服务的CR块数

十、脏块写入与PI缓冲区统计

这组统计项与全局脏块(XCUR)和过去映像(PI)缓冲区的刷新相关。

ID 统计项名称 说明
32 gcs dbwr write request msgs DBWR写请求消息数
33 gcs dbwr flush pi msgs DBWR刷新PI缓冲区消息数
34 gcs lms write request msgs LMS写请求消息数
35 gcs lms flush pi msgs LMS刷新PI缓冲区消息数
36 gcs write notification msgs 写入完成通知消息数

工作流程:刷新PI缓冲区时,需请求Master节点写入全局缓存中最新的块副本(write request msgs)。写入完成后,全局缓存中的PI缓冲区可被清除(flush pi msgs),并向Master节点发送写入完成通知(write notification msgs)。

十一、Assume统计

ID 统计项名称 说明
40 gcs assume no cvt 转换队列为空时处理的Assume数
41 gcs assume cvt 转换队列非空时处理的Assume数

十二、SCN广播与提交统计

这组统计项与RAC中的SCN同步(MCPD=0时)相关。

ID 统计项名称 说明
42 broadcast msgs on commit(actual) 提交时发送的SCN更新消息数(实际)
43 broadcast msgs on commit(logical) 提交时发送的SCN更新消息数(逻辑,可能被捎带)
44 broadcast msgs on commit(wasted) 发送的SCN更新消息可能浪费(接收方可能已更新SCN)
45 acks for commit broadcast(actual) 提交广播的确认数(实际)
46 acks for commit broadcast(logical) 提交广播的确认数(逻辑)
47 false posts waiting for scn acks 误认为MCPD广播完成而唤醒LGWR的次数

十三、消息队列统计

这组统计项反映了消息在发送和接收队列中的等待情况。

ID 统计项名称 说明
50 msgs sent queued 通过发送队列发送的逻辑消息数
51 msgs sent queue time (ms) 发送队列等待时间(毫秒)
52 msgs sent queued on ksxp 在KSXP层排队的消息数
53 msgs sent queue time on ksxp (ms) KSXP层排队时间(毫秒)
54 msgs received queue time (ms) 消息从实际接收到开始处理的等待时间
55 msgs received queued 接收队列中的消息数(逻辑)

计算平均排队时间:

发送队列平均等待时间 = msgs sent queue time (ms) / msgs sent queued
接收队列平均等待时间 = msgs received queue time (ms) / msgs received queued

十四、消息批处理统计

ID 统计项名称 说明
56 implicit batch messages sent 隐式批量发送的消息数
57 implicit batch messages received 隐式批量接收的消息数
62 process batch messages sent 批量发送的消息数(实际)
63 process batch messages received 批量接收的消息数
64 messages sent pbatched 通过进程批处理发送的消息数(逻辑)
72 messages sent not implicit batched 未进行隐式批处理的间接发送消息数
73 messages queue sent actual 由发送代理间接发送的实际消息数
74 messages queue sent logical 由发送代理间接发送的逻辑消息数(含嵌入式批处理)

技术说明:10g中的进程批处理用于多块读取、newing、接收方直接发送(LMD0、LMS*、LMON)和Fusion写入(DBW*)。

十五、索引分裂相关统计(9iR2+)

ID 统计项名称 说明
58 gcs refuse xid 因索引分裂进行中而拒绝处理的锁请求数
59 gcs ast xid 因索引分裂而取消的锁请求数

十六、全局Post统计

这组统计项与AQ(Advanced Queuing)的全局Post机制相关。

ID 统计项名称 说明
67 global posts requested AQ请求发送到其他实例的全局Post数
68 global posts dropped 因缓冲区空间不足而丢弃的Post数
69 global posts queued 排队等待发送到其他实例的Post数
70 global posts sent 实际发送到其他实例的Post数
71 global posts queue time Post从排队到发送的时间差

十七、其他统计项

ID 统计项名称 说明
30 gcs recovery claim msgs 本实例处理的恢复认领消息数
31 gcs indirect ast 发送给LMS而非前台进程的AST数

实战:查询GES统计信息

-- 查看所有GES统计信息
SELECT statistic#, name, value
FROM v$ges_statistics
WHERE value > 0
ORDER BY statistic#;

-- 查看消息发送效率
SELECT 
    (SELECT value FROM v$ges_statistics WHERE name = 'messages sent directly') as direct_msgs,
    (SELECT value FROM v$ges_statistics WHERE name = 'messages flow controlled') as flow_ctrl_msgs,
    (SELECT value FROM v$ges_statistics WHERE name = 'messages sent indirectly') as indirect_msgs
FROM dual;

-- 计算GCS消息平均处理时间
SELECT 
    ROUND((SELECT value FROM v$ges_statistics WHERE name = 'gcs msgs process time(ms)') /
          NULLIF((SELECT value FROM v$ges_statistics WHERE name = 'gcs msgs received'), 0), 2) 
    AS avg_gcs_process_time_ms
FROM dual;

-- 查看锁转换效率
SELECT name, value
FROM v$ges_statistics
WHERE name LIKE 'gcs%converts'
ORDER BY value DESC;

写在最后

V$GES_STATISTICS是诊断RAC集群性能问题的重要工具。在分析时,建议关注以下几个关键指标:

  1. 消息流量控制messages flow controlled高表示网络拥塞
  2. 锁转换阻塞gcs blocked convertsgcs queued converts高表示锁争用严重
  3. 动态资源分配dynamically allocated gcs resources/shadows持续增长可能是Bug
  4. 消息处理时间:GCS/GES消息平均处理时间过长表示LMS负载过高
  5. 队列等待时间:发送/接收队列等待时间过长表示互联网络或进程处理能力不足

结合V$GCS_STATISTICSV$DLM_MISC等视图,可以更全面地分析RAC集群的健康状况。

相关视图:V$GES_STATISTICS的底层数据来自内部视图X$KJISFT。如需更底层的调试信息,可在Oracle Support指导下查询该视图。