首页 > Linux操作系统 > Linux操作系统 > 小议服务进程与会话(三)
共享模式探究
相对于专用模式,共享模式多了Dispatcher组件,还有在Dispatcher下管理的Server Process。
为了进行试验,笔者已经将wilson数据库转换为共享连接模式。
SQL> conn sys/sys@wilson as sysdba;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as SYS
SQL> show parameter shared_servers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_servers integer 2
在共享模式下,Shared_servers是一个重要参数,当为非零的时候,表示系统正处在shared连接模式下。
首先,我们已经通过PL/SQL Developer登录(开启两个command窗口),根据我们之前的讨论,应该有两个连接会话与Server对应。我们首先查看操作系统层面。
//本段代码无任何省略
[oracle@oracle11g ~]$ ps -ef | grep ora | grep -v grep
root 4868 1 0 08:10 ? 00:00:00 login -- oracle
root 5539 5507 0 08:25 pts/0 00:00:00 su oracle
oracle 5540 5539 0 08:25 pts/0 00:00:00 bash
oracle 6477 4868 0 09:26 tty1 00:00:00 -bash
oracle 6997 1 0 09:29 ? 00:00:00 /u01/oracle/bin/tnslsnr LISTENER -inherit
oracle 7028 1 0 09:29 ? 00:00:00 ora_pmon_wilson
oracle 7030 1 0 09:29 ? 00:00:00 ora_vktm_wilson
oracle 7034 1 0 09:29 ? 00:00:00 ora_gen0_wilson
oracle 7036 1 0 09:29 ? 00:00:00 ora_diag_wilson
oracle 7038 1 0 09:29 ? 00:00:00 ora_dbrm_wilson
oracle 7040 1 0 09:29 ? 00:00:00 ora_psp0_wilson
oracle 7042 1 0 09:29 ? 00:00:01 ora_dia0_wilson
oracle 7044 1 0 09:29 ? 00:00:00 ora_mman_wilson
oracle 7046 1 0 09:29 ? 00:00:00 ora_dbw0_wilson
oracle 7048 1 0 09:29 ? 00:00:00 ora_lgwr_wilson
oracle 7050 1 0 09:29 ? 00:00:01 ora_ckpt_wilson
oracle 7052 1 0 09:29 ? 00:00:01 ora_smon_wilson
oracle 7054 1 0 09:29 ? 00:00:00 ora_reco_wilson
oracle 7056 1 0 09:29 ? 00:00:03 ora_mmon_wilson
oracle 7058 1 0 09:29 ? 00:00:02 ora_mmnl_wilson
oracle 7060 1 0 09:29 ? 00:00:01 ora_d000_wilson
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7106 1 0 09:29 ? 00:00:00 ora_qmnc_wilson
oracle 7123 1 0 09:30 ? 00:00:02 ora_cjq0_wilson
oracle 7129 1 0 09:30 ? 00:00:00 ora_q000_wilson
oracle 7131 1 0 09:30 ? 00:00:00 ora_q001_wilson
oracle 7202 1 0 09:36 ? 00:00:00 ora_smco_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
oracle 7359 1 0 10:06 ? 00:00:00 ora_w000_wilson
oracle 7425 1 0 10:18 ? 00:00:00 ora_s002_wilson
oracle 7426 5540 0 10:19 pts/0 00:00:00 ps -ef
问题来了,我们登录了,为什么之前的oraclewilson的服务连接没有了。。。那么,会话方面呢?
SQL> select saddr,sid,paddr,action from v$session where username='SYS';
SADDR SID PADDR ACTION
-------- ---------- -------- --------------------------------
382A5CA4 29 38BC20AC Main session
3829DD60 32 38BC4C0C Command Window - New
38298888 34 38BC8D1C Command Window – New
会话方面和我们之前的研究一样,Developer中开启两个窗口,形成三个会话。关注的是PADDR(38BC20AC、38BC4C0C、38BC8D1C)地址。
我们检查V$process视图,查看是否有PADDR为这三个的Process。
SQL> select addr, spid, pname, program from v$process where addr in ('38BC20AC','38BC4C0C','38BC8D1C');
ADDR SPID PNAME PROGRAM
-------- ------------------------ ----- ------------------------------------------------
38BC20AC 7062 S000 oracle@oracle11g (S000)
38BC4C0C 7349 S001 oracle@oracle11g (S001)
38BC8D1C 7425 S002 oracle@oracle11g (S002)
发现,三个对应地址的进程是一系列SXXX的进程,难道这就是我们在共享模式下的Server Process吗?
Oracle视图中,有v$shared_server视图,名字上看就是共享模式下共享的Server查看视图。
SQL> select name,paddr, status from v$shared_server;
NAME PADDR STATUS
---- -------- ----------------
S000 38BC20AC WAIT(RECEIVE)
S001 38BC4C0C EXEC
S002 38BC8D1C WAIT(RECEIVE)
进程名称和地址均相同,看来在共享模式下,Server Process的名称均为SXXX(XXX为序号)。回顾刚才在ps –ef的检索,也可以定位到这些进程。
在基础知识中,我们说共享模式下有一个dispatcher组件,负责各个server process的分发管理,在ps –ef中是哪个呢?
我们先利用Oracle提供的视图v$dispatcher。
SQL> select name,network,paddr,status from v$dispatcher;
NAME NETWORK PADDR STATUS
---- -------------------------------------------------------------------------------- -------- ----------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=33522)) 38BC15D4 WAIT
同样思路,Dispatcher进程的名字为DXXX(XXX表示序号),也在PADDR=38BC15D4中找到了操作系统的进程。
SQL> select addr, spid, pname, program from v$process where addr='38BC15D4';
ADDR SPID PNAME PROGRAM
-------- ------------------------ ----- ------------------------------------------------
38BC15D4 7060 D000 oracle@oracle11g (D000)
操作系统层面
[oracle@oracle11g ~]$ ps -ef | grep 7060 | grep -v grep
oracle 7060 1 0 09:29 ? 00:00:01 ora_d000_wilson
果然定位到了分发dispatcher进程和管理下的Server Process。
最后一个问题,共享模式下,当我们断开了连接,Server Process会释放吗?
我们关闭了Developer程序,调用OS命令。
//第一次调用
[oracle@oracle11g ~]$ ps -ef | grep ora_s00
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
oracle 7425 1 0 10:18 ? 00:00:00 ora_s002_wilson
oracle 7488 5540 0 10:29 pts/0 00:00:00 grep ora_s00
//第二次调用
[oracle@oracle11g ~]$ ps -ef | grep ora_s00 | grep -v grep
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
//第三次调用
[oracle@oracle11g ~]$ ps -ef | grep ora_s00 | grep -v grep
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
发现,我们断开了连接,关闭了Developer。在专用模式下,Server Process应当被释放掉。但是我们发现,第一次调用的时候,对应原来的三个Server Process(S000、S001和S002)依然存在。片刻之后,第二次调用,发现S002被释放掉了。再片刻之后,第三次调用,发现两个S000和S001不会释放掉,一直在运行。
结论:上面已经可以清楚的看到共享模式工作的原理。
首先,我们说的共享,是Server Process可以在不同时间为多个会话服务。在一个时刻,只能为一个会话服务!当会话结束的时候,Server Process是可以不释放的。他的生命周期是通过Dispatcher来控制调度;
系统中保留多少个Server Process供Dispatcher调度,是初始化参数Shared_Server来确定。当请求数多于可以使用Shared_Server的时候,Dispatcher会自己安排创建新的Server Process,当然这是很消耗资源的。当请求数少于Shared_Server的时候,Dispather也会保留这个数目的连接数量。
那么,Shared_Server设置为多少合适呢?这个是一个经验加现实的解决。如果系统确定使用共享连接的Oracle配置(注意这个前提),要根据系统特性和实际并发用户数目来估算合适的Shared_Server,并且在生产环境不断的监控和调整。过多的额外Server创建,是可能引起系统Hange死的原因。
对Shared模式的见解
现在使用共享模式的应用是比较少的。因为在配置上存在一些困难问题,以及对性能拓展的缺陷,一些资料和专家们都建议不要设置共享模式。
专用模式和共享模式是Oracle早期提出的两种典型连接方式,分别是应对不同的数据库连接需求。
一般认为,数据库连接是一种珍贵的系统资源,创建和销毁都是很大的损耗。如果前端应用过于频繁的请求连接和释放连接,对应用系统整体和数据库都是很大的性能问题。比如早期的ASP、JSP页面应用,业务逻辑和数据库访问都在页面上。基于这种考虑,才出现的共享模式。
但是随着两个趋势,共享模式的重要性逐渐降低。第一个是专用模式的不断优化,虽然每个连接都要对应一个专用的Server Process,而且用后立即释放。但是Oracle对于这部分的优化力度也在加强,大量的Server Process创建和释放不存在过多的性能问题。相对应的是共享模式在会话数据保存、私有空间存在一些不能回避的问题。而且共享模式拓展性受到参数约束很大。
另一个趋势就是企业级软件实践的推进。J2EE、.NET为代表,各种开源框架为先锋的软件风潮,给我们提供了一些解决问题的思路和方法。连接池、中间件的思路和产品,为企业级应用提供了稳定可靠的数据库连接保证和重用保证。在数据库层面实现的连接共享,已经可以方便的在应用层面加以实现。
在一些资料中,甚至提出了Oracle连接模式的第三种模式,就是shared pool方式。借助Oracle提供的中间件产品或者第三方的中间件产品,专用模式下的数据库对外还可以提供高并发、多用户的连接实现。
综合上述内容:笔者还是建议尽可能将共享连接模式实现在应用层面,不要轻易的选择数据库的共享连接模式。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-683641/ ,如需转载,请注明出处,否则将追究法律责任。