Dedicated(专用模式)

用户进程和服务器进程是分开的。

每个用户进程都有自己的服务器进程。

用户进程和服务器进程可在不同的机器上运行,以利用分布式处理的优势。

用户进程和服务器进程的比率是1 1

即使用户进程不发出数据库请求,专用服务器也存在,只是保持空闲状态。

此处所用的程序接口取决于用户进程和专用服务器进程是否在同一台机器上。如果在同一

机器上,进程间的程序接口将使用主机操作系统的交互进程通信(IPC) 机制。

下图展示了Oracle专用服务模式下的客户进程连接状态:

 wKioL1V0_c3DfoHzAABgMwn-Gmw854.gif

wKioL1WJHgCQhsxcAAAwM5zbi8M478.gif

 

Shared(共享模式)

减少针对某一例程的进程数目

增加可服务的用户数

实现负载平衡

减少空闲服务器进程的数目

减少内存占用和系统开

wKioL1V0_wiSa0qoAABKhio-9y4535.gif

wKiom1WJHEeiqnqxAAA6U7GT55o186.gif

默认情况下数据库创建的连接模式为专享模式,但即使修改成共享连接模式以下几种情况也必定是以专享模式连接的:

  1. 当批量提交的job时(对于服务进程,一个job几乎没有空闲时间)。

  2. 使用RMAN进行备份,恢复或修复数据库时。

 

除了Dedicated和Shared,Oracle还提供了常驻连接池模式(Database Resident Connection Pooling)。这种模式主要用于web应用的请求

通过一个简单的例子来对比三种连接模式下对内存的需求:

考虑一个应用每一个会话请求的内存大小为400K,而每一个服务进程需要使用4M的内存,当pool size为100并且共享模式最大连接数为100。

 

专享模式下

Memory used = 5000 X (400 KB + 4 MB) = 22 GB

共享模式下

Memory used = 5000 X 400 KB + 100 X 4 MB = 2.5 GB

超出2.5G,2G来自于SGA区

常驻连接池

Memory used = 100 X (400 KB + 4 MB) + (5000 X 35KB)= 615 MB

这里每一个代理进程的消耗内存接近35k

 

配置共享模式

共享模式下涉及到的参数有:

SHARED_SERVERS 指定共享服务进程启动时的最小数值。

MAX_SHARED_SERVERS 指定可同时运行的共享服务进程的最大值。

SHARED_SERVERS_SESSIONS 指定可同时连接共享进程的用户会话总数。 

DISPATCHERS 为共享模式配置调度进程 

MAX_DISPATCHERS 指定允许同时运行的调度进程的最大数,该参数现在可能被忽略了。

CIRCUITS 指定网络会话流入流出可用的总的虚拟环路。

 

因为要开启共享模式,SHARED_SERVERS设置的值必须大于0,而其他相关配置可以不需要,当SHARED_SERVERS值大于0时,调度进程也会启动,即使没有配置dispatchers参数

 

在DBCA创建数据库的过程中,Oracle会自动创建一个用于XML DB(XDB)的调度进程。该配置仅允许会话以共享模式连接数据库,但要进行一些常规的操作(如提交SQL语句),用户必须额外的配置调度或替换XDB调度配置

 

alter system set shared_servers=5;

 

关于MAX_SHARED_SERVERS没有默认值,如果该值为空,PMON进程会根据请求开启足够多的共享服务进程。但也要受到以下参数的限制:

  1. process 的限制 

  2. 空闲process槽的最小值(至少1/8的总进程槽数,或为2当process设置的值小于24时)

  3. 系统资源

 

SHARED_SERVERS_SESSIONS用于限制并发共享服务的用户会话最大数,该参数是动态变化的,其中还保留了用于专享服务的数据库会话。这确保管理任务如备份,还原和恢复数据库时不会占用共享服务的会话。

 

CIRCUITS 都没有默认值,该值取决于调度参数的值和系统资源。因此尽量对其作出限制。

alter system set circuits=<equal session>;

 

关于DISPATCHERS的设置:

限定地址协议和最小启用调度进程数

dispatchers='(address=(pro=tcp) (host=10.x.x.x) (dispatchers=2))'

dispatchers='(description=(address=(pro=tcp) (host=10.x.x.x) (dispatchers=2)))'

限制dispatchers的最大网络连接和会话数

dispatchers='(pro=tcp) (dispatchers=2) (conn=100) (sess=100)'

为dispatchers指定别名和服务名,用于PMON进程注册调度信息。

dispatchers='(pro=tcp) (dispatchers=2) (list=orcl) (serv=orcl)'

允许多路复用和连接池

dispatchers='(pro=tcp) (dispatchers=2) (multi=on) (poo=on)'

 

dispatchers可以多在配置文件中写多行,但是必须放在一起。或者以逗号分隔放在同一行配置中。

dispatchers='(pro=tcp) (dispatchers=2) (multi=on) (poo=on)','(pro=tcps) (dispatchers=2)'

or

dispatchers='(pro=tcp) (dispatchers=2) (multi=on) (poo=on)'

dispatchers='(pro=tcps) (dispatchers=2)'

 

如何决定调度进程的多少:

dispatchers=ceil(max_concurrent_sessions / connections for each dispatcher)

connections for each dispatcher由系统决定,一个系统允许单个进程的最大连接数即为connections for each dispatcher的取值。

 

配置TNSNAME.ORA文件,将客户端连接的SERVER方式修改成SHARED模式。

 

配置好上述参数后,就可以通过共享方式连接数据库了。连接时需要指明实例名

通过lsnrctl services命令观察实例的注册信息

sqlplus user/password@sid

 

可以通过下列视图来验证和观察性能:

select name, paddr, network, status, accept, messages, listener, conf_indx from v$dispatcher;

select maximum_connections,maximum_sessions,servers_started from v$shared_server_monitor;

select circuit,dispatcher,server,waiter,saddr,status,queue,messsages,bytes from v$circuit;

v$dispatcher_config
v$shared_server
v$queue
v$shared_pool_reserved
v$dispatcher_rate

v$sga

v$sgastat

 

修改dispatchers参数可以通过以下方式:

alter system set dispatchers=‘(index=0) (pro=tcp) (dispatchers=2) (multi=on) (poo=on)','(index=1) (pro=tcps) (dispatchers=2)';

这里的index后的值表示调度进程的序列,可以在v$dispatcher_config中获得

 

关闭特定的dispatchers进程

alter system shutdown immediate ‘name of dispatchers’

这个dispatchers的名称来自于v$dispatcher表的name字段。