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