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

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

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

[[email protected] bin]# su- grid

su: cannot set userid: Resource temporarily unavailable

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

问题分析

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

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

[[email protected] ~]# 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

[[email protected] ~]# 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就发出警告,接下来我们就应该查看下用户的进程数,如下

[[email protected] ~]# ps –Ugrid |wc –l

156

[[email protected] ~]# ps –aux|wc –l

659

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

[[email protected] ~]# ps –eL|wc–l

17730

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

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

-e  显示所有程序

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

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

[[email protected] ~]# 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这一行,保留了主机名称,看来还是我们的实施人员实施过程不细致导致,去掉光标那列的主机名,如下

[[email protected] ~]# 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个左右,问题彻底解决。

[[email protected] ~]# 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进程。

时间: 2024-10-13 13:08:59

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

su切换用户报错cannot set user id: Resource temporarily unavailable

su: cannot set user id: 资源暂时不可用 登录root su - tomcat 报错: cannot set user id: Resource temporarily unavailable tomcat账号突然不可用. 根本原因是:linux操作系统默认最大允许进程数是1024. 随着应用的增加,我们的需求已超过了1024 曾经改过nproc配置: cat >> /etc/security/limits.conf << EOF *           so

修改linux用户的可以打开的最大文件数和进程数(fork: retry: Resource temporarily unavailable)

今天,jenkins发布应用时,遇到一个报错,如下: /etc/profile:fork: retry: Resource temporarily unavailable Google了一下,网上大家大部分说原因可能是,用户的进程数或者文件打开数,达到了限制.按照这个思路,我去查问题,发现用户的进程数为200多,文件打开数为1300多 而通过ulimit–a,看到 openfiles                      (-n) 1024 maxuser processes        

Linux报错-bash: fork: retry: Resource temporarily unavailable和进程描述符之间的关系

在公司服务器上切换用户,出现 "-bash: fork: retry: Resource temporarily unavailable"这样的报错,查询得知是普通用户能够使用的进程数太少和文件描述符太小导致的,每一个文件描述符会和一个文件对应,但是很多文件描述符也会和一个文件对应.相同的文件可以被不同的进程打开,也可以被同一个进程打开多次.我们可以从系统层面和进程层面来查看相应的文件描述符. 一,系统层面的文件描述符 涉及到系统层面的,基本上都是通过修改内核参数来实现的,修改系统中的

Resource temporarily unavailable用户的连接数设置的太小

-bash:fork:Resource temporarily unavailable的问题 出现这个问题的原因是linux用户的连接数设置的太小,只要修改max user processes就可以    www.2cto.com 设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个: ulimit -u 10000 ulimit -a core file size          (blocks, -c) 0 data seg size          

TIME_WAIT状态的连接过多导致系统端口资源耗尽问题(2)

继上次解决完mysql连接过多,导致的TIME_WAIT进程过多问题之后,最近这个现象再一次出现,并且依然和之前一样严重.只不过这次出现问题的mysql 服务跟上次不一样,上一次主要是mysql master server,而这一次是mysql slave server.所以这意味着,我们上次解决了部分问题,但没有彻底解决,还存在一部分问题.所以这次彻底的把这个问题好好梳理一下. 再次确认一下TIME_WAIT进程的所属服务: sudo netstat -anp | grep TIME_WAIT

生产上数据库大量的latch free 导致的CPU资源耗尽的问题的解决

中午的时候,我们生产上的某个数据库,cpu一直居高不下 通过如下的sql语句,我们查看当时数据库的等待,争用的情况: select s.SID, s.SERIAL#, 'kill -9 ' || p.SPID, s.MACHINE, s.OSUSER, s.PROGRAM, s.USERNAME, s.last_call_et, a.SQL_ID, s.LOGON_TIME, a.SQL_TEXT, a.SQL_FULLTEXT, w.EVENT, a.DISK_READS, a.BUFFER_

UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork 创建的新进程与调用进程之间的关系.父子进程的数据共享问题等.fork 是否可以无限制的调用?如果不行的话,最大限制是多少?另外,我们还将学习一个 fork 的变体 vfork. 1 fork 创建的新进程与调用进程之间的关系 UNIX 操作系统中的所有进程之间的关系呈现一个树形结构.除了进程 ID

进程控制(2): 进程操作

进程是系统中基本的执行单位,本节将介绍基本的进程控制原语,包括进程的创建与退出,以及设置除进程标识符(PID)以外的其他标识符. 1 创建进程 Linux系统允许任何一个用户进程创建一个子进程,创建成功后,子进程存在于系统之中,并且独立于父进程.该子进程可以接受系统调度,可以得到分配的系统资源.系统也可以检测到子进程的存在,并且赋予它与父进程同样的权利. Linux系统下使用fork()函数创建一个子进程,其函数原型如下: #include <unistd.h> pid_t fork(void

在windows 2003 sp2 或者 2008 rac环境中,可能会由于默认的SNP( Scalable Networking Pack)特性会导致 实例驱逐或者节点驱逐

在windows 2003 sp2 或者 windows 2008 rac环境中,可能会由于默认的SNP( Scalable Networking Pack)特性会导致 实例驱逐或者节点驱逐 参考原文: RAC on Windows: Recurring Instance and/or Node Evictions May Be Caused by Default SNP Features Available for Windows Server 2003 SP2 and 2008 (Doc I