一、共享服務器模式工作機制:
共享服務器模式(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