Skip to content

Grid and Cluster - 3. page

遭遇11g R2 DRM bug:gcs resource directory to be unfrozen

用户的环境是aix版本的11.2.0.2集群,数据库实例hang,看到gcs resource,第一时间就反应是drm和lmon,结合hang前的awr也发现等待事件集中在gcs resource directory to be unfrozen,这个时候一般集中检查和gcs相关的信息:数据库告警日志,lmon trace,lms trace。整个过程是DRM触发了,但是并没有切换资源,导致实例hang住,根本原因是过大的buffer cache导致,根据lmon的信息和官方bug 12879027吻合,打上11.2.0.2.7的psu(DB和GI),后续继续观察

LMON进程trace可见如下:

*** 2014-08-14 21:13:51.87
 CGS recovery timeout = 85 sec
Begin DRM(231) (swin 1)
* drm quiesce

*** 2014-08-14 21:17:06.782
* Request pseudo reconfig due to drm quiesce hang
2012-07-14 21:17:03.752735 : kjfspseudorcfg: requested with reason 5(DRM Quiesce step stall)

*** 2014-08-14 21:17:04.911
kjxgmrcfg: Reconfiguration started, type 6
CGS/IMR TIMEOUTS:
 CSS recovery timeout = 31 sec (Total CSS waittime = 65)
 IMR Reconfig timeout = 75 sec
 CGS rcfg timeout = 85 sec
kjxgmcs: Setting state to 70 0.
 - AWR Top waits are "gcs resource directory to be unfrozen" & "gc remaster"

官方文档:

Bug 12879027  LMON gets stuck in DRM quiesce causing intermittent pseudo reconfiguration

 This note gives a brief overview of bug 12879027. 
 The content was last updated on: 15-OCT-2013
 Click here for details of each of the sections below.

Affects:

Product (Component) Oracle Server (Rdbms)
Range of versions believed to be affected Versions BELOW 12.1
Versions confirmed as being affected
Platforms affected Generic (all / most platforms affected)

Fixed:

The fix for 12879027 is first included in

Interim patches may be available for earlier versions – click here to check.

Symptoms:

Related To:

Description

This bug is only relevant when using Real Application Clusters (RAC)

LMON process can get stuck in the DRM quiesce step triggering
pseudo reconfiguration eventually.

Rediscovery Notes:
 DRM quiesce step hangs and triggers pseudoreconfiguration especially
 in single window DRM and when the buffer cache is very large.

Workaround
 None

Getting a Fix
 Use one of the "Fixed" versions listed above
 (for Patch Sets / bundles use the latest version available as
  contents are cumulative - the "Fixed" version listed above is
  the first version where the fix is included)
 or
 You can check for existing interim patches here: Patch:12879027

Please note: The above is a summary description only. Actual symptoms can vary. Matching to any symptoms here does not confirm that you are encountering this problem. For questions about this bug please consult Oracle Support.

References

Bug:12879027 (This link will only work for PUBLISHED bugs)
Note:245840.1 Information on the sections in this article

AIX平台Rac Listener offline问题分析

 

接到电话时候是下午4点多,长沙的天气有点闷热,外面正准备下雷雨。客户来电咨询集群2个节点的listener自动offline,问我大概的会是什么原因造成的,现场有个其他公司的Oracle工程师回复可能是Oracle bug导致,用户觉得不靠谱直接联系我了。从用户的反馈的信息来看,不能直接说明就是bug导致,但是第一反应就是vip offline 裙带关系把listener也带下去了,Listener与vip 这一对基友出的问题还少?但是也不排除其他的bug因为listener auto offline的bug虽然不是很多,但是也不是1只手数的过来的,从用户手上获取相关的log后着手进行分析。

分析思路:

一般碰到这类问题,首先要获取查看的日志就是
1.数据库告警日志(2个实例)
2.RAC的告警日志(其实这个不是很重要)
3.CRSD日志
4.RACG相关日志(VIP,ONS)
5.系统日志

因为是2个节点之间的都发生了listener offline,首先检测了2个节点的告警日志,只发现了现场工程师重启集群的log记录如下:
节点1

Wed Aug  6 10:59:19 2014
Thread 1 advanced to log sequence 227 (LGWR switch)
  Current log# 13 seq# 227 mem# 0: +DATA/orcl/onlinelog/redo13.log
Wed Aug  6 13:58:02 2014
Thread 1 advanced to log sequence 228 (LGWR switch)
  Current log# 18 seq# 228 mem# 0: +DATA/orcl/onlinelog/redo10.log
Wed Aug  6 14:47:15 2014
Shutting down instance: further logons disabled
Wed Aug  6 14:47:15 2014
Stopping background process CJQ0
Wed Aug  6 14:47:15 2014

节点2

Wed Aug 6 08:17:37 2014
Thread 2 advanced to log sequence 205 (LGWR switch)
Current log# 14 seq# 205 mem# 0: +DATA/orcl/onlinelog/redo14.log
Wed Aug 6 11:00:24 2014
Thread 2 advanced to log sequence 206 (LGWR switch)
Current log# 15 seq# 206 mem# 0: +DATA/orcl/onlinelog/redo15.log
Wed Aug 6 14:48:12 2014
Reconfiguration started (old inc 12, new inc 14)
List of nodes:
1
Global Resource Directory frozen
* dead instance detected - domain 0 invalid = TRUE
Communication channels reestablished
Master broadcasted resource hash value bitmaps
Non-local Process blocks cleaned out
Wed Aug 6 14:48:13 2014
LMS 0: 0 GCS shadows cancelled, 0 closed
Wed Aug 6 14:48:13 2014
LMS 1: 0 GCS shadows cancelled, 0 closed
Wed Aug 6 14:48:13 2014
LMS 3: 0 GCS shadows cancelled, 0 closed
Wed Aug 6 14:48:13 2014
LMS 2: 0 GCS shadows cancelled, 0 closed
...

告警日志并未给我们有用的信息,下来按老习惯直接分析CRSD日志了,具体的日志信息以及分析如下:

1.节点一日志分析

2014-08-06 14:13:57.778: [  CRSAPP][11095]32CheckResource error for ora.his-ora1.vip error code = 1
==>可以发现在14点13分57秒vip服务异常
2014-08-06 14:13:57.818: [  CRSRES][11095]32In stateChanged, ora.his-ora1.vip target is ONLINE
2014-08-06 14:13:57.819: [  CRSRES][11095]32ora.his-ora1.vip on his-ora1 went OFFLINE unexpectedly
==>集群将vip服务状态标记为offline
2014-08-06 14:13:57.820: [  CRSRES][11095]32StopResource: setting CLI values
2014-08-06 14:13:57.825: [  CRSRES][11095]32Attempting to stop `ora.his-ora1.vip` on member `his-ora1`
2014-08-06 14:13:58.418: [  CRSRES][11095]32Stop of `ora.his-ora1.vip` on member `his-ora1` succeeded.
==>集群停止ora1的vip服务
2014-08-06 14:13:58.419: [  CRSRES][11095]32ora.his-ora1.vip RESTART_COUNT=0 RESTART_ATTEMPTS=0
2014-08-06 14:13:58.423: [  CRSRES][11095]32ora.his-ora1.vip failed on his-ora1 relocating.
==>ora1.vip漂移失败
2014-08-06 14:13:58.520: [  CRSRES][11095]32StopResource: setting CLI values
2014-08-06 14:13:58.525: [  CRSRES][11095]32Attempting to stop `ora.his-ora1.LISTENER_HIS-ORA1.lsnr` on member `his-ora1`
==>由于裙带关系crs把listener资源也关闭了
2014-08-06 14:15:15.951: [  CRSRES][11095]32Stop of `ora.his-ora1.LISTENER_HIS-ORA1.lsnr` on member `his-ora1` succeeded.
==>同上
2014-08-06 14:15:16.022: [  CRSRES][11095]32Attempting to start `ora.his-ora1.vip` on member `his-ora2`
2014-08-06 14:15:17.882: [  CRSRES][11095]32Start of `ora.his-ora1.vip` on member `his-ora2` succeeded.
2014-08-06 14:15:24.997: [  CRSRES][11185]32startRunnable: setting CLI values

2.节点二日志分析

2014-07-14 17:35:59.469: [  CRSRES][11648]32Start of `ora.orcl.orcl2.inst` on member `his-ora2` succeeded.
2014-08-06 14:14:06.866: [  CRSAPP][11469]32CheckResource error for ora.his-ora2.vip error code = 1
==>同样可以发现在14点14分06秒vip服务异常,和节点1前后相差9秒
2014-08-06 14:14:06.879: [  CRSRES][11469]32In stateChanged, ora.his-ora2.vip target is ONLINE
2014-08-06 14:14:06.881: [  CRSRES][11469]32ora.his-ora2.vip on his-ora2 went OFFLINE unexpectedly
==>集群将ora2.vip服务状态标记为offline
2014-08-06 14:14:06.881: [  CRSRES][11469]32StopResource: setting CLI values
2014-08-06 14:14:06.886: [  CRSRES][11469]32Attempting to stop `ora.his-ora2.vip` on member `his-ora2`
2014-08-06 14:14:07.473: [  CRSRES][11469]32Stop of `ora.his-ora2.vip` on member `his-ora2` succeeded.
==>集群停止ora2.vip服务
2014-08-06 14:14:07.474: [  CRSRES][11469]32ora.his-ora2.vip RESTART_COUNT=0 RESTART_ATTEMPTS=0
2014-08-06 14:14:07.479: [  CRSRES][11469]32ora.his-ora2.vip failed on his-ora2 relocating.
==>ora2.vip漂移失败
2014-08-06 14:14:07.524: [  CRSRES][11469]32StopResource: setting CLI values
2014-08-06 14:14:07.528: [  CRSRES][11469]32Attempting to stop `ora.his-ora2.LISTENER_HIS-ORA2.lsnr` on member `his-ora2`
2014-08-06 14:15:16.008: [  CRSRES][11548]32startRunnable: setting CLI values
2014-08-06 14:15:24.982: [  CRSRES][11469]32Stop of `ora.his-ora2.LISTENER_HIS-ORA2.lsnr` on member `his-ora2` succeeded.
==>由于裙带关系crs把listener资源也关闭了
2014-08-06 14:15:25.013: [  CRSRES][11469]32Attempting to start `ora.his-ora2.vip` on member `his-ora1`
2014-08-06 14:15:27.911: [  CRSRES][11469]32Start of `ora.his-ora2.vip` on member `his-ora1` succeeded.

从以上的CRSD日志可以发现,故障的发生确实是因为VIP的异常offline导致listener也被offline导致;故障的发生时间点为14:13分后,两个节点前后vip服务出现异常,导致offline的产生,并且并未restart,vip在漂移失败后crs将LISTENER进程offline。由此可以判断出监听资源offline的根源为vip的原因导致,这与我在客户通电话时候获取的信息得出判断是一致的。

那么现在的问题就比较明显了,原因是vip异常offline导致,那么vip offline的根源是什么?而且是2个vip几乎同时都offline了,一般vip的offline的原因,我个人是个归纳如下:

1.不少bug会导致vip offline
2.网络波动导致ping timeout超时
3.网络故障,比如交换机或者网路,网卡问题
4.网关设错等

但是这里集群的日志信息已经没有其他的信息可以告诉我们其他有助于我们定位vip offline的根源了,下来从系统层面判断是否存在异常信息的告警,这里是AIX所有采用errpt -a的方式查找最新的报错,2个主机最新的错误信息都是2014年7月3号,离现在太久了,而且这期间并未发生类似的故障,基本初步排除系统方面的问题。那到底是不是网络的问题?还是bug的问题?
这个时候一方面可以对VIP服务采用crsctl debug log resource ora.his-ora2.vip:1的方式在两个节点上开启trace跟踪,然后对trace的日志进行分析,另一方面通过加大ping time out时间的方式来避免偶尔的网络波动导致的vip 资源进程offline的情况,这2方面的执行命令如下:

1.debug vip 进程

To increase the trace level, issue
crsctl debug log resource :1

To turn off this tracing use:
crsctl debug log res :0

2.延长vip检测time out时间

修改racgvip文件,将PING_TIMEOUT=" -c 1 -w 1"改为PING_TIMEOUT=" -c 1 -w 3"

日志方面已经没有可以给我们有帮助的信息了,此时电话用户告知目前的诊断情况并建议对网络方面进行排查,检测整体rac相关网络的波动异常情况,其次对当前的vip进程进行trace根据trace文件进行分析以及增加time out时间。庆幸的是正在准备做trace的时候,用户来电反应下午14:13分与rac相关的交换机发生failover,整个过程持续了一段时间,由此可以判断在此过程由于无法ping通导致vip offine,进而出现客户反应的现象。但是我还是不放心,给vip进程做了trace,等些时间再关掉再关掉检测trace。

在后续的检测中我也发现一个问题,那就是节点的priv网关和pub网关是一样的,在rac环境中我是不建议这种设置的,如下2图:
节点1公有网卡节点1私有网卡

Rac Listener offline问题分析

浅谈RAC中 Gc block lost 的诊断

Oracle的RAC环境中,数据库会收集global cache 的工作负载统计信息,这些信息可以通过STATSPACK, AWRs 和 GRID CONTROL等工具。
对于每个节点,RAC都会对global cache中的数据传输信息进行监控和评估,global cache数据传输信息情况 代表了私有网络通信的包处理效率低或者包的处理存在异常。如果golbal cache与Enqueue服务的通信出现异常在相关的AWR和statspack中可以检测到相关的等待事件,这类等待事件基本为gc cr block lost 和/或 gc current block lost。数据库绝大部分的 global cache lost blocks的问题都可以直接联系到私网的故障和错误的配置。本文可以作为调查和评估常见原因(有时是非常明显)的指南。

尽管我们讨论的大部分都是性能问题,但是这些问题也有可能会导致节点或实例的驱逐。Oracle集群和RAC实例依赖于心跳来维持节点关系。如果网络心跳持续无法连通,那么实例/节点驱逐就会发生 。因此,以下的这些场景症状也和节点/实例驱逐相关。

主要现象:

“gc cr block lost” / “gc current block lost” 出现在AWR的top 5等待事件中或者产生了非常多的等待。

其次:

1.SQL traces 文件中多次出现 gc cr requests / gc current request
2.出现 gc cr multiblock requests 等待,每次等待时间都很长而且elapsed times 都一样。
3.应用的性能和吞吐量都很差
4.通过ifconfig或者其它第三方的工具能够看到网络上发送和接受包的错误
5.使用netstat命令会看到一些error/retransmits/reassembly failures
6.节点故障和节点通信错误
7.大量的CPU消耗在网络进程上

注意: 块丢失的问题通常会和gc cr multiblock requests 等待同时出现,如:等待连续的块扫描

可能的原因:

可能的原因已经在下面的诊断指南中列出(按照出现概率排序)

一.网线/网卡/交换机问题

描述: 坏掉的网线连接,错误的电缆,制作粗糙的电缆,过于冗长和错误的端口分配,有问题的交换机都会导致低下的传输率,块损坏,数据包丢失和性能问题。

解决: 敦促网络供应商对网络进行检查,更换坏掉的网络组件。集群私网应该使用CAT 5 级或者是更好的通信线缆.所有的设备都需要确保安全插牢,并且按照线缆和端口进行标识,线缆的长度需要符合供应商指定的要求。

二.UDP receive(rx) buffer sizes设置过小/UDP buffer socket溢出

描述: Oracle RAC Global cache块的处理是突发性的,因此,操作系统需要缓冲区来接受接收(RX)数据包并等待CPU的处理,如果缓冲区设置的不合理或者过小会导致块丢失和global cache 块丢失。通过’netstat -s’ 或者 ‘netstat -su’命令可以帮助我们在unix平台上获取到UDPInoverflows,package receive errors, dropped framces 或packets dropped due to buffer full errors信息。

解决: 数据包丢失往往是由于在接收服务器上设置的UDP缓冲区不足,从而导致了块在缓冲区中溢出而产生块丢失。当OS的缓冲区设置小于128k的时候,Oracle 在打开一个socket 时会设置 UDP receive buffer 尺寸为 128k。如果OS的缓冲区设置大于128k,Oracle会采用OS 的设置。如果数据库的块尺寸大于8k,那么缓冲区会自动的进行调整,但是不会超过OS的限制。当DB参数DB_FILE_MULTIBLOCK_READ_COUNT的值大于4时,如果发现 UDP buffer overflows, packet loss 和 lost blocks,并且数据库出现了大量的”global cache cr requests”等待超时,这是由于缓冲区设置过小导致的,我们可以通过调大OS的UDP缓冲区的或者调低数据库参数DB_FILE_MULTIBLOCK_READ_COUNT来解决问题 ,这个参数可以在系统或session级别调整。

对于大部分的unix平台,我们可以通过以下的一些命令来判断是否出现UDP缓冲区溢出或者block loss,执行:

‘netstat -s’ 或 ‘netstat -su’,并根据具体平台查看 “udpInOverflowsudpInOverflows”, “packet receive errors”, “fragments dropped” 或 “outgoing packet drop” 信息

注意:UDP丢包通常会引起更多的延迟,网络带宽减少,更高的CPU使用率(kernel 和user),以及消耗更多的内存来处理这些包的重传。
在系统运行时,如果工作节点(运行负载的节点)对应的远程节点上命令netstat –s的输出中 “outgoing packets dropped”值显著的增加,同时增加wmem_default 和 wmem_max到4M(Linux平台)可以解决问题。

UDP发送和接收缓冲区参数是和操作系统有关的,它们可以滚动(rolling)修改(例如:每次1个节点)。

三.私网性能差并且CPU使用率高,`netstat -s` 出现packet reassembly failures

描述: 根据MTU(Maximum Transmission Unit)的尺寸,大的UDP数据包可能被分片,并在多个帧中发送。这些零散的数据包需要在接收节点上重新组合。高CPU使用率(持续的或者是频繁的峰值),过小的reassembly buffer或者UDP buffer也会导致块重组失败。在接收节点’netstat -s’输出的 “IP Statistics”部分提示有大量的Internet Protocol (IP)上的”reassembles failed” 和 “fragments dropped after timeout”信息。分片的报文需要在指定时间(time-to-live)内完成重组(reassemble)。没有能够完成重组的分片报文会被丢弃并要求重传。已经收到,但是由于空间不足没有进行重组的数据分片会被直接丢弃。

`netstat -s` IP stat counters:
3104582 fragments dropped after timeout
34550600 reassemblies required
8961342 packets reassembled ok
3104582 packet reassembles failed.

解决: 增加reassemble buffer尺寸,给重组分配更多的空间。增加reassemble的时间,增加UDP receive buffer以避免由于网络延迟导致的reassemble失败,并找到对网络数据包处理产生负面影响的高CPU 利用率原因.
注意: 增加以下设置的同时也会增加内存的使用

LINUX:
我们可以通过以下设置来修改reassemble buffer大小
/proc/sys/net/ipv4/ipfrag_low_thresh (default = 196608)
/proc/sys/net/ipv4/ipfrag_high_thresh (default = 262144)

我们可以通过以下设置来修改reassemble的时间:
/proc/sys/net/ipv4/ipfrag_time (default = 30)

请参考OS文档了解不同平台的对应命令语法。

四.网络传输坏块(corruption)导致的UDP checksum errors 和/或 send (tx) / receive (rx) transmission errors

描述: UDP包传输的过程中,接受进程会读取数据包头的校验值。任何校验值损坏都会使这个包被丢弃,并导致重发,这会增加CPU的使用率并且延缓数据包处理。

解决: 使用 tcpdump,snoop等网络工具来捕获数据包的dump,定位这些checksum错误并确认checksum corruption。敦促OS或者网络管理员查找产生corruption的原因。 已知的问题是由于网卡上开启了Checksum offloading 导致了checksum 错误,如果出现这样的问题请检查checksum offloading的功能是否被禁用,测试后考虑关闭网卡上的该项功能。在Linux系统上执行ethtool -K rx off tx off可以关闭该功能.

五.在通信通道中设置了不匹配的MTU的值

描述: 不匹配的MTU大小设置会导致传输过程中出现 “packet too big” 错误并丢失数据包,导致global cache block丢失和大量的重传(retransmission)申请。.
解决: MTU 是”Maximum Transmission Unit” 或者是私网通信过程中帧的尺寸.

对于以太网(Ethernet),大多数UNIX平台的默认值是1500字节。私网链路中所有设备都应该定义相同的MTU。请确认并监控私网链路中的所有的设备。为ping ,tracepath,traceroute命令指定大的,非默认尺寸,ICMP probe 包来检查MTU设置是否存在不一致。使用ifconfig或者厂商推荐的工具为服务器网卡(NIC)的MTU设置合适的值。关于JUMBO Frames的设置,请见第12点的介绍。

注意:私网中不一致的MTU值会导致节点无法加入集群的问题。

六.使用非专用的私网链接

描述: 共享的公网和私网配置会导致应用性能低下,网络拥堵,在一些极端的情况下会导致global cache block loss.
解决:数据库/集群私网应该使用独占的VLAN,并定义在non-routed子网中。私网的交换机需要独立于其他的交换机,例如,私网交换机不应该是从接入层的交换机扩展出来,私网的交换机不应该和公网或者NAS的交换机共享。如果使用了VLANs,那么私网应该被划分在单独的VLAN中,并且位于独占的 ,non-routed 子网,独立于公网或者NAS网络。

七.服务器/交换机缺少“邻接”(adjacency)配置

描述: 通常,如果网络上的设备能够通过单跳链接,我们称为“邻接”(adjacency).多跳的配置会增加网络上的延迟,也会增加更多的节点故障风险.
解决: 所有的 GbE(千兆以太网)服务器的私网链接都应该邻接在交换机或者交换机组(如果配置了交换机冗余)上。在私网链路中,不应该出现中间网络设备,例如:路由器。在Unix平台上,我们可以通过tracetroute命令来确定“邻接”问题。
配置了 IPFILTER

描述:配置主机防火墙或网络地址转换(NAT)软件– IPFILTER (IPF)也是导致私网通信问题的原因之一。IPF还会导致严重的应用程序性能下降,丢包以及global cache block loss问题.
解决: 禁用 IPFILTER

八.过时的网卡驱动程序(Network driver)或者是网卡固件(firmware)

描述: 过时的网卡驱动程序或固件,是已知的私网数据包传输问题原因。不兼容的网卡驱动程序会导致节点间通信过程中数据包处理延迟,延迟增加和丢包。
解决: 所有节点上的网卡应该采用相同的制造商和型号,相同的性能参数,和对称的插槽(slot) ID。集群中所有节点的私网网卡固件和驱动程序都应该是一致的(最新的)。

九.特殊的私网链接和网络协议

描述: 非标准的,专享的网络协议,如LLT ,HMP等已经被证明是不稳定的而且很难debug。使用非标准的,专享的网络协议会导致应用的性能下降,丢包和节点重启等故障。
解决: Oracle使用1GbE UDP 作为传输和通信协议,这已经被证明是稳定的,可靠的和高性能的。请避免使用特别的和非标准的通信协议。 在一些平台上,基于Inifiniband 的IP和RDS协议是可用的并且是Oracle支持的,而且10GbE已经被认证(详细信息请参见OTN) – Oracle还在进行这方面的认证工作。
.
十.错误配置的网卡绑定/链路聚合

描述:服务器上错误的网卡绑定或链路聚合配置,邻接的私网交换机上错误的聚合配置会导致性能下降,出现由”port flapping”导致的block loss,交换机上构成私网端口的聚合链路发生频繁的”UP”/”DOWN”状态切换。
解决: 如果在集群服务器上为私网配置了链路聚合,那么交换机上的端口也应该支持这种配置,并按照聚合配置来配合私网的通信。交换机上构成私网端口的聚合链路配置错误会导致 ‘port flapping’,交换机端口会被随机删除,导致丢包.对于绑定和聚合,请参考驱动器(driver)文档进行配置,并且在有工作负载的环境下进行测试。 有很多公开的工具和软件可以协助进行带宽和性能延迟的测试(请参考iperf)。我们应该通过评估OS,网络和网络驱动器的统计数据来确定绑定的性能.

十一.错误的巨帧(Jumbo Frame)配置

描述: 错误的Jumbo Frames配置会产生之前提到的不一致的MTU问题

解决:Jumbo Frames 并不是IEEE 标准配置,所以配置的时候应该很小心。单个Jumb Frame的大小是9000 bytes左右。Frame 的大小取决于网络设备供应商,在不同的通信设备上的大小可能是不一致的。如果默认的MTU 尺寸不是9000bytes,请保证通信路径中的所有设备(例如:交换机/网络设备/网卡)都能够支持一个统一的MTU值,在操作的过程中必须把Frame Size(MTU Size)配置成这个值。不合适的MTU设置,例如:交换机上配置MTU=1500,但是服务器上的私网网卡配置成MTU=9000,这样会造成丢包,包的碎片和重组的错误,这些都会导致严重的性能问题和节点异常宕机。大部分的平台上我们都可以通过netstat –s命令的‘IP stats’输出发现包的碎片和重组的错误。大部分的平台上我们可以通过ifconfig –a命令找到frame size的设置。关于交换机上的配置查询,需要查看交换机提供商的文档来确定。

十二.网卡双工( Duplex)模式不匹配

描述:网卡的双工模式不匹配是指,在同一个交互的链路上,一端使用的是全双工模式,另外一端使用的是半双工模式。这通常是是手动配置错误导致的 或者是一端配置被修改成半双工模式时,另外一端配置成了auto-negotiate引起的。双工模式不匹配会导致严重的私网通信性能问题

解决: 集群中所有节点的私网网卡和交换机上的私网线路对应的双工模式都应该配置为auto-negotiate。千兆以太网标准要求auto-negotiate 设置为”on”。双工模式不匹配可能会导致严重的网络性能下降,数据冲突和丢包的情况出现。 每次进行网络硬件和软件升级后都应该检查auto-negotiate设置, Auto-negotiate 在所有的设备上都应该是1000全双工模式。

十三.私网通信链路流量控制(Flow-control)不匹配

描述: 流量控制是指,当一台服务器传输的速度比接收节点(或者是网络设备)的接受速度快 。接收设备会发送“暂停”帧来请求发送端暂时停止发送数据包.
解决:交换机和服务器网卡之间Flow-control设置不匹配的时候会导致丢包和严重的网络性能问题。大部分的情况下,默认的设置”ON”是最好的结果。例如:

tx flow control should be turned on
rx flow control should be turned on
tx/rx flow control should be turned on for the switch(es)

尽管如此,对于一些特殊的案例(例如 note 400959.1),例如一些OS或交换机固件的bug,设置成OFF(所有的网络路径)会有更好的结果。

注意:Flow control的设置在固件/网络驱动程序升级后会发生变化,网卡/交换机的设置应该在升级后重新检查。如果没有设备提供商的其它建议值,请使用默认的值。

十四.OS,网卡,交换机层面的数据包丢弃

描述:任何被OS,网卡或者交换机提示的包丢弃信息都应该被彻底的调查和解决。包丢失会导致私网性能降低,CPU使用过高以及节点异常宕机等情况

解决:具体的工具会帮助我们确定包或帧丢失问题发生在那个层面(process/OS/network/switch)。netstat ,ifconfig,ethtool,kstat(依赖于OS的平台)命令输出和交换机端口状态是首先要进行检查和评估的。您需要一些网络嗅探器(sniffer)跟踪点对点数据通信来排查问题(常见的工具:snoop/wireshare/ethereal).

注意:从底层来理解丢包的原因是我们找到根本原因不可缺少的步骤。在网络环境中,过小的网卡ring buffers或者receive queues是已知的导致网络上异常丢包的原因,比如:在所有层面都没有提示发生了丢包。请查看下面的网卡驱动问题和Kernel queue长度.这种情况,需要联系系统管理员和网络工程师来确定根本的原因.

十五.网卡驱动/固件配置问题

描述:不合适的配置或者网卡中一些可调属性的不恰当的默认也会导致丢包并增加重传的请求.

解决:大部分网络设备供应商提供的默认出厂配置是可以满足应用要求的。尽管如此,一些网络供应商提供的网卡设备需要修改interrupt coalescence设置和ring buffers描述符数量。interrupt coalescence是CPU发送和接受数据包的中断率。ring buffer在 CPU中断之间持有需要处理的rx 包。不合适的配置会导致在这个层面丢失数据包,诊断这个层面的问题需要系统管理员以及OS/设备提供商的参与。

十六.网卡发送(tx)和接受(rx)队列的长度

描述:设置过小的网卡tx/rx队列长度会导致在队列满的时候出现丢包的情况,这会导致gc block loss,增加重传并且降低私网的效率。

解决:在内核网络子系统(kernel network subsystem)和网络接口设备驱动程序之间移动数据时,发送(TX)和接收(Rx)队列用来实现对数据包的传输和处理进行管理.这些队列的大小是可以配置的。针对产生的网络流量或者配置了MTU的情况,如果这些队列的配置不合适或者过小,队列填满后会导致数据包的丢失或溢出。取决于设备的驱动程序和搜集到的统计信息数量,这类丢包是不容易被发现的,诊断这个层面的问题需要系统管理员和OS/设备的提供商的介入。(通常在linux上我们设置参数:iftxtqueue 和netdev_max_backlog)

十七.有限的负载能力和过于饱和的带宽

描述: 过载的网络使用也会导致私网的性能问题和丢包。

解决: 私网配置的最佳实践是您需要知道您的网络使用情况和带宽。这需要通过定期的监控来获取使用的趋势,瞬时值和恒定的值。私网上突然增加的使用请求可能是应用程序调整或异常导致的,如性能很差的SQL语句或者异常产生的数据流量。找到产生带宽饱和的原因并解决它。

十八.过度的CPU申请和调度延迟

描述: 持续的高负载和网络堆栈的调度延迟也会对私网的数据包传输产生负面的影响并且会导致私网的性能下降,丢包,gc block loss和节点的重启问题。

解决: 持续的高CPU使用率导致的调度延迟也会导致网络上数据包的延迟处理。过度,持续的延迟会导致严重的性能下降,并可能导致群集节点故障。关键是要找到持续的高CPU使用率的原因。使用uptime命令能够列出大部分操作系统的平均负载情况,和网络堆栈处理相关的CPU问题,可以通过NIC interrupt coalescence或者绑定网络到单个CPU得到缓解,请和网络设备的供应商一起来进行此类的优化。调度延迟会导致数据包重组错误。请参见本文的第2点。

十九.和交换机相关的数据包处理问题

描述:交换机的端口缓冲区溢出,交换机拥堵和配置问题,比如MTU大小,网络聚合和VLANS 都能导致低效率的数据包处理和集群节点故障。

解决:Oracle私网需要一个包含交换机的以太网网络。交换机是私网中点对点通信至关重要的组成部分。作为一个网络设备,这个交换机会受到多种因素的影响并导致私网通信性能和高可用性出现异常。监控交换机的异常,数据包处理事件,临时的或持续的吞吐量信息是非常重要的。交换机的状态统计信息,应该定期进行检查并评估是否正常,并找出异常情况。

二十.QoS对私网数据包处理产生的负面影响

描述:在交换机上定义的QoS会共享私网通信的带宽并影响私网处理能力,导致私网性能的下降。

解决: 如果私网布置在共享交换机的VLAN上,QoS应该通过优先级配置来避免对私网通信产生负面的影响。任何QoS的定义在布置前都应该进行评估,确保不会影响私网通信.

二十一.重聚(reconvergence)过程中生成树(Spanning tree)限电

描述:以太网使用生成树协议(STP)来避免网络环路,确保交换机和冗余的交换机能直接路由到服务器。任何包含在STP拓扑中的设备故障都会导致重新计算路由到主机的重聚。如果STP协议在局域网中被起用,但是配置的有
问题或未经优化,网络重聚事件可能需要长达1分钟或者更长的时间(取决于网络的规模和参与设备)。这种延迟会导致私网问题和集群范围的中断。

解决:很多交换机供应商提供优化的扩展,使STP能够实现更快的网络重聚。例如: Rapid Spanning Tree (RSTP), Per-VLAN Spanning Tree (PVST)和Multi-Spanning Tree (MSTP) 可以避免集群大范围的异常出现。

二十二.STREAMS队列的sq_max_size 配置太小

描述: AWR 提示 “gc cr block lost” 和/或”gc current block lost”等待时间很高。 netstat 并没有提示有任何数据包处理的错误. `kstat -p -s ‘*nocanput*` 返回非0值. nocanput 说明streaming message队列已满,并且包被丢弃。 客户在Solaris平台RAC环境下使用STREAMS。
解决: 增加UDP max buffer space,并且把STREAMS队列设置成unlimited能够解决问题,并且消除”nocanput” lost messges。以下是Solaris平台下对应的命令:
`ndd -set /dev/udp udp_max_buf `
set sq_max_size to 0 (unlimited) in /etc/system. Default = 2

udp_max_buf 控制UDP socket发送和接受缓冲区的大小,默认值是262,144 bytes,这个值对于使用STREAMS的应用来说是不够用的。sq_max_size 控制message的队列的长度。

二十三.VIPA和DGD设置不正确(仅限Aix平台)

如果您在AIX平台上使用了VIPA(Virtual IP Address),那么Dead Gateway Detection (DGD)必须配置成允许UDP failover模式。

默认的DGD参数可以作为配置起始值,但是在一些客户的环境中,这些参数可能需要调整,但是无论何种情况,都必须设置成大于1的值。默认的设置如下:
dgd_packets_lost = 3
dgd_ping_time = 5
dgd_retry_time = 5

更多配置信息,请参考文章Using VIPA and Dead Gateway Detection on AIX for High Availability Networks, including Oracle RAC: http://www-03.ibm.com/support/techdocs/atsmastr.nsf/WebIndex/WP102177

Solaris+Vertis LLT的环境上,交换机的错误配置

当VCS命令lltstat的输出显示”Snd retransmit data”增加时,gc block lost 也会增加。把私网交换机的速度从fixed修改成auto-negotiate,更均匀地分布电缆到每个模块的链接,这样有助于解决”gc blocks lost”的问题

11.2.0.4 Oraagent.bin 进程内存溢出耗用全部主机内存资源

grid  8323186        1  10 08:55:22      -  3:05 $ORACLE_HOME/bin/oraagent.bin

以上的这个文件进程耗用了主机内存36G,整个f服务器内存100%耗用,SWAP利用持续增加,系统变得异常缓慢。

同时检测grid的此进程运行日志oraagent.log,发现错误如下:

CRS-0210: Could not find resource 'ora.LISTENER.lsnr

由此推断监听可能没能启动,检测发现如下

grid@zjyw ~ > $crsctl stat res -t

NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------

ora.OCR_VOTE.dg
               ONLINE  ONLINE       zjywapp
ora.asm
               ONLINE  ONLINE       zjywapp            Started
ora.ons
               OFFLINE OFFLINE      zjywapp

ora.cssd
      1        ONLINE  ONLINE       zjywapp
ora.diskmon
      1        OFFLINE OFFLINE
ora.evmd
      1        ONLINE  ONLINE       zjywapp

监听进程不存在,尝试启动监听报错,

srvctl add listener -l LISZJYW -p 1521
PRCN-2065 : Port(s) 1521 are not available on the nodes given
PRCN-2067 : Port 1521 is not available across node(s) "zjywapp.mydomain.com"

基本可以判断是因为1521端口不可用导致监听没发创建,而oraagent.bin在检测GRID进程资源的时候因为linstenr的问题正好触发了这个bug,当然这个bug应该是最新的,补丁应该还没出。临时解决方案就是创建一个其他端口的listener,并重启gi,或者检查1521是被谁占用,释放了1521端口重新增加监听资源后重启gi此问题应该可以避免。