關于Oracle Shared Server及一些參數設置(轉)
關于Oracle Shared Server及一些參數設置
發表于:2007.07.19 10:16
分類: Oracle數據庫管理
出處:http://tolywang.itpub.net/post/48/309893
---------------------------------------------------------------
在Dedicated Server環境中,每一個連接都將啟動一個專用服務進程,這個專用服務進程始終服務于這個連接直到連接斷開。每一個專用服務進程都有一個屬于自己的內存區域,叫做PGA(Program GlobalArea),里面存放了會話的信息,包括綁定變量、游標、排序等等。而在Shared Server環境中,這些信息被存放到SGA中的UGA(User Global Area)區域中,這個區域一般都位于大型池中(Large pool)。見下圖:
在Shared Server環境中,一個調度器服務多個連接的請求,并將請求放到請求隊列(request queue)中,所有調度器共用一個請求隊列,接著由共享服務進程(Shared Server processes)來處理這些請求,并將處理后的結果返回到響應隊列(response queue),與請求隊列不同,每個調度器都有自己的一個響應隊列,然后由調度器把響應隊列中的結果返回給客戶端。其中請求隊列和響應隊列都是SGA中的一部分。
在一個共享服務環境中,一個客戶端請求的步驟是這樣的:
1、 客戶端發送一個請求到調度器
2、 調度器將請求放入到請求隊列中
3、 共享服務進程從請求隊列中取出請求進行處理
4、 共享服務進程將處理后的結果放到調度器的響應隊列中
5、 調度器從響應隊列中取出結果返回給客戶端
示例圖如下:
同時,在Shared server環境中,也可以使用連接池的方法來存放多個連接請求,數據庫定時斷開空閑的連接來服務其它新的連接請求。
在Shared server環境中也存在不足,當某一個請求需要處理并返回大量數據的時候,將會導致其它新的請求得不到及時的響應。所以對于這樣的請求,最好使用專用服務進程。同時,部分數據庫管理操作需要使用專用服務進程,比如數據庫啟動關閉,數據庫備份恢復等等,對于表分析、大量數據加載、索引重建等操作也建議使用專用服務進程。
監聽器在Shared server環境中也扮演著重要的角色。PMON進程定期檢測調度器的負載情況,并將這些信息反饋給監聽器。監聽器記錄著每個調度器的地址信息及負載情況(當前服務多少個連接等等),當有新的連接請求的時候,監聽器將負載較低的調度器地址信息返回給客戶端,客戶端根據地址信息連接到相應的調度器。
下面談談如何配置Oracle shared server環境。
可以通過多種方法來配置shared server,包括創建數據庫的時候指定參數、EM、修改初始化參數文件,還有可以通過Alter system進行修改,因為這些參數都是動態參數。
1) DISPATCHERS:指定調度器的數量、響應的協議等等。下面是具體的參數及說明:
其中最經常使用的兩個屬性值就是DISPATCHERS和PROTOCOL。
DISPATCHERS = “(PRO=TCP)(DIS=3)(PRO=IPC)(DIS=2)”
上面表示配置了3個TCP協議的調度器,2個IPC協議的調度器。那么,調度器的數量應該如何確定呢?主要考慮數據庫最大的連接數和每個調度器服務的連接數,可以通過下面的公式進行計算:
調度器數量 = 數據庫最大session數 /每個調度器服務的session數;
數據庫的session數可以通過下面的視圖獲得:
1、 v$session:獲得當前數據庫的session數
SQL> select count(*) from v$session where username is not null;
2、 V$LICENSE:獲得當前數據庫的session數及數據庫啟動以來最大的session數
SQL> select sum(sessions_current) cur_sessions,sum(sessions_highwater) high_sessions from V$LICENSE;
比如數據庫當前有500個TCP/IP session,每個調度器管理50個session,那么就需要10(500/50)個調度器。參數設置如下:
DISPATCHERS=”(PRO=TCP)(DIS=10)”
當然也可以根據數據庫當前的負載,使用ALTER SYSTEM命令動態的增加或減少調度器的數據,如下:
ALTER SYSTEM SET DISPATCHERS=”(PRO=TCP)(DIS=5)”;
DISPATCHERS="(PROTOCOL=tcp)(DISPATCHERS=1)(POOL=on)(TICK=1)(CONNECTIONS=500)(SESSIONS=1000)"
上面表示啟動連接池,一個調度器的連接數最大為500個,sessions數目最大為1000個,并10分鐘后自動斷開未活動的連接。(TICK=1表示10分鐘)
2) MAX_DISPATCHERS:設置最大的調度器數,可以動態調整
ALTER SYSTEM SET MAX_DISPATCHERS=10;
3) SHARED_SERVERS:設置數據庫啟動時啟動的最小SHARED_SERVER數,默認值庫1。設置為0表示不使用SHARED_SERVER。
ALTER SYSTEM SET SHARED_SERVERS = 5;
4) SHARED_SERVER_SESSIONS:設置ORACLE SHARED SERVER的最大session數。
當連接到SHARED SERVER的session數超過此值的話,將報錯:
ERROR:
ORA-00018 maximum number of sessions exceeded
不過當數據庫session超過此值的時候,仍然可以通過專用服務器連接進行連接。
ALTER SYSTEM SET SHARED_SERVER_SESSIONS = 5;
5) MAX_SHARED_SERVERS:設置最大的SHARED_SERVER數。如果未給此參數附值,那么SHARED_SERVER數庫無限制。
ALTER SYSTEM SET MAX_SHARED_SERVERS = 20;
下面談談ORACLE SHARED SERVER環境的管理:
1)從監聽獲得信息
D:>lsnrctl services
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 21-APR-2004
20:50:35
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MJW01)
(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Instance "MJW", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
"D001" established:11 refused:1 current:1 max:1002 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=4152))
"D000" established:15 refused:3 current:2 max:1002 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=3845))
The command completed successfully
上面的信息表明當前數據庫擁有兩個調度器,分別庫"D000"和"D001",與"D000"建立連接的總共有15個,拒絕掉的有3個,當前活動的連接有2個;與"D001"建立連接的總共有11個,拒絕掉的有1個,當前活動的連接有1個。
2)從動態性能圖獲得信息:
V$DISPATCHER:顯示當前調度器的一些信息,包括調度器的狀態(等待還是繁忙)、當前的連接數、歷史的連接數等等。
V$DISPATCHER_CONFIG:顯示調度器的一些配置參數。
V$SHARED_SERVER:顯示當前數據庫SHARED SERVER的一些狀態信息
V$SHARED_SERVER_MONITOR:顯示當前數據庫SHARED SERVER的一些統計信息,包括SHARED SERVER的最大連接數,會話數及啟動的SHARED SERVER數等等。
同時,在ORACLE SHARED SERVER環境中,也可以配置專用服務器連接,但只有當你是使用Localnaming方法的時候才可以,如果你是使用Hostnaming方法的話則不可以。有幾個方法進行配置,如下:
1、 手工修改Tnsname文件
ora10g =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.172)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora10g)
)
)
2、通過Oracle net manager進行配置
3)對于配置了ORACLE SHARED SERVER的數據庫,有一些參數需要值得我們的關注:
1、LARGE POOL SIZE
在ORACLE SHARED SERVER環境中,ORACLE 將UGA存放在LARGE POOL中,而在沒有LARGE POOL或者LARGE POOL太小的數據庫中,UGA將存放于SHARED POOL中,這樣將影響到數據庫其它的性能。所以LARGE POOL的大小也值得我們考究。LARGE POOL最小為300K,最大為2G(不同操作系統可能有所不同)。一般來講,在ORACLE SHARED SERVER環境中,一個連接將占用1-3M的內存,不過要看會話做了哪些操作。我們可以通過下面的語句獲得數據庫啟動以來,最大的UGA值:
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
------------------------------------
244416
可以看到,ORACLE分配的最大UGA庫240K,如果數據庫同時支持100個并發連接,那么可以將LARGE POOL設置庫23M(240K*100)。如果LARGE POOL設置過小,可能遇到下面的錯誤:
ORA-04031: unable to allocate 490 bytes of shared memory
("large pool","MWEIS","session heap","define var info")
可以通過ALTER SYSTEM命令進行動態修改。
ALTER SYSTEM SET LARGE_POOL_SIZE = 51200000 SCOPE=SPFILE;
2、 調度器數目
可以通過查詢V$DISPATCHER視圖來查看調度器的狀態:
SQL> desc v$dispatcher;
Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
NAME VARCHAR2(4) Y
NETWORK VARCHAR2(128) Y
PADDR RAW(4) Y
STATUS VARCHAR2(16) Y
ACCEPT VARCHAR2(3) Y
MESSAGES NUMBER Y
BYTES NUMBER Y
BREAKS NUMBER Y
OWNED NUMBER Y
CREATED NUMBER Y
IDLE NUMBER Y
BUSY NUMBER Y
LISTENER NUMBER Y
CONF_INDX NUMBER Y
SQL> Select name, (busy / (busy + idle))*100
2 "Dispatcher % busy Rate"
3 From V$DISPATCHER
4 /
---- ----------------------
D000 0.0052861386871346
如果繁忙的百分比超過50%,那么可以考慮增加調度器,可以使用下面的語句動態修改:
ALTER SYSTEM SET DISPATCHERS=“(PRO=TCP)(DIS=2)”;
3、 調度器響應時間
可以通過查看V$QUEUE 和 V$DISPATCHER來獲得連接等待調度器響應的時間:
SELECT decode(sum(totalq),0,’No Responses’,
Sum(wait)/sum(totalq)) “Average Wait time”
FROM V$QUEUE q, V$DISPATCHER d
WHERE q.type = ‘DISPATCHER’
AND q.paddr = d.paddr;
Average Wait Time
------------------
.0413
4、 連接等待shared server處理請求的時間
Select decode(totalq,0,’No Requests’) “Wait Time”,
Wait/totalq || ‘ hundredths of seconds’
“Average Wait time per request”
from V$QUEUE
where type = ‘COMMON’
Wait Time Average Wait time per request
-------- -----------------------------------
.023132 hundredths of a second