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 controlled或messages 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 sent和ges 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 converts和gcs 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集群性能问题的重要工具。在分析时,建议关注以下几个关键指标:
- 消息流量控制:
messages flow controlled高表示网络拥塞 - 锁转换阻塞:
gcs blocked converts和gcs queued converts高表示锁争用严重 - 动态资源分配:
dynamically allocated gcs resources/shadows持续增长可能是Bug - 消息处理时间:GCS/GES消息平均处理时间过长表示LMS负载过高
- 队列等待时间:发送/接收队列等待时间过长表示互联网络或进程处理能力不足
结合V$GCS_STATISTICS、V$DLM_MISC等视图,可以更全面地分析RAC集群的健康状况。
相关视图:
V$GES_STATISTICS的底层数据来自内部视图X$KJISFT。如需更底层的调试信息,可在Oracle Support指导下查询该视图。