近期有两次出现
OS system dependent operation:sendmsgfailed with status: 105
OS failure message: No buffer spaceavailable
的问题。
具体报错:
ORA-00603: ORACLE server session terminatedby fatal error
ORA-27504: IPC error creating OSD context
ORA-27300: OS system dependentoperation:sendmsg failed with status: 105
ORA-27301: OS failure message: No bufferspace available
ORA-27302: failure occurred at: sskgxpsnd2
在其他集群中又出现了同样的问题。
经过排查,和上一次的故障内容相似。
1、 主机操作系统都是Oraclelinux
2、 都是在内存使用紧张的时候,出现进程无法正常工作,根本原因为OS failure message: No buffer space available。
3、 主机loopback 网卡的MTU 都是65536。
On servers with High Physical Memory, the parameter vm.min_free_kbytes should be set in the order of 0.4% of total Physical Memory. This helps in keeping a larger range of de-fragmented memory pages available for network buffers reducing the probability of a low-buffer-space conditions
注意上面的共性。
1、 Oracle Linux
2、 lo MTU=65536
3、 内存资源紧张
4、 修改lo MTU的值后,进程启动正常
现在发现的两例状况是Oracle Linux,lo MTU=65536,Oracle RAC。但是单机数据库,或者应用服务器在内存资源紧张的时候,如果调用了系统的sendmsg()也可能出现同样的问题。
所以,每一个Oracle Linux都需要看一下本机的loopback 网卡的MTU值。
那么需要做的事情如下:
1、 查看自己拥有的OracleLinux的服务器
2、 查看loopback 网卡的MTU值
3、 修改loopback 网卡的MTU值(当前生效),以及ifcfg文件(重启生效)。无需servicenetwork restart
4、 修改/etc/sysctl.conf文件,增加vm.min_free_kbytes参数,值为物理内存的0.4%。(例如8g内存,vm.min_free_kbytes=8*1024*1024*0.004=33554)。如官方文档所示增加此参数可以减少问题出现的概率。
ifconfig lo mtu 16436
/etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gatedmaking 127.0.0.0/8 a martian,
# you can change this to something else(255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
MTU=16436
sendmsg()
使用的是lo本地回送地址。
Lp(LOOPBACK)
本地环回接口(或地址),亦称回送地址()。
MTU:
通信术语 最大传输单元(Maximum Transmission Unit,MTU)
不是越大越好,越大,延迟越高,越容易丢包。