如何诊断RAC系统中的gc cr multi block request

本文详细解析了GCCRMultiblockRequest等待事件的产生原因及解决方法,包括数据库参数设置、OS相关参数配置、网络状况及LMS进程检查,并提供了诊断步骤与建议。

'gc cr multi block request' 是RAC数据库上比较常见的一种等待事件,在RAC 上进行全表扫描(Full Table Scan)或者全索引扫描(Index Fast Full Scan)时,容易产生这样的多块读等待。

     这种等待产生的主要原因:
1. 数据库参数db_file_multiblock_read或者db_block_size设置太大,导致多块读时GC传输量太大;
2. OS上UDP相关的参数设置不够大导致接收发送UDP的缓存区溢出;
3. 私网性能;
4. LMS设置问题(个数不足或者不是实时运行(real time))导致LMS的处理能力不够,不能及时传输global cache data/message。

    这方面的Bug比较少,在11.2之前有一个BUG 8464597,当db_block_size = 32k时,引发大量"gc cr multi block request" 而且性能下降,这个Bug在11.2已经修复。
    很多情况下,降低DB_FILE_MULTIBLOCK_READ_COUNT 并且 加大OS UDP相关参数会将极大缓解'gc cr multi block request' 等待。

     最近处理了一个问题,从10.2升级到11.2.0.3后产生大量'gc cr multi block request' 等待,发现DB_FILE_MULTIBLOCK_READ_COUNT, UDP 参数等都没有改变,只是升级后LMS的个数在不同实例间不同而且下降了很多,后来把LMS个数增加并且各个实例值保持一致后,问题得到解决。

                                                                Avg
                                                          wait   % DB
Event                                 Waits     Time(s)   (ms)   time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
gc cr multi block request           632,923      32,441     51   35.5 Cluster
DB CPU                                           13,518          14.8
gc cr grant 2-way                   327,717      10,900     33   11.9 Cluster
gc current grant 2-way              190,856       6,855     36    7.5 Cluster
gc current block 2-way              101,154       3,792     37    4.1 Cluster


如果发现AWR TOP5 等待中存在'gc cr multi block request' 而且它的Avg wait(ms)较高,那么请参考下面的诊断步骤:


第一步,查看db_file_multiblock_read_count和db_block_size参数设置。

SQL>show parameter db_block_size
SQL>show parameter db_file_multiblock_read_count

db_block_size一般为8192, db_file_multiblock_read_count一般为16. 

第二步,参看OS udp相关参数设置,udp 的参数在不同的OS上是不同的,这些参数会设置UDP的接收缓存区和发送缓存区的大小,一般来说接收缓存区要>=发送缓存区。 如果在生产库修改这些参数,最好咨询OS厂商了解注意事项。

AIX上:

#no –a
                udp_recvspace
                udp_sendspace

o 设置udp_sendspace >=[(DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT) + 4096],但是不低于 65536. 
  比如,DB_BLOCK_SIZE=8192, DB_FILE_MULTIBLOCK_READ_COUNT=16,那么udp_sendspace>= (8192 * 16) + 4096=135168.注意这个值只是最低值,并不是Oracle要求必须设置这么大。
o 设置udp_recvspace 为 4到10倍 udp_sendpace
o 由于sb_max 必须 >= udp_recvspaceIf ,可能需要增加sb_max的值(默认为1048576)
o 如果udp的参数设置不合理,可能会产生“socket buffer overflows”,如果这个值非0, 需要增加udp_recvspace:
 netstat -s | grep "socket buffer overflows" 
o 参考资料:http://www-03.ibm.com/support/techdocs/atsmastr.nsf/WebIndex/WP100883
  Minimum Software Versions and Patches Required to Support Oracle Products on IBM Power Systems (Doc ID 282036.1)

Linux上:
#More /etc/sysctl.conf

net.core.rmem_default
net.core.rmem_max
net.core.wmem_default
net.core.wmem_max

官方文档上要求的最低值:
http://docs.oracle.com/cd/E11882_01/install.112/e24321/pre_install.htm#BABDAEDB
Oracle Database Installation Guide
11g Release 2 (11.2) for Linux
E24321-07
rmem_default     262144     
rmem_max     4194304 
wmem_default     262144     
wmem_max     1048576

可以将这几个值都设为4k:
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 4194304
net.core.wmem_max = 4194304

HP上:

请检查UDP设置是否足够大:
$ /bin/ndd -get /dev/sockets socket_udp_rcvbuf_default
$ /bin/ndd -get /dev/sockets socket_udp_sndbuf_default

确保socket_udp_rcvbuf_default至少是socket_udp_sndbuf_default的两倍。

Sun:
可以用下面的命令查看UDP设置:
ndd /dev/udp udp_xmit_hiwat
ndd /dev/udp udp_recv_hiwat
ndd /dev/udp udp_max_buf

可以用下面的命令设置这两个值为OS最大允许的:
ndd -set /dev/udp udp_xmit_hiwat
ndd -set /dev/udp udp_recv_hiwat
ndd -set /dev/udp udp_max_buf <1M or higher>

更多信息,可以参考MOS文档:
Tuning Inter-Instance Performance in RAC and OPS (Doc ID 181489.1)

第三步,查看网络情况。
比如用netstat -s 命令查看是否有bad data length, bad checksums, incomplete headers, socket buffer overflows等,注意这些值是累计的,需要查看它们在发生问题的时候是否有增加。
另外可以查看AWR中是否有 "Global Cache Blocks Lost" ,理想情况下这个值是0,如果有较大的block lost,说明网络有问题(按照MOS 文档563566.1进行网络检查)。
还可以请网管查看私网的性能情况。

第四步,检查LMS。
1. 查看LMS的trace file,查看是否有异常。
2. 查看LMS进程的优先级是否是实时的(real time)的?

比如AIX:
# ps -elf|grep lms

ps -elf|grep lms
F      S      UID      PID     PPID   C PRI NI ADDR    SZ    WCHAN    STIME    TTY  TIME CMD 
240103 A   oracle  4719002        1   5  39 -- 8ae40b590 248856            Jul 28      - 570:45 ora_lms0_rac1

priority 越小说明优先级越高,PRI小于40说明是Real Time的:
http://aix4admins.blogspot.co.uk/2011/08/commands-and-processes-process-you-use.html

3. 查看LMS的个数:
SQL>show parameter GCS_SERVER_PROCESSES
这个值决定了LMS的个数

这个值依赖于CPU的个数(cpu_count),根据11.2官方文档:
http://docs.oracle.com/cd/E11882_01/server.112/e25513/initparams094.htm#REFRN10259
Default value
If 1 - 3 CPUS, then 1
If 4 - 15 CPUs, then 2
If 16 or more CPUs, then 2 + (CPUs / 32). If the result includes a fraction, then the fraction is disregarded. For example, if you had 20 CPUs, then 2 + (20 / 32) would equal 2 GCS processes.
If CLUSTER_DATABASE is set to false, then 0
If ASM, then 1

在AIX上,有的时候CPU可能是动态增加的,那么一定要注意检查LMS进程的个数是否随之调整了。

### gc cr multi block mixed 等待事件的处理方法 `gc cr multi block mixed` 是 Oracle RAC(Real Application Clusters)环境中常见的全局缓存(Global Cache)等待事件之一。该事件表示在请求多个数据块的 CR(Consistent Read)副本时,部分数据块以“multi”模式请求,而另一些可能以其他方式获取,导致混合模式下的等待[^1]。 #### 1. **理解事件成因** - **多块请求机制**:Oracle 在某些情况下会尝试一次性请求多个数据块来提高效率,特别是在全表扫描或索引范围扫描等操作中。 - **跨节点访问**:在 RAC 架构中,当一个实例需要读取的数据块当前被另一个实例持有时,必须通过私网通信请求该数据块的 CR 副本。 - **网络延迟或拥塞**:如果私网带宽不足、网络延迟较高或存在丢包现象,则可能导致 `gc cr multi block mixed` 等待时间增加[^2]。 #### 2. **性能影响分析** - 当该等待事件频繁出现时,可能表明: - 私网通信效率低下; - 数据块争用严重; - SQL 执行计划不合理,导致大量跨节点 I/O 请求; - 缓存融合(Cache Fusion)过程存在瓶颈。 #### 3. **优化建议** ##### (1) **检查私网网络状况** 确保 RAC 节点之间的私网连接稳定且低延迟,推荐使用高速、低延迟的专用网络(如 InfiniBand 或千兆以太网)。可以通过以下方式验证: - 检查操作系统层面的网络统计信息(如 `netstat -s`、`ifconfig` 或 `ip link`); - 使用 `ping` 或 `traceroute` 检测节点间网络延迟; - 查看 `v$system_event` 中 `SQL*Net message from client` 和 `gc cr multi block mixed` 的平均等待时间是否异常。 ##### (2) **优化 SQL 和执行计划** - 对于频繁触发该等待事件的 SQL,应审查其执行计划,避免不必要的全表扫描; - 尝试使用更高效的索引访问路径; - 可通过 `SQL Tuning Advisor` 进行自动调优; - 合理使用并行查询(Parallel Query),但需注意并行度设置过高可能加剧全局缓存争用。 ##### (3) **调整参数配置** - **_gc_multi_block_read_count**:控制一次请求的最大块数,默认值通常为 4。适当增大该值可减少请求次数,但需结合系统负载测试验证效果。 - **_gc_buffer_wait_ratio**:用于控制缓冲区等待的比例,若发现较多 buffer busy waits,可适当调整此参数。 - **_gc_policy_time**:控制动态资源分配的时间窗口,较短的值有助于快速响应负载变化。 ##### (4) **监控和诊断工具** - 使用 AWR 报告分析高峰时段的等待事件分布; - 查看 `v$session_wait` 和 `v$system_event` 获取实时等待信息; - 使用 `gv$cr_block_server` 和 `gv$current_block_server` 视图监控块请求来源与目标节点; - 利用 Oracle Enterprise Manager Cloud Control 或 Grid Control 进行可视化分析。 ##### (5) **数据分布与分区策略** - 如果某些表或索引频繁在不同节点之间迁移,考虑采用本地分区(Local Partitioning)策略,使数据访问尽量在同一节点完成; - 避免热块争用,可通过散列分区或复合分区减少热点。 #### 示例:查看相关等待事件 ```sql SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event LIKE 'gc cr multi%'; ``` #### 示例:查看当前会话等待状态 ```sql SELECT sid, event, wait_time, seconds_in_wait FROM v$session_wait WHERE event LIKE 'gc cr multi%'; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值