天天看點

共享模式 & 專有模式

概念

專有連接配接:用一個伺服器程序響應一個用戶端請求

共享連接配接:在共享伺服器模式下,用戶端通過監聽連接配接到dispatcher之後,dispatcher會随機配置設定一個端口,此時用戶端斷開和監聽的連接配接,通過配置設定的端口和dispatcher連接配接。和監聽的連接配接是短暫的。

适用場景

對于連接配接數不多的應用,适宜用專有連接配接,客戶的請求響應及時;

對于連接配接數較大的應用,适宜用共享連接配接,充分利用系統資源

通用參數

remote_listener:可以實作資料庫和listener的分離。

單機環境的remote_listener 一般為空。

rac環境下,listener是跟随叢集crs啟動的。而且資料庫 rdbms的啟動要依賴asm執行個體的資源,是以不存在啟動資料庫後,listener沒啟動,當然出現故障除外。

local_listener是該節點的listener資訊

remote_listener一般是scan的資訊

local_listener

pmon隻會動态注冊port等于1521的監聽,否則pmon不能動态注冊listener,要想讓pmon動态注冊listener,需要設定local_listener參數。

listener_networks:配置多個remote_listener、local_listener時需要,平時很少用

例子:alter system set LISTENER_NETWORKS='((NAME=network1)(LOCAL_LISTENER=listener_net1)(REMOTE_LISTENER=scanone.gaopp.com:1521))','((NAME=network2)(LOCAL_LISTENER=listener_net2)(REMOTE_LISTENER=remote_net2))';

共享參數

SHARED_SERVERS:如果shared_server值為0,則表示資料庫沒有啟動共享服務模式。 這個參數是配置shared server必須的,而且隻有這個參數是必須的。它指定了當執行個體啟動的時候 shared server process 啟動的數量,不要将這個參數設定得太大,否者啟動資料庫instance的時候就會花更多時間,ORACLE啟動過後會根據負載來動态調整shared_servers

MAX_SHARED_SERVERS:oracle在同一個時刻最大能夠使用的shared server process.不要将這個參數設定小于shared_servers,如果動态修改shared_servers大于max_shared_servers,oracle會覆寫max_shared_servers的值,此時你需要修改max_shared_servers.同時也不能大于processes。這個參數是為了給占用很大資源操作而設的(批處理),為了預留一些process 給DBA任務(rman備份)

SHARED_SERVER_SESSIONS:指定了總共允許的的shared server session 的數量。如果設定了這個參數,那麼就不要将這個值超過sessions,如果沒有設定這個值,那麼隻要還有空閑的session,就可以被使用。設定這個值是為專用連接配接預留的User Sessions.

DISPATCHERS: 共享連接配接的分派器數量

MAX_DISPATCHERS: 可同時并發的共享連接配接的最大的分派器數量,此參數目前可忽略;

CIRCUITS: 可用的虛拟回路數(Specifies the total number of virtual circuits that are available for inbound and outbound network sessions)

記憶體

large_pool_size

相比于專用伺服器模式,共享服務模式的UGA在SGA中,而專用伺服器模式的UGA在PGA當中,共享伺服器模式下如果設定了large_pool_size則使用者的UGA會在large_pool中。MTS減少的記憶體實際上是專用伺服器模式下每個使用者連接配接到作業系統程序所需的記憶體,共享伺服器模式由于限制了Server Process的數量,減少了建立Server Process所需要的記憶體,同時當并發量大時不需要頻繁的建立和删除程序,減少了與之對應的開銷,提升了并發量。是以共享伺服器模式适合于高并發,處理量小的業務系統。

程序

資料庫啟動之後比專用伺服器模式會多出兩種程序,一種是排程程序(Dnnn),一種是共享伺服器程序(Snnn)。來自用戶端的請求會被dispatcher接受,然後dispatcher将請求置入Request隊列。空閑的Server Process會按照request隊列開始處理隊列中的請求。處理過後的結果放入Response隊列中。最後再由DIspatcher來将最後的結果傳回給用戶端。

Snnn:分派器程序使得用戶端程序可以共享數量有限的伺服器程序。可以為單個資料庫執行個體建立多個分派器程序。分派器程序的最佳個數取決于作業系統的限制和每個程序的連接配接數。

Dnnn:在共享伺服器配置中,每個共享伺服器程序為多個用戶端請求服務。除了共享伺服器程序不與特定用戶端程序相關聯外,共享伺服器程序和專用伺服器程序提供相同的功能。

優點

減少了執行個體中的程序數

增加了更多并發使用者的數量

實作動态負載均衡

減少了空閑伺服器程序數量

減少了執行個體PGA記憶體

缺點:由于共享伺服器模式存在種種問題,同時中間件也完全可以實作連接配接池的效果,是以一般情況下不會共享伺服器模式,使用專用伺服器模式即可。

共享伺服器的代碼路徑比專用伺服器長,是以它天生就比專用伺服器慢。

存在人為死鎖的可能,因為它是串行的,隻要一個連接配接阻塞,則該伺服器程序上的所有使用者都被阻塞,并且極可能死鎖。

存在獨占事務的可能,因為如果一個會話的事務運作時間過長,它獨占共享資源,其它使用者隻能等待,而專用伺服器,每個用戶端是一個會話。

共享伺服器模式限制了某些資料庫特性,例如:不能單獨啟動和關閉執行個體,不能進行媒體恢複,不能使用Log Miner,并且SQL_TRACE沒有意義(因為是共享而不是目前會話的)。

event

event 10257(後續會距離詳細說明)

視圖

V$DISPATCHER:提供DISPATCH程序資訊,包括DISPATCH名稱,網絡,位址,狀态,統計資訊和索引号等;

有記錄,說明是配置了dispatchers參數

V$DISPATCHER_CONFIG:提供DISPATCH的配置資訊

V$DISPATCHER_RATE:提供DISPATCH的速度(RATE)統計

V$CIRCUIT:提供使用者通過DISPATCH連接配接到資料庫的虛拟回路資訊(virtual circuits)

有記錄說明目前有使用共享模式的連接配接,無記錄則不能判定伺服器模式

V$SHARED_SERVER:提供共享伺服器資訊

有記錄,且STATUS字段為WAIT(COMMON),則說明啟動共享;

無記錄,或STATUS字段為TERMINATED,則說明沒有啟動共享伺服器

V$SHARED_SERVER_MONITOR:提供共享伺服器的優化資訊

V$QUEUE:提供共享伺服器隊列資訊.

V$SESSION:如果SERVER字段的值除了DEDICATED,還有NONE,則說明目前執行個體啟動了共享伺服器,并且SERVER為NONE的會話正使用共享伺服器連接配接,同時,如果隻顯示有DEDICATED,則不能說明伺服器就一定工作在專用伺服器下面,此時也有可能啟動了共享模式。隻是目前連接配接到資料庫的都是專用伺服器模式。

隻需要将參數shared_servers設定為0,即可關閉資料庫的共享模式。執行該腳本後,所有以共享方式連接配接到資料庫都不能成功,但是未釋放的共享連接配接會繼續保持連接配接,直到斷開為止。

alter system set shared_servers=0;

如果同時将參數shared_servers和max_shared_servers都設定為0,那麼共享連接配接方式将被終結。所有的共享方式連接配接都會斷開(已經連接配接的會話也會斷開)

設定shared_servers這個參數,将其值設定為大于0即可開啟伺服器共享模式。其他的共享伺服器參數可以不用設定,但是最好也設定一下max_shared_servers參數

alter system set shared_servers=1 scope=both;

alter system set max_shared_servers =24 scope=both;

關于參數dispatchers的設定,可以使用下面指令

alter system set dispatchers='(protocol=TCP)(disp=8)(serv=xxx)’

前面表示的是協定,disp表示排程器(dipatcher)的程序數量,service分别指定要采用共享伺服器模式的服務名稱。使用上面的模式指定隻啟動某個服務的共享模式,如果要設定所有服務都使用共享模式,則設定為:

alter system set dispatchers='(PROTOCOL=TCP)';

檢視V$SESSION視圖

通過v$session視圖的SERVER字段來進一步判斷目前連接配接模式

檢視連接配接資料庫的tns配置檔案,如下所示