oracle 12c 新增的LREG进程及其动态注册的过程
因刚好遇到12c 监听注册的问题,现将以前关于oracle 12c lreg进程的一些学习文章分享下:
在oracle数据库中pmon进程一直承担着较多的工作,例如清理进程以及监听注册等,这相当于一个人需要同时做好几件工作,而当其中一件让他应接不暇时,也许这会影响它负责的其他工作,曾经在11g r2版本的数据库遇到过pmon进程因忙于清理异常中断的会话而导致服务更新和服务注册出现异常的情况。
在oracle12c以前的版本中服务注册一直都是由PMON进程负责,从12c起oracle引入了LREG(listener registration)后台进程接管了这部分工作从而减轻PMON的工作。
一.Oracle监听及服务注册:
在Oracle中,监听器是一个监测连入客户端连接请求并建立和管理会话的服务器端进程。这在当数据库实例启动后不同时间里,数据库实例与监听器联系并建立了一条到该实例的通信路径。
服务注册让监听器能够确定数据库服务及其service handlers(服务处理程序)是否可用。在注册期间,服务注册进程向listener提供实例名称,数据库服务名称以及service handlers的类型(专用或共享)和地址。
在oracle 12c以前,负责服务注册的是pmon进程:
而在12c以后,负责服务注册的换成了LREG进程:
监听没有启动LREG进程不能注册服务,但是LREG进程会定时尝试注册,如果local_listener没有配置,LREG会尝试连接默认的1521端口,直到监听进程启动,在监听启动后LREG进行周期注册前,同样也可以使用”alter system register”立即注册服务.litener的注册信息。实际这个过程是动态注册的过程。
另一个需要注意的是如果LREG进程死了,会同样和pmon一样,数据库实例也会crash。12c直接报出的ora-500,ora-500则是监听注册进程死掉。
二.动态注册的工作过程研究:
1.使用oradebug Event 10257 trace name context forever, level 16来将lregdump出来。可以初步看出lreg的工作过程:
从dump出来的信息可以看出,lreg进程每3秒更新一次状态,而到约每60秒时便会实例信息进行注册。以下在监听没有启动的情况下,LREGwoken up to process network events after 0 cs之后成功的数量依然为0,说明此时无法注册成功。
而当将监听启动后,在60秒后的下一个注册是便可以成功注册。
2.使用strace追踪lreg进程的工作过程
当数据库运作时其背后发生了很多事,数据库也是一个应用软件,其背后的这一切都可以追溯到操作系统的工作原理。 在对lreg进程进行追踪可能需要先了解orcle监听动态注册中的两个概念:文件描述符和Sockets文件。
当监听进程启动时,它会在/var/tmp/.oracle下创建两个套接字文件。
这些文件均是socket文件, 且s#12214.1中的12214为进程号,则应为监听的进程号,这些socket文被用作本地客户端使用进程间通信协议(ipc)和不同的oracle的进程通信,而这些进程包括:tns监听,css,crs,evm守护进程;甚至数据库和asm实例。这些socket由‘主动监听’的进程创建。在这里oracle监听创建这些socket文件主要使用用作lreg和tnslsnr通信。
同时,会在/proc目录下相应进程号文件下创建几个文件描述符,这些文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
我们可以看到有几个文件描述符,因此,确定有为进程创建的文件描述符和sockets。
那么LREG过程(以前的版本PMON)进行的动态注册与文件描述符和sockets文件相关的过程是怎样的呢?
这些进程通过系统调用来查看监听器是否启动,如果没有发现监听进程,则等待,并且在3000毫秒之后重新尝试。直到监听启动时,文件描述符被监听打开,并被进程绑定以建立彼此之间的连接。
要找到LREG进程正在做什么,我使用STRACE OS实用程序来跟踪它的工作。11g中的PMON进程的输出不是完全相同的,因为它不是一个专门用于在监听器中注册实例的过程。另一方面,LREG的唯一目的就是动态注册,这样可以解释两个进程之间使用的系统调用之间的差异。
以下是STRACELREG进程的日志:
从以上strace日志可以看到主要调用epoll_wait()函数,该函数表示通过文件描述符来等待某个I/O事件发生的时间。实际上这就是一个持续等待某个IO事件的发生,而表现到数据库层面,应该就可以理解为监视监听进程是否启动的过程,在epoll_wait(7, {}, 1024, 3000)的最后一个参数显示的时间以毫秒3000毫秒为单位(也就是3秒)。
关于epoll_wait的解释:
接下来的两行getrusage()函数表示资源使用消耗,而后面times()为时间函数返回时间,在前面的时间打印很明显可以看出是每3秒执行一次函数。
再继续往下看是socket函数其后面的值为10,表示使用一个socket函数来处理文件描述符10。猜测这是用来与监听器进程建立连接的文件描述符。这里使用的套接字是NETLINK,用于创建内核和网络层之间的连接。
进一步查看下面的函数,是对前面函数返回的文件描述符10进行尝试绑定。
在接下来的几行中,这个文件描述符将被用于与PID 2582的连接,而这个PID 2582是LREG进程的PID。
正在尝试与IP地址127.0.0.1建立连接,端口号是1521。
由于没有启动监听进程,并且还没有文件描述符10与进程LREG相关联,因此连接被拒绝,即也没有建立的连接。
而在启动监听之后,lreg发现监听,并可以正常建立连接后则没有没有报出被拒绝的错误。
在以上lreg进程活动的日志可以看出 较多的epoll_ctl与epoll_wait函数调用,epoll在这里epoll貌似一种不断来触发监听并操作某些文件描述的过程,lreg调用epoll_wait每3秒来监测监听进程是否启动,当发生注册时使用epoll_ctl去添加删除某个文件描述符。具体的确实一时无法了解清楚。
在监听程序启动后,可以使用lsof –i TCP:1521 命令 来看lreg进程与tnslsnr进程的连接。
ESTABLISHED的意思是建立连接。表示两个进程正在通信。 ncube-lm是nCube License Manager (即ncube管理的一个许可证明),意思是被允许,被认证开放的意思,这是tnslnr开启的并处于LISTEN状态。
三.总结:
oracle 12c除了服务注册方面,其网络服务架构在数据库并没有变化。在以前的版本中,服务注册是通过PMON进程来完成。现在 由LREG(listener registration)来处理。LREG是一个实例级别的后台进程并且是非常重要,一旦该进程被杀掉,将导致数据库实例崩,它会做一切 PMON 过去在实例注册的方面执行的,例如:在监听日志 listener.log 里 service_update, service_register, service_died 。
由于工作被专属化,这里我们可以更清晰的了解其工作的过程,例如每3秒一次的监测,每60秒一次的尝试注册等,都可以清楚的看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。