您的位置:首页 > 数据库 > Oracle

【Oracle】共享服务器模式详解及配置

2014-03-04 08:51 543 查看
一、共享服务器模式工作机制:



共享服务器模式(SHARED SERVER,也叫MTS Multi-Threaded Server):

数据库启动之后比专用服务器模式会多出两种进程,一种是调度进程(dispatcher),一种是共享服务器进程。来自客户端的请求会被dispatcher接受,然后dispatcher将请求置入Request队列。空闲的Server Process会按照request队列开始处理队列中的请求。处理过后的结果放入Response队列中。最后再由DIspatcher来将最后的结果返回给客户端。

在共享服务器模式下,客户端通过监听连接到dispatcher之后,dispatcher会随机分配一个端口,此时客户端断开和监听的连接,通过分配的端口和dispatcher连接。和监听的连接是短暂的。

相比于专用服务器模式,Server Process的UGA在SGA中,而专用服务器模式的UGA在PGA当中,共享服务器模式下如果设置了large_pool_size则用户的UGA会在large_pool中。MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,共享服务器模式由于限制了Server Process的数量,减少了建立Server Process所需要的内存,同时当并发量大时不需要频繁的创建和删除进程,减少了与之对应的开销,提升了并发量。所以共享服务器模式适合于高并发,处理量小的业务系统。

但相比于专用服务器模式,共享服务器模式也存在很大的问题:

1)共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。

2)存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。

3)存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。

4)共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。

由于共享服务器模式存在种种问题,同时中间件也完全可以实现连接池的效果,所以一般情况下不会共享服务器模式,使用专用服务器模式即可。

共享服务器模式配置

配置共享服务器模式需要配置以下参数:

dispatchers:(必须配置的)为指定的协议指定调度进程的初始数量。

shared_servers:初始启动几个共享服务器进程

max_shared_servers:最多启动多少个共享服务器进程

max_dispatchers:调度进程的最大数量

shared_server_sessions:共享服务器模式最多可以有多少个session,如果共享服务器模式连接数超过此设置则会使用专用服务器模式,注意此值大小要小于数据库中sessions的设置。如果此值不设置则会所有session都为共享服务器模式、

circuits:共享服务器模式下oracle采用了virtual circuits来记录了哪个请求来自于哪个客户端,以保证请求处理完后能返回正确的客户端。circuits的设置限制了请求队列和响应队列中可用回路的总数量。共享服务器模式下只有一个请求队列,但每个dispatcher有自己的响应队列。

large_pool_size:由于在UGA在large_pool中,所以large_pool的合适大小有助于提升系统的性能,能放下所有共享服务器进程的UGA就好。

以下是具体操作过程:

SYS@ORCL>show parameter processes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 0
db_writer_processes integer 1
gcs_server_processes integer 0
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 300
SYS@ORCL>show parameter sessions

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
logmnr_max_persistent_sessions integer 1
sessions integer 335
shared_server_sessions integer
SYS@ORCL>show parameter dispatcher

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=ORCLXD
B)
max_dispatchers integer
SYS@ORCL>alter system set dispatchers='(PROTOCOL=TCP)(DISPATCHERS=2)(PROTOCOL=IPC)(DISPATCHERS=1)';
——在这里为TCP协议配置了两个调度进程,IPC协议配置了1个调度进程。
System altered.

SYS@ORCL>alter system set max_dispatchers=10;
——最多启动10个调度程序
System altered.

SYS@ORCL>show parameter shared_server

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_server_sessions integer
shared_servers integer 1
SYS@ORCL>alter system set shared_servers=10;

System altered.

SYS@ORCL>alter system set max_shared_servers=20;

System altered.

SYS@ORCL>alter system set shared_server_sessions=100;

System altered.

SYS@ORCL>show parameter circuits

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
circuits integer
SYS@ORCL>alter system set circuits=5000;

System altered.

SYS@ORCL>show parameter large_pool

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
large_pool_size big integer 0
SYS@ORCL>alter system set large_pool_size=200M;

System altered.

配置完毕,现在来查看调度进程

SYS@ORCL>select name from v$dispatcher;

NAME
----
D000
D001
可以看到已经启动两个调度进程。

共享服务器模式下必须要配置tns才能进行连接。

[oracle@jp ~]$ cd /u01/app/oracle/product/10.2.0/db_1/network/admin/
[oracle@jp admin]$ ls
listener.ora samples shrept.lst tnsnames.ora
[oracle@jp admin]$ vi tnsnames.ora
link_test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = jp)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)
orcl_s=
(description =
(address = (protocol = tcp)(host = jp)(port = 1521))
(connect_data =
(server = shared)
(service_name = ORCL)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)

TNS配置完成,下面通过共享服务器模式进行连接

[oracle@jp admin]$ sqlplus sys/oracle@orcl_s as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 3 06:57:03 2014

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SYS@orcl_s>select server from v$session;

SERVER
---------
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
SHARED
DEDICATED
DEDICATED
DEDICATED
DEDICATED

SERVER
---------
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED
DEDICATED

22 rows selected.

存在shared,共享服务器模式配置成功。

找到本session对应的spid

SYS@orcl_s>select p.spid from v$session s,v$process p where s.sid=userenv('sid') and s.paddr=p.addr;

SPID
------------
16929
根据上面查出的结果可以看到对应的共享服务器进程

[root@jp ~]# ps -ef |grep 16929
oracle 16929 1 0 06:42 ? 00:00:00 ora_s001_ORCL
root 17750 16529 0 07:01 pts/2 00:00:00 grep 16929
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: