共享伺服器模式(shared server)和專用伺服器模式(dedicated server)

還不算暈發表於2014-04-25
轉載自:http://blog.csdn.net/tianlesoftware/article/details/5695784
二. 說明
2.1 Dedicated server 說
對於專用伺服器配置,在登入時,Oracle 總會建立一個新的程式,這個伺服器程式會在會話生存期中專門這個連線服務。對於每個會話,都會出現一個新的專用伺服器,會話與專用伺服器之間存在一對一的對映。按照定義,這個專用伺服器不是例項的一部分。客戶程式(也就是想要連線資料庫的程式)會通過某種網路通道(如TCP/IP socket)與這個專用伺服器直接通訊,並由這個伺服器程式接收和執行我的SQL。如果必要,它會讀取資料檔案,並在資料庫的快取中查詢我要的資料。也許它會完成我的更新語句,也可能會執行我的PL/SQL 程式碼。這個伺服器程式的主要目標就是對我提交的SQL 呼叫做出響應。

2.2 Shared server 說明

2.2.1  說明
       共享伺服器(shared server),正式的說法是多執行緒伺服器(Multi-Threaded Server)或MTS。如果採用這種方式,就不會對每條使用者連線建立另外的執行緒或新的UNIX 程式。
在共享伺服器中,Oracle 使用一個“共享程式”池為大量使用者提供服務。共享伺服器實際上就是一種連線池機制。利用共享伺服器,我們不必為10,000 個資料庫會話建立10,000 個專用伺服器(這樣程式或執行緒就太多了),而只需建立很少的一部分程式/執行緒,顧名思義,這些程式/執行緒將由所有會話共享。這樣Oracle 就能讓更多的使用者與資料庫連線,否則很難連線更多使用者。如果讓我的機器管理10,000個程式,這個負載肯定會把它壓垮,但是管理100 個或者1,000 個程式還是可以的。採用共享伺服器模式,共享程式通常與資料庫一同啟動,使用ps命令可以看到這個程式。
       共享伺服器連線和專用伺服器連線之間有一個重大區別,與資料庫連線的客戶程式不會與共享伺服器直接通訊,但專用伺服器則不然,客戶程式會與專用伺服器直接通訊。之所以不能與共享伺服器直接對話,原因就在於這個伺服器程式是共享的。為了共享這些程式,還需要另外一種機制,通過這種機制才能與伺服器程式“對話”。為此,Oracle 使用了一個或一組稱為排程器(dispatcher,也稱分派器)的程式。
       客戶程式通過網路與一個排程器程式通訊。這個排程器程式將客戶的請求放入SGA中的請求佇列(這也是SGA 的用途之一)。第一個空閒的共享伺服器會得到這個請求,並進行處理(例如,請求可能是UPDATE T SETX = X+5 WHERE Y = 2)。完成這個命令後,共享伺服器會把響應放在原排程器(即接收請求的排程器)的響應佇列中。排程器程式一直在監聽這個佇列,發現有結果後,就會把結果傳給客戶。從概念上講,共享伺服器請求的流程如圖2-3 所示。
       
       如圖2-3 所示,客戶連線向排程器傳送一個請求。排程器首先將這個請求放在SGA 中的請求佇列中①。第一個可用的共享伺服器從請求佇列中取出這個請求②並處理。共享伺服器的處理結束後,再把響應(返回碼、資料等)放到響應佇列中③,接下來排程器拿到這個響應④,傳回給客戶。
 

2.2.2 共享伺服器具有以下一些缺點   

  一般我們以oracle預設的專用伺服器方式就行了,沒必要使用共享伺服器模式。一個是我們是使用中介軟體(如:weblogic)去連oracle的,中介軟體本身有連線池機制,另外就是oracle的這個共享伺服器方式也做的不夠好了,有諸多缺點:


1)共享伺服器的程式碼路徑比專用伺服器長,所以它天生就比專用伺服器慢。
2)存在人為死鎖的可能,因為它是序列的,只要一個連線阻塞,則該伺服器程式上的所有使用者都被阻塞,並且極可能死鎖。
3)存在獨佔事務的可能,因為如果一個會話的事務執行時間過長,它獨佔共享資源,其它使用者只能等待,而專用伺服器,每個客戶端是一個會話。
4)共享伺服器模式限制了某些資料庫特性,例如:不能單獨啟動和關閉例項,不能進行介質恢復,不能使用Log Miner,並且SQL_TRACE沒有意義(因為是共享而不是當前會話的)。
       MTS減少的記憶體實際上是專用伺服器模式下每個使用者連線到作業系統程式所需的記憶體,但它卻使用SGA的Large_Pool來分配UGA,拆東牆補西牆,所減少的記憶體是很少的。如果使用者會話的連線和斷開很頻繁,資料庫程式的建立和刪除的開銷會非常大,這種情況最好採用共享伺服器模式(否則,應該使用連線池技術)。如果客戶端一次連線終身使用(會話生命週期內),使用共享伺服器模式的意義不大。因為大部分時間,一個會話就連線到一個伺服器程式,無法共享伺服器程式。
 

2.2.3 共享服務初始化引數的一些說明


shared_servers :指定了當instance 啟動的時候 shared server process 啟動的數量,不要將這個引數設定得太大,否者啟動資料庫instance 的時候 就會花更多時間,Oracle啟動過後會根據負載來動態調整shared_servers。如果為0,表示資料庫沒有啟動共享服務模式。 這個引數是配置shared server 必須的,而且只有這個引數是必須的。

       修改引數:  alter system set shared_servers=1;
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_sesions: 指定了總共允許的的shared server session 的數量。如果設定了這個引數,那麼就不要將這個值超過sessions,如果沒有設定這個值,那麼只要還有空閒的session,就可以被使用。設定這個值是為專有連線預留 user sessions.

dispatchers:配置 dispatcher process .如果不設定這個引數,只要設定了shared_servers ,oracle 也會自動設定一個基於tcp協議的dispatcher。還需要檢視作業系統支援一個dispatcher能處理多少個connections
   SQL> select * from v$dispatcher;
max_dispatchers: 設定同一時刻能夠同時執行的dispatchers的數量,必須大於等於 dispatchers ,小於processes。這個引數也會被dispatchers覆蓋。circuits:指定了virtual circuits 的總數量。

2.2.4關閉共享模式

      將shared_servers引數置為0,那麼所有以共享方式連線到資料庫都不能成功,但是未釋放的共享連線會繼續保持連線,直到斷開。如果將shared_servers 和max_shared_servers都設為0,那麼共享連線將被終結。所有的共享方式連線都斷開了的話,就可以使用alter system set dispatcher=’’; 將dispatcher清除,防止下次啟動資料庫又開啟了共享連線方式。

2.3 TCP/IP 連線的基本原理

       這裡將分析網路上最常見的一種情形:在TCP/IP 連線上建立一個基於網路的連線請求。在這種情況下,客戶在一臺機器上,而伺服器駐留在另一臺機器上,這兩臺機器通過一個TCP/IP 網路連線。客戶率先行動,使用Oracle 客戶軟體(Oracle 提供的一組應用程式介面,或API)建立一個請求,力圖連線資料庫。
例如,客戶可以發出以下命令:
C:\Users\Administrator.DavidDai>sqlplus sys/oracle@dave2_202as sysdba;
SQL*Plus: Release 11.2.0.1.0 Production onSun Aug 21 14:36:47 2011
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Miningoptions
SQL>
       這裡,客戶是程式SQL*Plus,dave2_202是一個TNS 服務名。TNS 代表透明網路底層(Transparent Network Substrate),這是Oracle 客戶中處理遠端連線的“基礎”軟體,有了它才有可能建立對等通訊。TNS 連線串告訴Oracle 軟體如何與遠端資料庫連線。
       一般地,機器上執行的客戶軟體會讀取一個tnsnames.ora 檔案。這是一個純文字的配置檔案,通常放在[ORACLE_HOME]\network\admin目錄下。配置如下:
dave2_202 =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.202)(PORT = 1521))
    )
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = dave2)))
       根據這個配置資訊,Oracle 客戶軟體可以把我們使用的TNS 連線串dave2_202對映到某些有用的資訊,也就是主機名、該主機上“監聽器”程式接受(監聽)連線的埠、該主機上所連線資料庫的服務名,等等。  服務名錶示具有公共屬性、服務級閾值和優先順序的應用組。提供服務的例項數量對應用是透明的,每個資料庫例項可以向監聽器註冊,表示要提供多個服務。  所以,服務就對映到物理的資料庫例項,並允許DBA 為之關聯閾值和優先順序。這個串(dave2_202)還可以用其他方式來解析。例如,可以使用Oracle Internet 目錄(Oracle Internet Directory,OID),這是一個分散式輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP)伺服器,其作用就相當於解析主機名的DNS。不過,tnsnames.ora檔案通常只適用於大多數小到中型安裝,在這些情況下,這個配置檔案的副本不算太多,尚可管理。

       既然客戶軟體知道要連線到哪裡,它會與主機名為192.168.3.202 的伺服器在埠1521 上開啟一條TCP/IP socket 連線。如果伺服器DBA 安裝並配置了Oracle Net,並且有一個監聽器在埠1521上監聽連線請求,就會收到這個連線。 在網路環境中,我們會在伺服器上執行一個稱為TNS 監聽器的程式。就是這個監聽器程式能讓我們與資料庫物理連線。當它收到入站連線請求時,它會使用自己的配置檔案檢查這個請求,可能會拒絕請求(例如,因為沒有這樣的資料庫,或者可能我們的IP 地址受到限制,不允許連線這個主機),也可能會接受請求,並真正建立連線。

      如果建立一條專用伺服器連線,監聽器程式就會為我們建立一個專用伺服器。在UNIX上,這是通過fork()和exec()系統呼叫做到的(在UNIX 中,要在初始化之後建立新程式,惟一的辦法就是通過fork())。      這個新的專用伺服器程式繼承了監聽器建立的連線,現在就與資料庫物理地連線上了。
       在Windows 上,監聽器程式請求資料庫程式為連線建立一個新執行緒。一旦建立了這個執行緒,客戶就會“重定向”到該執行緒,相應地就能建立物理連線。圖2-4 顯示了UNIX 上的監聽器程式和專用伺服器連線。
       另一方面,如果我們發出共享伺服器連線請求,監聽器的表現則會有所不同。監聽器程式知道例項中執行了哪些排程器。接收到連線請求後,監聽器會從可用的排程器池中選擇一個排程器程式。監聽器會向客戶返回連線資訊,其中說明了客戶如何與排程器程式連線;如果可能的話,還可以把連線“轉發”給排程器程式(這依賴於不同的作業系統和資料庫版本,不過實際效果是一樣的)。
       監聽器發回連線資訊後,它的工作就結束了,因為監聽器一直在特定主機的特定埠上執行(主機名和埠號大家都知道),而排程器會在伺服器上隨意指派的埠上接受連線。監聽器要知道排程器指定的這些隨機埠號,併為我們選
擇一個排程器。客戶再與監聽器斷開連線,並與排程器直接連線。現在就與資料庫有了一個物理連線。這個過程如圖2-5 所示。

三. 判斷oracle是共享模式還是專用模式的方法

3.1. showparameter shared_server;

 (注:8i應為:show parameter mts_servers;)
SQL> show parameter shared_server;
NAME                    TYPE       VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers           integer     20
shared_server_sessions        integer     330
shared_servers               integer     1


3.2 檢視v$session 檢視
SQL> Select username,server,program fromv$session where username is not null;
USERNAME          SERVER    PROGRAM
------------------------------ ------------------------------------------------
SYS                  DEDICATED rman.exe
RMAN                DEDICATED rman.exe
SYS                  DEDICATED rman.exe
SYS                  DEDICATED sqlplus.exe
SYS                  DEDICATED rman.exe
DAVE                DEDICATED toad.exe
SYS                  DEDICATED toad.exe

3.3 檢視監聽: lsnrctl service


C:\Users\Administrator.DavidDai>lsnrctlservice
LSNRCTL for 32-bit Windows: Version11.2.0.1.0 - Production on 26-6月 -2010 11:7:40 Copyright (c) 1991, 2010, Oracle.  All rights reserved.
正在連線到(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
服務摘要..
服務"orcl" 包含 1 個例項。
  例項 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
    處理程式:
      "DEDICATED" 已建立:34 已拒絕:0 狀態:ready
        LOCAL SERVER
服務"orclXDB" 包含 1 個例項。
  例項 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
    處理程式:
     "D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1022 狀態: ready
        DISPATCHER <machine: DAVIDDAI, pid:10884>
        (ADDRESS=(PROTOCOL=tcp)(HOST=DavidDai)(PORT=58400))
命令執行成功

3.4.檢視TNSNAMES.ora 檔案。如:


ORCL =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = DavidDai)(PORT = 1521))
    )
   (CONNECT_DATA =
      (SERVER = DEDICATED)
    (SERVICE_NAME = orcl) )  )
       這裡是以DEDICATED 專用模式連線 orcl 例項。寫上 (SERVER = SHARED) 則是使用共享伺服器模式,但是這時shared_server_process需要開啟,要不然會出錯連不上oracle。要是這段放空沒寫,那麼系統會根據伺服器模式自動調節,不過根據實測結果,就算伺服器是定義成共享伺服器模式,shared_server_process沒開啟的情況下,在v$session中查到的連線依然是SERVER = DEDICATED。

       所以基本上我們這段話我們都是可以放空著不寫的,但是有時候要連上我們的共享伺服器模式的資料庫,放空有可能系統認為要用共享伺服器方式去連,那時就要宣告 SERVER = DEDICATED採用專用伺服器方式去連線。

       在資料庫啟動的時候,如果沒有指定shared_servers,但是設定了dispatchers,那麼ORACLE就認為啟動了shared server ,並且設定shared_servers為1. 在資料庫啟動的時候,沒有設定shared_servers,沒有設定dispatchers,即使以後修改了dispatchers,也不能啟動shared server,必須從新啟動資料庫。

       另外,Background process ,以及通過本地連線進來的,只能是DEDICATED .比如說sqlplus user/pass形式。如果資料庫沒有配置共享伺服器,那麼客戶端只能以DEDICATED方式連線資料庫.

 

相關文章