关键字:心跳网络、oracle rac 网络异常宕机、packet reassembles failed 、UDP error 转载大佬的一篇文章

同一个数据库,同一次故障,两个人出据的数据库故障报告深度截然不同,很难受。

我要是早看到就不会多次发生这个问题了,不完全一致但解决排查思路是一致的,关键字:心跳网络、oracle rac 、网络异常宕机、packet reassembles failed 、UDP error

转载  自  https://www.anbob.com/archives/2851.html

转载  自  https://www.anbob.com/archives/2851.html

转载  自  https://www.anbob.com/archives/2851.html

以下为原文:

前几日和好友赵彬同学交流在ANBOB公众号投稿分享了一个案例,数据库第二个节点被驱逐出集群,并且多次自动重启以失败告终,驱逐原因在GI Alert log显示是私网通信丢失,而重启失败也是因为ASM无法启动,ASM db alert显示IPC Send timeout.  当时ping和tracert并没发现什么异常,从OSW中的netstat -s查看IP packet reassembles failed时间段值大量增长, 这是一套oracle 11.2.0.4 2Nodes RAC on RHEL 6.6的环境,另个每个数据库服务器CPU核数过百, 这个案例有多种巧合,如果CPU只有几个,问题也可能不会发生,如果是RHEL7也不会发生等等。当然最终以调速OS参数解决,但是原因更值得分析。

Node1 GI ALERT LOG

2017-03-02 11:46:26.607: 
[/u01/11.2.0/grid/bin/oraagent.bin(121496)]CRS-5011:Check of resource "testdb" failed: details at "(:CLSN00007:)" in "/u01/11.2.0/grid/log/anbob/agent/crsd/oraagent_oracle//oraagent_oracle.log"
2017-03-02 11:46:26.612: 
[crsd(175117)]CRS-2765:Resource 'ora.testdb.db' has failed on server 'anbob'.
2017-03-02 11:46:42.866: 
[cssd(172139)]CRS-1612:Network communication with node db2 (2) missing for 50% of timeout interval.  Removal of this node from cluster in 14.620 seconds
2017-03-02 11:46:50.869: 
[cssd(172139)]CRS-1611:Network communication with node db2 (2) missing for 75% of timeout interval.  Removal of this node from cluster in 6.620 seconds
2017-03-02 11:46:54.870: 
[cssd(172139)]CRS-1610:Network communication with node db2 (2) missing for 90% of timeout interval.  Removal of this node from cluster in 2.620 seconds
2017-03-02 11:46:57.493: 
[cssd(172139)]CRS-1607:Node db2 is being evicted in cluster incarnation 351512591; details at (:CSSNM00007:) in /u01/11.2.0/grid/log/anbob/cssd/ocssd.log.
2017-03-02 11:46:58.626: 
[cssd(172139)]CRS-1662:Member kill requested by node db2 for member number 0, group DBHBCRM

Node2 GI ALERT LOG

2017-03-02 11:46:45.378: 
[cssd(177450)]CRS-1663:Member kill issued by PID 84816 for 1 members, group DBCRM. Details at (:CSSGM00044:) in /u01/11.2.0/grid/log/db2/cssd/ocssd.log.
2017-03-02 11:46:58.982: 
[cssd(177450)]CRS-1608:This node was evicted by node 1, anbob; details at (:CSSNM00005:) in /u01/11.2.0/grid/log/db2/cssd/ocssd.log.
2017-03-02 11:46:58.983: 
[cssd(177450)]CRS-1656:The CSS daemon is terminating due to a fatal error; Details at (:CSSSC00012:) in /u01/11.2.0/grid/log/db2/cssd/ocssd.log  

Note:
node2 因网络通信失败而自杀 member kill.

* allocate domain 7, invalid = TRUE 
 * domain 7 valid = 1 according to instance 1 
 Master broadcasted resource hash value bitmaps
 Non-local Process blocks cleaned out
 LMS 0: 0 GCS shadows cancelled, 0 closed, 0 Xw survived
 Set master node info 
 Submitted all remote-enqueue requests
 Dwn-cvts replayed, VALBLKs dubious
 All grantable enqueues granted
Thu Mar 02 11:54:14 2017
IPC Send timeout detected. Sender: ospid 153935 [oracle@db2 (LMD0)]
Receiver: inst 1 binc 430132771 ospid 174276
IPC Send timeout to 1.0 inc 92 for msg type 65521 from opid 10
Thu Mar 02 11:54:16 2017
Communications reconfiguration: instance_number 1
Thu Mar 02 11:54:16 2017
Dumping diagnostic data in directory=[cdmp_20170302115416], requested by (instance=1, osid=174274 (LMON)), summary=[abnormal instance termination].
Reconfiguration started (old inc 92, new inc 96)
List of instances:
 2 (myinst: 2) 
 Nested reconfiguration detected. 
 Global Resource Directory frozen
* dead instance detected - domain 1 invalid = TRUE 
freeing rdom 1
* dead instance detected - domain 2 invalid = TRUE 
freeing rdom 2

Note:
NODE2 的ASM因ipc time out失败一直未启动。

Node2 OSW netsat信息

zzz ***Thu Mar 2 11:40:31 CST 2017
75646 packet reassembles failed
zzz ***Thu Mar 2 11:40:52 CST 2017
77043 packet reassembles failed
zzz ***Thu Mar 2 11:46:33 CST 2017
131134 packet reassembles failed

Note:
这段时间产生了大量的IP packet reassembles failed. 汇总统计了之前的时间里是不存在这个问题的。

当然到这里如果你以以上信息为关键字在MOS中应该已经可以找到解决方案RHEL 6.6: IPC Send timeout/node eviction etc with high packet reassembles failure (Doc ID 2008933.1)。在NOTE中记录是因为OS过多的IP包重组失败导致,解决方法是加大重组的BUFFER大小或启用jumbo frame,对于jumbo frame需要硬件的支持,简单的就是增加network IP 重组buffer的大小。如RHEL 6.6中的

net.ipv4.ipfrag_high_thresh = 16M     --default 4M
net.ipv4.ipfrag_low_thresh = 15M       -- default 3M

通常默认的应该满足基本需求的,像上面的调整在ORACLE的RHEL的最佳实践中也并未建议安装里调整,那后续的LINUX平台都要调整该参数么? 带着这个问题我查开了LINUX 7.2的内核参数

[root@MiWiFi-srv ~]# sysctl -a|grep ipfrag
net.ipv4.ipfrag_high_thresh = 4194304
net.ipv4.ipfrag_low_thresh = 3145728
net.ipv4.ipfrag_max_dist = 64
net.ipv4.ipfrag_secret_interval = 600
net.ipv4.ipfrag_time = 30

如果是参数配置不是最佳,为什么LINUX最新版并未改变,连ORACLE软件也没建议修改? 那我们可以再深入研究一些。

什么是IP packet reassembles failed?

在linux平台使用netstat -s命令时会看到packet reassembles failed项, 记录的是IP重组包失败的累计数据值,什么时候要重组呢?当IP包通信存在碎片时。在网络通信协议中MTU(最大传输单元)限制了每次传输的IP 包的大小,一种是源端和目标端使用了不同的MTU时会交生碎片,这里需要先确认传输过程中的MTU大小配置,确认使用了相同的MTU;还有就是当传送的数据大于MTU时,回分成多个分片传递。这时调整MTU就不可能解决所有的IP包碎片的问题,可以通过加大通信的buffer值,尽可能保留更多的数据在源端拆包,目标端缓存等接收完整后再重组校验。 在LINUX系统中调整BUFFER使用ipfrag_low_thresh 和ipfrag_high_thresh参数,如果调整了这个参数仍有较大的重组失败还可以加大ipfrag_time 参数控制IP 碎片包在内存中保留的秒数时间。

如果在ORACLE RAC环境中一个节点突然产生了大量的数据包输送给另一个节点,如应用设计问题,如数据文件cache fusion或归档只能一个节点访问时,都加大了网络通信量,这里需要检查网络负载及丢包或包不一致的现象,因为ORACLE在网络通信中使用了UDP和IP通信协议,这两类信息都需要关注。

那是不是LINUX所有的系统都需要调整上面的参数呢?
不是的, 从RHEL了解这个问题基本也就出现在LINUX6.6,和部分6.7中,这个问题的根本原因是在linux6.6中引入了percpu counters计数器在内核 kernel-2.6.32-477.el6, 在后面的linux 6.8(kernel-2.6.32-642.el6)和linux 6.7.x(kernel-2.6.32-573.8.1.el6)已经修复了该问题, 所以在其它配置中没有影响。
这个计数器是在每个CPU上一个,当CPU多时很容易超过默认的4M ipfrag_high_thresh, 所以这也是就是我一开始说的CPU多了也是这个问题的巧合,当网络传输大里更容易超过,而产生faild.

下面是RHEL的官方解释:

A bug has been added to address this for RHEL6.6, where IP fragmentation memory accounting fails under some conditions.
原文地址:https://www.cnblogs.com/BWZYDS/p/12867017.html