小議服務程式與會話(三)

realkid4發表於2011-01-12

共享模式探究

 

相對於專用模式,共享模式多了Dispatcher元件,還有在Dispatcher下管理的Server Process

 

為了進行試驗,筆者已經將wilson資料庫轉換為共享連線模式。

 

SQL> conn as sysdba;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

 

 

SQL> show parameter shared_servers;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

max_shared_servers                   integer    

shared_servers                       integer     2

 

在共享模式下,Shared_servers是一個重要引數,當為非零的時候,表示系統正處在shared連線模式下。

 

首先,我們已經透過PL/SQL Developer登入(開啟兩個command視窗),根據我們之前的討論,應該有兩個連線會話與Server對應。我們首先檢視作業系統層面。

 

//本段程式碼無任何省略

[oracle@oracle11g ~]$ ps -ef | grep ora | grep -v grep

root      4868     1  0 08:10 ?        00:00:00 login -- oracle    

root      5539  5507  0 08:25 pts/0    00:00:00 su oracle

oracle    5540  5539  0 08:25 pts/0    00:00:00 bash

oracle    6477  4868  0 09:26 tty1     00:00:00 -bash

oracle    6997     1  0 09:29 ?        00:00:00 /u01/oracle/bin/tnslsnr LISTENER -inherit

oracle    7028     1  0 09:29 ?        00:00:00 ora_pmon_wilson

oracle    7030     1  0 09:29 ?        00:00:00 ora_vktm_wilson

oracle    7034     1  0 09:29 ?        00:00:00 ora_gen0_wilson

oracle    7036     1  0 09:29 ?        00:00:00 ora_diag_wilson

oracle    7038     1  0 09:29 ?        00:00:00 ora_dbrm_wilson

oracle    7040     1  0 09:29 ?        00:00:00 ora_psp0_wilson

oracle    7042     1  0 09:29 ?        00:00:01 ora_dia0_wilson

oracle    7044     1  0 09:29 ?        00:00:00 ora_mman_wilson

oracle    7046     1  0 09:29 ?        00:00:00 ora_dbw0_wilson

oracle    7048     1  0 09:29 ?        00:00:00 ora_lgwr_wilson

oracle    7050     1  0 09:29 ?        00:00:01 ora_ckpt_wilson

oracle    7052     1  0 09:29 ?        00:00:01 ora_smon_wilson

oracle    7054     1  0 09:29 ?        00:00:00 ora_reco_wilson

oracle    7056     1  0 09:29 ?        00:00:03 ora_mmon_wilson

oracle    7058     1  0 09:29 ?        00:00:02 ora_mmnl_wilson

oracle    7060     1  0 09:29 ?        00:00:01 ora_d000_wilson

oracle    7062     1  0 09:29 ?        00:00:05 ora_s000_wilson

oracle    7106     1  0 09:29 ?        00:00:00 ora_qmnc_wilson

oracle    7123     1  0 09:30 ?        00:00:02 ora_cjq0_wilson

oracle    7129     1  0 09:30 ?        00:00:00 ora_q000_wilson

oracle    7131     1  0 09:30 ?        00:00:00 ora_q001_wilson

oracle    7202     1  0 09:36 ?        00:00:00 ora_smco_wilson

oracle    7349     1  0 10:05 ?        00:00:06 ora_s001_wilson

oracle    7359     1  0 10:06 ?        00:00:00 ora_w000_wilson

oracle    7425     1  0 10:18 ?        00:00:00 ora_s002_wilson

oracle    7426  5540  0 10:19 pts/0    00:00:00 ps -ef

問題來了,我們登入了,為什麼之前的oraclewilson的服務連線沒有了。。。那麼,會話方面呢?

 

SQL> select saddr,sid,paddr,action from v$session where username='SYS';

 

SADDR           SID PADDR    ACTION

-------- ---------- -------- --------------------------------

382A5CA4         29 38BC20AC Main session

3829DD60         32 38BC4C0C Command Window - New

38298888         34 38BC8D1C Command Window – New

 

 

會話方面和我們之前的研究一樣,Developer中開啟兩個視窗,形成三個會話。關注的是PADDR38BC20AC38BC4C0C38BC8D1C)地址。

 

我們檢查V$process檢視,檢視是否有PADDR為這三個的Process

 

SQL> select addr, spid, pname, program from v$process where addr in ('38BC20AC','38BC4C0C','38BC8D1C');

 

ADDR     SPID                     PNAME PROGRAM

-------- ------------------------ ----- ------------------------------------------------

38BC20AC 7062                     S000  oracle@oracle11g (S000)

38BC4C0C 7349                     S001  oracle@oracle11g (S001)

38BC8D1C 7425                     S002  oracle@oracle11g (S002)

 

 

發現,三個對應地址的程式是一系列SXXX的程式,難道這就是我們在共享模式下的Server Process嗎?

 

Oracle檢視中,有v$shared_server檢視,名字上看就是共享模式下共享的Server檢視檢視。

 

 

SQL> select name,paddr, status from v$shared_server;

 

NAME PADDR    STATUS

---- -------- ----------------

S000 38BC20AC  WAIT(RECEIVE)

S001 38BC4C0C  EXEC

S002 38BC8D1C  WAIT(RECEIVE)

 

 

程式名稱和地址均相同,看來在共享模式下,Server Process的名稱均為SXXXXXX為序號)。回顧剛才在ps –ef的檢索,也可以定位到這些程式。

 

在基礎知識中,我們說共享模式下有一個dispatcher元件,負責各個server process的分發管理,在ps –ef中是哪個呢?

 

我們先利用Oracle提供的檢視v$dispatcher

 

 

SQL> select name,network,paddr,status from v$dispatcher;

 

NAME    NETWORK                                              PADDR    STATUS

---- -------------------------------------------------------------------------------- -------- ----------------

D000     (ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=33522))  38BC15D4 WAIT

 

 

同樣思路,Dispatcher程式的名字為DXXXXXX表示序號),也在PADDR=38BC15D4中找到了作業系統的程式。

 

SQL> select addr, spid, pname, program from v$process where addr='38BC15D4';

 

ADDR     SPID                     PNAME PROGRAM

-------- ------------------------ ----- ------------------------------------------------

38BC15D4 7060                     D000  oracle@oracle11g (D000)

 

 

作業系統層面

 

[oracle@oracle11g ~]$ ps -ef | grep 7060 | grep -v grep

oracle    7060     1  0 09:29 ?        00:00:01 ora_d000_wilson

 

 

果然定位到了分發dispatcher程式和管理下的Server Process

 

最後一個問題,共享模式下,當我們斷開了連線,Server Process會釋放嗎?

 

我們關閉了Developer程式,呼叫OS命令。

//第一次呼叫

[oracle@oracle11g ~]$ ps -ef | grep ora_s00

oracle    7062     1  0 09:29 ?        00:00:05 ora_s000_wilson

oracle    7349     1  0 10:05 ?        00:00:06 ora_s001_wilson

oracle    7425     1  0 10:18 ?        00:00:00 ora_s002_wilson

oracle    7488  5540  0 10:29 pts/0    00:00:00 grep ora_s00

//第二次呼叫

[oracle@oracle11g ~]$ ps -ef | grep ora_s00 | grep -v grep

oracle    7062     1  0 09:29 ?        00:00:05 ora_s000_wilson

oracle    7349     1  0 10:05 ?        00:00:06 ora_s001_wilson

//第三次呼叫

[oracle@oracle11g ~]$ ps -ef | grep ora_s00 | grep -v grep

oracle    7062     1  0 09:29 ?        00:00:05 ora_s000_wilson

oracle    7349     1  0 10:05 ?        00:00:06 ora_s001_wilson

 

發現,我們斷開了連線,關閉了Developer。在專用模式下,Server Process應當被釋放掉。但是我們發現,第一次呼叫的時候,對應原來的三個Server ProcessS000S001S002)依然存在。片刻之後,第二次呼叫,發現S002被釋放掉了。再片刻之後,第三次呼叫,發現兩個S000S001不會釋放掉,一直在執行。

 

 

結論:上面已經可以清楚的看到共享模式工作的原理。

 

首先,我們說的共享,是Server Process可以在不同時間為多個會話服務。在一個時刻,只能為一個會話服務!當會話結束的時候,Server Process是可以不釋放的。他的生命週期是透過Dispatcher來控制排程;

 

系統中保留多少個Server ProcessDispatcher排程,是初始化引數Shared_Server來確定。當請求數多於可以使用Shared_Server的時候,Dispatcher會自己安排建立新的Server Process,當然這是很消耗資源的。當請求數少於Shared_Server的時候,Dispather也會保留這個數目的連線數量。

 

那麼,Shared_Server設定為多少合適呢?這個是一個經驗加現實的解決。如果系統確定使用共享連線的Oracle配置(注意這個前提),要根據系統特性和實際併發使用者數目來估算合適的Shared_Server,並且在生產環境不斷的監控和調整。過多的額外Server建立,是可能引起系統Hange死的原因。

 

 

Shared模式的見解

 

現在使用共享模式的應用是比較少的。因為在配置上存在一些困難問題,以及對效能擴充的缺陷,一些資料和專家們都建議不要設定共享模式。

 

專用模式和共享模式是Oracle早期提出的兩種典型連線方式,分別是應對不同的資料庫連線需求。

 

一般認為,資料庫連線是一種珍貴的系統資源,建立和銷燬都是很大的損耗。如果前端應用過於頻繁的請求連線和釋放連線,對應用系統整體和資料庫都是很大的效能問題。比如早期的ASPJSP頁面應用,業務邏輯和資料庫訪問都在頁面上。基於這種考慮,才出現的共享模式。

 

但是隨著兩個趨勢,共享模式的重要性逐漸降低。第一個是專用模式的不斷最佳化,雖然每個連線都要對應一個專用的Server Process,而且用後立即釋放。但是Oracle對於這部分的最佳化力度也在加強,大量的Server Process建立和釋放不存在過多的效能問題。相對應的是共享模式在會話資料儲存、私有空間存在一些不能迴避的問題。而且共享模式擴充性受到引數約束很大。

 

另一個趨勢就是企業級軟體實踐的推進。J2EE.NET為代表,各種開源框架為先鋒的軟體風潮,給我們提供了一些解決問題的思路和方法。連線池、中介軟體的思路和產品,為企業級應用提供了穩定可靠的資料庫連線保證和重用保證。在資料庫層面實現的連線共享,已經可以方便的在應用層面加以實現。

 

在一些資料中,甚至提出了Oracle連線模式的第三種模式,就是shared pool方式。藉助Oracle提供的中介軟體產品或者第三方的中介軟體產品,專用模式下的資料庫對外還可以提供高併發、多使用者的連線實現。

 

 

綜合上述內容:筆者還是建議儘可能將共享連線模式實現在應用層面,不要輕易的選擇資料庫的共享連線模式。

 

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

相關文章