Global Cache Miss

本文深入探讨了Oracle RAC环境中数据库集群经常遇到的全球缓存丢失警告问题,并提供了针对性的解决方案。主要内容包括:确保UDP缓冲区大小合理,避免网络性能下降;调整UDP接收缓冲区大小,解决包丢失问题;增加碎片重组缓冲区,减少重组失败;优化网络性能,防止节点被逐出;以及通过分区和应用隔离减少热块传输。通过实施这些策略,可以显著提升集群的整体稳定性和性能。

最近数据库集群通过spotlight监控经常报一些警告:
global cache 总是有Miss的情况
Alarm raised 80.98 milliseconds latency across the interconnect. Average : 27.19 ms (averaged over 30 seconds)HighCluster latency (Interconnect Latency)

通过查找官方文档,发现如下:
确保 UDP 缓冲区大小合适
适用平台: Windows 除外的所有平台

原因: 私网可以说是 RAC 数据库的命脉。但是,如果未向 UDP 分配合适的缓冲空间用以发送和接收缓冲,则私网的性能将大幅降低。这将会导致您的集群出现稳定性问题。

更多信息:有关正确调整 UDP 缓冲区的更多信息,请参考以下文档:
Document 181489.1 Tuning Inter-Instance Performance in RAC and OPS
Document 563566.1 gc lost blocks diagnostics

注意: Windows 集群对 Cache fusion 通信使用 TCP,因此,UDP 缓冲区设置不适用于 Windows。

概要:
在oracle rac环境中,RDBMS收集global cache的工作负载情况,这个情况会在STATSPACK、AWR、GRID CONTROL中被报告。集群中每个节点的全局内存块丢失状态(gc cr block lost" and/or "gc current block lost")都代表着网络中包交互的问题。这样的状态都应该被监控以及评估一确保GCS/GES网络效率。任何的块丢失会标明网络包传输中的问题并且应该被研究。
绝大部分的global cache 块丢失都可以被联系到时网络错误配置的原因导致的。文件服务指南可以评估和查询到这行原因。
即使大多数的讨论集中于性能问题上,它也可能导致一个节点被逐出。oracle集群依赖于心跳机制来确认节点资格。如果网络心跳经常性的被drop,节点被逐出就会发生。以下状况会导致节点被逐出:

主要:"gc cr block lost" / "gc current block lost" in top 5 或者重大的等待事件
次要:
SQL traces report multiple gc cr requests / gc current request /
gc cr multiblock requests with long and uniform elapsed times
Poor application performance / throughput
Packet send/receive errors as displayed in ifconfig or vendor supplied utility
Netstat reports errors/retransmits/reassembly failures
Node failures and node integration failures
Abnormal cpu consumption attributed to network processing

注意:块丢失问题经常伴随着gc cr multiblock waits,例如:waits for scans of consecutive blocks

全局块丢失诊断导引:

1、错误或不可靠的线缆/网卡/转换器的配置连接 --这个很好检查,这里不做讨论。
2、不合理的UDP接受缓冲区大小设置/UDP缓存套接字溢出

描述:oracle rac全局内存块的变动通常会是爆发性的,因此,系统需要缓存接受这些包当等待CPU的资源的时候。不可用的缓存区域导致了全局包的丢失。在大多数UNIX系统中 用 'netstat -s' or 'netstat -su'将会得到帮助决定是缓冲区溢出还是内存缓冲接受的错误。

解决办法:包丢失的情况经常是服务器上UDP缓冲设置不充分所引起的。当出现包或块丢失的环境下,可以留心观察到 "global cache cr requests"的等待状况,通常这是由于内存设置不充分引起的。
当设置 DB_FILE_MULTIBLOCK_READ_COUNT 参数超过4的时候,会导致这一问题的出现,为了减轻这个问题带来的影响,通过增加UDP缓冲区和减小 DB_FILE_MULTIBLOCK_READ_COUNT 参数值可以做到。
判断你的UDP套接字缓冲是否溢出和包丢失在UNIX平台上,可执行如下:
‘netstat -s' 或'netstat -su’然后重点查看以下数值是否过大:
udpInOverflowsudpInOverflows
packet receive errors
fragments dropped
outgoing packet drop
注意:UDP包的丢失通常的结果是延时增加,如果netstat -s 中TCP项中"outgoing packets dropped" 增加的明显,增加wmem_default 和 wmem_max 参数值到 4MB可以解决这个问题。UDP的发送和接受缓冲值是依赖于系统的设置的。这些值是可以动态设置的。

net.core.rmem_default 代表socket的接收缓冲区的默认值

可以通过man tcp帮助中查到此参数的详细解释。如果此参数设置过小,将影响到能够接收到的UDP包的大小。


net.core.rmem_max 代表socket的接收缓冲区的最大值
可以通过man tcp帮助中查到此参数的详细解释。如果源代码中设置的值比此值大,这此值为准。

RHEL最初的设置如下:
net.core.rmem_default = 126976
net.core.rmem_max = 131071
推荐使用值:
#net.core.rmem_default = 524288
#net.core.wmem_default = 524288
#net.core.rmem_max = 4194304
#net.core.wmem_max = 4194304


3、低网络性能和高CPU利用率,‘netstat -s’报告包重组失败

状况描述:大UDP数据包可能被重组并依据Medium Transmission Unit(MTU)值发送多帧数据包,这些碎片数据包需要在接受端重组。高CPU利用率、不充分的重组缓冲区和UDP缓冲空间均可导致包的
重组失败。'netstat -s'报告了大量的’ "reassembles failed" 和 "fragments dropped after timeout" 在接受节点的IP状态栏中。
netstat -s 查看IP状态:
3104582 fragments dropped after timeout
34550600 reassemblies required
8961342 packets reassembled ok
3104582 packet reassembles failed

解决办法:增加碎片重组缓冲区,定义更多的重组区域。增加重组碎片的时间,增加UDP接受缓冲区去调节网络延时状况。
增加以下设置调节内存利用率:
IP分片缓冲区参数:
net.ipv4.ipfrag_low_thresh

net.ipv4.ipfrag_high_thresh

用于组装分片的IP数据报的最大内存量,它将直接影响到能够接收到最大的UDP包的大小。因为超过MTU值的包都会被分片,分片的IP包达到目的端后需选缓存起来,等所有包都到达之后再组装。如果缓存不够用,多余的将被丢弃,这会导致组装失败。
redhat linux最初的设置如下:
net.ipv4.ipfrag_low_thresh = 196608
net.ipv4.ipfrag_high_thresh = 262144
该设置能够支持的最大UDP大小约40000字节。

建议修改如下:
net.ipv4.ipfrag_low_thresh = 393216

net.ipv4.ipfrag_high_thresh = 524288

4、Global Cache local miss rate is raised

当本地的全局高速缓存丢失比例超过一定的门槛时候,我们通常需要警惕的是数据库中的热块问题。

当一个block被一个逻辑读的时候,集群中一个实例需要从另外一个实例的不同模式的内存中传输。可能会引起这样的丢失警告。

当一个热块被非常高频率的传输调用时,集群会出现过多的协调活动:

可以解决的办法如下:

1、对经常被调取的表进行分区

2、通过使用服务隔离应用活动

### 不同类型内存的特点和用途 #### EEPROM (Electrically Erasable Programmable Read-Only Memory) EEPROM 是一种可多次编程的只读存储器,允许通过电子方式擦除并重新编程特定的数据位。其主要特点是能够在不移除芯片的情况下进行数据更新,并能在断电后保持数据不变。 - **特点**: 支持按字节操作;具有较高的耐久性和可靠性。 - **用途**: 广泛应用于需要频繁修改少量配置参数的应用场景中,如微控制器中的固件升级、网络设备设置等[^1]。 ```cpp // 示例:向EEPROM写入一个整数 #include <EEPROM.h> void setup() { int address = 0; long valueToSave = 123; // 要保存的数值 EEPROM.put(address, valueToSave); } ``` #### RAM (Random Access Memory) RAM 属于易失性存储器,在电源关闭时会丢失所存信息。它支持快速随机访问任何位置上的数据单元,这使得 CPU 可以高效地执行程序指令。 - **特点**: 访问速度极快,适合临时存放正在处理的信息。 - **分类**: - SRAM(静态随机存取存储器): 使用双稳态触发器实现非破坏性的读/写功能,适用于高速缓存(cache)[^3]。 - DRAM(动态随机存取存储器): 需要定期刷新才能维持数据状态,通常构成系统的主内存部分。 ```c++ // C++ 中声明变量占用RAM空间的例子 int main(){ int a = 5; // 'a' 存储在RAM中 return 0; } ``` #### ROM (Read-Only Memory) ROM 是一种不可变或难以改变内容的记忆体形式,即使失去供电也能长久保留已记录的内容。传统意义上的 ROM 主要是用来固化一些基本输入输出系统(BIOS)或其他启动加载程序。 - **特点**: 制造完成后几乎不可能更改其中的内容,除非采用特殊手段。 - **现代应用**: 如今更多指的是那些出厂前被预置好固定软件代码的产品内部使用的闪存器件。 ```assembly section .text global _start ; 必须让链接器知道入口点的位置 _start: ; 这里的代码会被烧录到ROM中 mov eax, 4 ; sys_write 系统调用号 ... ``` #### FLASH Flash 存储器结合了EPROM 和 EEPROM 的优点,既具备后者的小规模改写的灵活性又拥有前者的大容量特性。分为 NOR 和 NAND 两种架构: - **NOR Flash** - 特点: 提供类似于 RAM 的接口,可以直接从中执行代码; - 应用领域: 小型嵌入式系统的引导加载程序存储介质。 - **NAND Flash** - 特点: 更高的密度和更低的成本,但不具备直接执行的能力; - 应用实例: 大量用于移动电话、数码相机和其他便携式电子产品内的大规模数据储存解决方案[^4]。 ```bash # Linux下查看flash分区命令示例 cat /proc/mtd ``` #### Cache (高速缓冲存储器) Cache 是位于处理器核心与较慢的主要存储之间的一层小型却非常迅速的工作区。它的存在是为了弥补CPU运算速率远高于外部访存的速度差异问题,从而提高整个计算平台的整体性能表现。 - **工作原理**: 当CPU请求某个地址处的数据时,如果该数据已经在 cache 中,则称为命中(hit),否则就叫未命中(miss),此时需从更底层的存储层次获取所需资料填充进来。 - **级别划分**: L1/L2/L3 缓存逐级增大同时也逐渐减慢,越靠近CPU的部分响应时间越短但是单位成本也越高.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值