共享模式 & 專有模式

Ryan_Bai發表於2019-11-13

一、簡介

概念

  • 專有連線:用一個伺服器程式響應一個客戶端請求

  • 共享連線:在共享伺服器模式下,客戶端透過監聽連線到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,則不能說明伺服器就一定工作在專用伺服器下面,此時也有可能啟動了共享模式。只是目前連線到資料庫的都是專用伺服器模式。

六、關閉資料庫共享模式

  1. 只需要將引數shared_servers設定為0,即可關閉資料庫的共享模式。執行該指令碼後,所有以共享方式連線到資料庫都不能成功,但是未釋放的共享連線會繼續保持連線,直到斷開為止。

    alter system set shared_servers=0;
  2. 如果同時將引數shared_servers和max_shared_servers都設定為0,那麼共享連線方式將被終結。所有的共享方式連線都會斷開(已經連線的會話也會斷開)

七、開啟資料庫共享模式

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

    alter system set shared_servers=1 scope=both;
    alter system set max_shared_servers =24 scope=both;
  2. 關於引數dispatchers的設定,可以使用下面命令

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

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

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

八、當前模式的判斷

  1. 檢視V$SESSION檢視
    透過v$session檢視的SERVER欄位來進一步判斷當前連線模式

    SELECT SID, USERNAME, OSUSER, MACHINE,TERMINAL, SERVER
      FROM V$SESSION
     WHERE USERNAME IS NOT NULL;
  2. 檢視連線資料庫的tns配置檔案,如下所示

    TEST =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.22)(PORT = 1521))
        )
        (CONNECT_DATA =
          # SERVER = DEDICATED為專用服務模式
          (SERVER = SHARED)
          (SERVICE_NAME = epps)
        )
      )

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2663969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章