用户才实施了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 (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)给出了原因
OracleDatabase - Enterprise Edition - Version 11.2.0.1 and later
Information in thisdocument applies to any platform.
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
Misconfigured /etc/hostsfor loopback interface
-------------------------------------------------------------------
127.0.0.1 emsdb01 localhost.localdomainlocalhost
-------------------------------------------------------------------
Change loopbackinterface to the following:
-------------------------------------------------------------------
127.0.0.1 localhost.localdomainlocalhost
-------------------------------------------------------------------
我们查看/etc/hosts文件,发现果然在127.0.0.1这一行,保留了主机名称,看来还是我们的实施人员实施过程不细致导致,去掉光标那列的主机名,如下
[root@rac01 ~]# cat/etc/hosts
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 列出进程时,显示每个进程所使用的环境变量。