RAC环境产生大量ons进程,导致用户进程资源耗尽,用户切换提示Resource temporarily unavailable

基本要素(时间、用户、问题)

用户才实施了LINUX5.8+11.2.0.4的RAC环境,使用一段时间后,当切换的grid用户的时候,提示Resource temporarily unavailable,如下:

[root@rac01 bin]# su- grid

su: cannot set userid: Resource temporarily unavailable

但是我们在切换其他用户如oracle用户的时候,却能够正常切换,并且CRS集群使用正常,客户端的连接和用户的使用暂时也没有影响,用户在第一次出现这种情况的时候,采用重启服务器的方式,暂时解决了问题,但是没过多久,又再次出现,因此用户需要彻底解决这个问题,避免出现其他安全隐患,影响正常的业务应用。

问题分析

步骤一:检测操作系统资源限制配置

一般出现这种情况,首先就应该考虑我们在实施过程中操作系统中关于grid用户资源限制的参数设置得可能存在问题,在实施RAC的过程中,对用户的资源限制有2个地方/etc/security/limits.conf和/etc/profile,首先就应该检测下这2个配置文件的内容,如下:

[root@rac01 ~]# cat/etc/security/limits.conf

grid soft nproc 16384

grid hard nproc 65536

grid soft nofile 2047

grid hard nofile 65536

oracle soft nproc 16384

oracle hard nproc65536

oracle soft nofile 2047

oracle hard nofile65536

[root@rac01 ~]# cat/etc/profile

if [ $USER ="oracle" ] || [ $USER = "grid" ]; then

    if[ $SHELL = "/bin/ksh" ]; then

      ulimit-p 16384

      ulimit-n 65536

    else

      ulimit-u 16384 -n 65536

    fi

    umask022

fi

这里的nproc就是对用户能够使用的最大进程数的控制,其中soft是软限制 ,用户可以超过这个设置的值,但一定不能超过hard的值 。一般soft比hard小,hard是硬限制,/etc/security/limits.conf中的格式如下,这里以fszize这个参数为例:

技术分享

       我们这里的grid   soft  nproc 16384和grid  hard nproc 65536就表示grid用户最多能启用65536个进程,其中达到16384就发出警告,接下来我们就应该查看下用户的进程数,如下

[root@rac01 ~]# ps –Ugrid |wc –l

156

[root@rac01 ~]# ps –aux|wc –l

659

       我这里查看下了进程不多,没有超过告警值,不应该提示Resource temporarily unavailable的错误啊,我这里怀疑是我用的命令参数可能有问题,通过百度PS的命令介绍,换了个参数执行如下:

[root@rac01 ~]# ps –eL|wc–l

17730

这次我们可以看到明显的进程异常,一个节点中居然存在16530个进程,而这里的-e是显示所有用户的进程,我们之前的-aux明显过滤掉了一些进程,这是因为

-a  显示所有终端机下执行的程序

-e  显示所有程序

前者只显示了终端上的所有执行程序,并没有显示所有程序,后者才是完整的显示了当前环境中的所有进程,接下来我们需要认真的排查这些非常规的进程,通过罗列,发现大量的ONS进程,如下:

技术分享

通过命令汇总一下,总共有16530个ons进程,

[root@rac01 ~]# ps –eL|grepons |wc –l

16530

这下终于找到了问题的根本原因,接下来我们就需要对该问题进行处理。

 

步骤二:ONS进程分析

ONS (Oracle Notification Services)官方解释如下A publish andsubscribe service for communicating information about all FAN events其主要负责RAC节点间的通讯,是一个很重要的服务进程,为什么会出现大量的ONS进程呢?ONS has Thousand Processes/Threads and Still Increasing (文档 ID 1547703.1)给出了原因

APPLIES TO:

OracleDatabase - Enterprise Edition - Version 11.2.0.1 and later
Information in thisdocument applies to any platform.

SYMPTOMS

The number of ONS processes/threads continuously increases. 

oracle   9470 17663  7447  0 7599 07:11?        00:00:00 /orahome/app/grid/opmn/bin/ons-d
oracle    9470 17663  8920  0 7599 07:12?       00:00:00 /orahome/app/grid/opmn/bin/ons -d
oracle    9470 17663 10425  0 7599 07:13?       00:00:00 /orahome/app/grid/opmn/bin/ons -d
..

The output ofcommand - "onsctl debug"

          IPADDRESS                  PORT    TIME   SEQUENCE  FLAGS
--------------------------------------- ------------- -------- --------
                    127.0.0.1 6200 511c7ccb 00000001 00000008
Listener:
 TYPE               BINDADDRESS              PORT  SOCKET
-------- -------------------------------------------- ------
Local                                 127.0.0.1  6100      5
Remote                                      any  6200      6
Remote                                      any  6200      -
Connection Topology: (1)
               IP                     PORT   VERS  TIME
--------------------------------------- ---------- --------
                        127.0.0.1    6200     4 511c7cdd=
                          **                127.0.0.1  6200 
                          **                127.0.0.1   6200 

Server connections:
   ID  CONNECTIONADDRESS             PORT  FLAGS  SENDQ REF WSAQ
-------- -------------------------------------------- ------ ----- --- ----
      6    127.0.0.1                     6200090026 00000 001     
Client connections:
  ID            CONNECTIONADDRESS    PORT  FLAGS  SENDQ REF SUB W
-------- -------------------------------------------- ------ ----- --- --- -
      1         internal    0 01008a 00000 001 002  
      2         127.0.0.1  610001001a 00000 001 001  
      5         127.0.0.1  610001001a 00000 001 000  
 request         127.0.0.1 6100 03201a 00000 001 000 

CAUSE

Misconfigured /etc/hostsfor loopback interface

-------------------------------------------------------------------
127.0.0.1       emsdb01 localhost.localdomainlocalhost
-------------------------------------------------------------------

SOLUTION

Change loopbackinterface to the following:

-------------------------------------------------------------------
127.0.0.1       localhost.localdomainlocalhost
-------------------------------------------------------------------

解决过程

步骤一:查看/etc/hosts文件

我们查看/etc/hosts文件,发现果然在127.0.0.1这一行,保留了主机名称,看来还是我们的实施人员实施过程不细致导致,去掉光标那列的主机名,如下

[root@rac01 ~]# cat/etc/hosts

127.0.0.1       rac01 localhost.localdomainlocalhost
192.168.4.23 rac01
192.168.4.24 rac02
192.168.4.27 rac01-vip
192.168.4.28 rac02-vip
192.168.4.30 scan-rac

       2个节点都调整完成后,按顺序重启下节点,再用onsctl debug命令执行结果如下

ADDRESS                  PORT    TIME   SEQUENCE  FLAGS
--------------------------------------- ------------- -------- --------
                    127.0.0.1 6200 511c7ccb 00000001 00000008
Listener:
 TYPE               BINDADDRESS              PORT  SOCKET
-------- -------------------------------------------- ------
Local                                 127.0.0.1  6100      5
Remote                                      any  6200      6
Remote                                      any  6200      -
Connection Topology: (1)
               IP                     PORT   VERS  TIME
--------------------------------------- ---------- --------
                  127.0.0.1              6200    4 511c7cdd=
               192.168.4.23            6200 
               192.168.4.24            6200 

Server connections:
   ID  CONNECTIONADDRESS             PORT  FLAGS  SENDQ REF WSAQ
-------- -------------------------------------------- ------ ----- --- ----
      6    127.0.0.1                     6200090026 00000 001     
Client connections:
  ID            CONNECTIONADDRESS    PORT  FLAGS  SENDQ REF SUB W
-------- -------------------------------------------- ------ ----- --- --- -
      1         internal    0 01008a 00000 001 002  
      2         127.0.0.1  610001001a 00000 001 001  
      5         127.0.0.1  610001001a 00000 001 000  
 request         127.0.0.1 6100 03201a 00000 001 000 

我们看到与之前相比,节点的IP已经正确的显示了,然后我们再查询ons的进程,已经减少到2个左右,问题彻底解决。

[root@rac01 ~]# ps –eL|grepons |wc –l

2

关键知识点

1.PS查看进程命令,注意有-和没得-的区别,例如我们要查看所有进程,应该是ps aux而如果用了ps –aux就不能显示所有进程,因为:

参数说明:

-a  显示所有终端机下执行的进程,除了阶段作业领导者之外。
 a  显示现行终端机下的所有进程,包括其他用户的进程。
-e  
显示所有进程
 e  列出进程时,显示每个进程所使用的环境变量。

2.11gr2 RAC实施的时候,一定要记得把hosts文件中127.0.0.1这列的主机名去掉,不然会导致大量的ons进程。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。