Shared Server

Neohzh發表於2008-06-16

啟用SHARED SERVERS和關閉

只需要把SHARED_SERVERS設定為大於1的值,系統即轉為SHARED SERVER。關閉SHARED SERVERS只需要把該引數設定為0。


SQL> alter system set shared_servers=2; #更改已成功

系統已更改。

SQL> select name,status from v$shared_server; #結果顯示有S000和S001兩個SHARED SERVERS PROCESS正執行

NAME STATUS
---- ----------------
S000 WAIT(COMMON)
S001 WAIT(COMMON)

SQL> alter system set dispatchers="(protocol=tcp)(dispatcher=2)";

系統已更改。

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS ACC
---- ---------------- ---
D000 WAIT YES #STATUS為WAIT表示空閒,正等待任務,ACC為YES表示可以接受新建連線
D001 WAIT YES

SQL> alter system shutdown immediate 'D000';

系統已更改。

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS ACC
---- ---------------- ---
D000 REFUSE NO #狀態顯示拒絕任何新建連線
D001 WAIT YES

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS ACC
---- ---------------- ---
D001 WAIT YES #過一會再試D000已經關閉

SQL>

SQL> alter system set shared_Servers=0; #關閉SHARED SERVER

系統已更改。

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS ACC
---- ---------------- ---
D001 WAIT NO #所有DISPATCHER均拒絕任何新建連線

SQL> select name,status from v$shared_server; #沒有立即生效,ORACLE手冊上說是因為系統會等所有有SHARED SERVER連線斷開再停止SHARED SERVER PROCESS。

NAME STATUS
---- ----------------
S000 WAIT(COMMON)
S001 WAIT(COMMON)

SQL> select name,status from v$shared_server;

NAME STATUS
---- ----------------
S000 QUIT #過一會再試,變成退出的狀態
S001 QUIT

SQL> select name,status from v$shared_server;

NAME STATUS
---- ----------------
S000 TERMINATED #過一會再試變成終止的狀態
S001 TERMINATED

SQL> select name,status from v$shared_server;

未選定行 #已經沒有SHARED SERVER PROCESS了

SQL>


在共享伺服器中請求一個專用連線

如果在共享伺服器中需要請求一個專用連線,如果正使用TNSNAME命名方法,則只需要新增以下引數即可。SERVER=DEDICATED
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

修改DISPATCHER

啟用SHARED SERVERS後DISPATCHER預設為dispatchers="(PROTOCOL=tcp)"
例:這是一個典型例子
Dispatchers="(PROT=TCP)(DISP=2)"
例:強制使用Dispatcher的地址
Dispatchers="(Address=(Protocol=tcp)(host=144.25.16.201))(dispatchers=2)"
例:強制使用Dispatcher的埠
Dispatchers="(Address=(Protocol=tcp)(Port=5000))"
Dispatchers="(Address=(Protocol=tcp)(Port=5001))"

配置連線池特性

該特性透過預建立一個連線池,客戶需要連線時從連線池中取,當連線空閒時自動斷開,並放回到連線池,以備下個連線請求使用。該特性賦予了Shared Server處理較大數量連線的能力。如果有大量客戶並且大量是空閒連線,則適用該特性,例如WEB。
配置示例如下:
SQL> alter system set dispatchers="(protocol=tcp)(dispatcher=2)(pool=on)(tick=1)
(connections=500)(sessions=1000)";

系統已更改。

SQL>
意思如下:
(DISPATCHER=1) -- 配置一個Dispatcher
(PROTOCOL=TCP) -- 接受協議是TCP
(POOL=ON) -- 為它開啟連線池特性
(TICK=1) -- 當經過10分鐘無通訊後,連線會被視為空閒,如果TICK=2,經過20分鐘後連線會被視為空閒
(CONNECTIONS=500) -- 該DISPATCHER最大可接受500個連線
(SESSIONS=1000) -- 該DISPATCHER最大可接受1000個會話

關閉指定DISPATCHER

首先檢視DISPATCHER的名稱
SELECT NAME, NETWORK FROM V$DISPATCHER;
然後根據名稱關閉
ALTER SYSTEM SHUTDOWN IMMEDIATE 'D002';

使用共享伺服器的動態效能檢視

要知道動態效能檢視的完整解釋,請下載完整ORACLE文件庫,然後定位到以下位置
開啟文件庫首頁->開啟BOOK標籤頁->定位到書名為 "Reference" ->開啟HTML版 ->定位到"Part III Dynamic Performance Views“中的Dynamic performance (V$) Views->然後找到需要的檢視

使用V$DISPATCHER


SQL> select name,status,messages,idle,busy,bytes,breaks from v$dispatcher;

NAME STATUS MESSAGES IDLE BUSY BYTES BREAKS
---- ---------------- ---------- ---------- ---------- ---------- ----------
D000 WAIT 8685 217560 705 1501540 0

SQL>

以上查訪結果顯示:
  • 現在有一個Dispatcher,名稱為:D000
  • STATUS為WAIT,表示它正處於空閒的狀態
  • MESSAGES表示它已經處理完8685條資訊
  • IDLE表示自啟動以來空閒了271560,
  • BUSY表示繁忙了705
  • BYTES表示該Dispatcher已處理的所有資訊的總位元組數
  • BREAKS表示它已經處理過的中斷(例如從控制檯發到+)

使用v$dispatcher_config

該檢視含有DISPATCHER的配置資訊。包括:監聽協議,監聽地址,接受的最大連線數和會話數及服務名稱資訊。
SQL> select conf_indx,dispatchers,connections,sessions "SESS", service from v$dispatcher_config;

CONF_INDX  DISPATCHERS   CONNECTIONS SESS  SERVICE
--------------------------------------------------------------------------------

0         2       1002       1002  orcl,orcl,orcl_XPT


SQL>
結果顯示:

1. 系統配置了兩個DISPATCHER
2. 可接受的連線數和會話數都是1002
3. 可接受以下服務的請求orcl,orcl,orcl_XPT

使用V$DISPATCHER_RATE

顯示DISPATCHER的統計資料,例如已處理的平均位元組數,曾經出站與入站的最大連線數及每個客戶連線的平均處理位元組。其中以CUR開頭為當前統計資料,以AVG或MAX為平均或最大統計資料
SQL> select name,cur_event_rate,cur_msg_rate,cur_svr_byte_rate from v$dispatcher
_rate;

NAME CUR_EVENT_RATE CUR_MSG_RATE CUR_SVR_BYTE_RATE
---- -------------- ------------ -----------------
D000 77 0 0
D001 104 0 0

SQL>
結果顯示:

1. 有兩個除錯程式
2. D000當前大約每分鐘處理77個事件
3. D000當前資訊量和位元組數都為0

使用V$SHARED_SERVER

下例可看到伺服器已經處理了多少個請求和資訊,並可看到資訊的總大小,並可看到自啟動以來總繁忙的時間

NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT IDLE BUSY REQUESTS
S000 1EE4CBEC WAIT(COMMON) 146 20872 0 00 287354 966 37

shared server效能調優

調節共享伺服器選項應該考慮到的地方
  1. 確保有足夠的Dispatcher,以便客戶沒有正在等候Dispatcher響應它們的請求
  2. 確保有足夠的Shared Server Process,以便沒有請求正在等候得到處理
  3. 配置Large Pool SGA,以便有足夠大的地方儲存UGA。

配置Large Pool

  • 在init.ora檔案中引數LARGE_POOL_SIZE可以被配置成最小300K和至少2G的最大值,最大值跟作業系統相關
    • 例:LARGE_POOL_SIZE = 50M
  • 也可以使用Slter system修改
    • 例:ALTER SYSTEM SET LARGE_POOL_SIZE=100M
  • 當使用預設值時,共享伺服器中的每個會話使Large pool增加250KB,並分配給該會話。
  • 當Large Pool未被配置時,UGA會放在Shared Pool中,這會影響Shared Pool效能,所以應該配置一個Large Pool。
  • 使用V$SGASTAT可檢查LARGE POOL正使用的空間。FREE MEMORY顯示可供使用的空間,SESSION HEAP顯示已使用的空間
SQL> select *from v$sgastat where pool='large pool';

POOL NAME BYTES
------------ -------------------------- ----------
large pool PX msg pool 206208
large pool free memory 7851120
large pool session heap 331280

SQL>
結果顯示共有空閒LARGE POOL記憶體7851120位元組,會話頭使用了331280位元組

確定Large Pool大小

一般來說,每個連線需要1MB到3MB之間的記憶體
查詢V$SESSTAT檢視可得到所有連線中最大曾經分配的最大記憶體。把乘以預計的最大連線數即可得出Large Pool的大小.
SQL> select sum(value) "max mts memory allocated" from v$sesstat ss, v$statname
st where name = 'session uga memory max' and ss.statistic# = st.statistic#;

max mts memory allocated
------------------------
6167676

SQL>
結果顯示單個連線曾最大分配記憶體為6167676位元組

確定是否有足夠的Dispatcher

查詢V$dispatcher可監視各Dispatcher程式,從而得知各Dispatcher有多繁忙。如果Dispatcher繁忙時間百分比超過50%,則需要考慮啟動更多的排程程式。

SQL> select name, (busy/(busy + idle)) "dispatcher busy rate" from v$dispatcher
;

NAME dispatcher busy rate
---- --------------------
D000 .000121704
D001 .000042597
D002 .004935402

SQL>
以上例顯示D000繁忙的比率大約只是0.001%,顯然遠未達到50%,所以不需要增加DISPATCHER

測量使用者等候Dispatcher程式多長時間

透過組合查詢V$queue和V$dispatcher可得出結果
SQL> Select decode(sum(totalq), 0, 'no responses', sum(wait)/sum(totalq)) "avera
ge wait time" from V$QUEUE Q, V$DISPATCHER D WHERE Q.TYPE='DISPATCHER' AND Q.PAD
DR=D.PADDR;

average wait time
----------------------------------------
0

SQL>
結果顯示使用者不需要等待,所以不需要增加DISPATCHER。

確定是否有足夠的共享伺服器

下例顯示請求佇列中的平均等時間比0.3秒略多一點
SQL> Select decode(totalq,0,'No Requests') "Wait Time", Wait/totalq || ' hundred
ths of seconds' "Average Wait time per request" from V$QUEUE where type='COMMON'
;

Wait Time Average Wait time per request
----------- --------------------------------------------------------------
.324324324324324324324324324324324324324 hundredths of seconds[@more@]

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

相關文章