ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 小议服务进程与会话(三)

小议服务进程与会话(三)

原创 Linux操作系统 作者:realkid4 时间:2011-01-12 00:16:13 0 删除 编辑

共享模式探究

 

相对于专用模式,共享模式多了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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041224