Tuning the Oracle Shared Server
1、Overview:
Oracle shared server主要用于允許多user進程能夠共享有限數量的servers。
在dedicated server環境中,每個user 進程都會分配到一個server進程,但如果這些server進程不能完全被利用,常處于idle狀態,就會造成內存和cpu的浪費。
當使用shared server模式,user進程是動態的被分配到可以被任何user進程共享的server進程上的。當dispatcher進程獲得一個user 進程請求后會將其放入請求隊列,以便server進程可以處理該請求并將結果返回給dispatcher的response隊列。隨后 dispatcher進程會將response隊列中的結果返回給user進程。
Oracle Shared Server主要用于下面的情況:當dedicated Server的系統對于system開銷相對較大;在訪問的資源上存在限制。
2、對dispatchers的監控:
1)可以通過v$MTS視圖獲得關于連接和session的會話以及當前使用的使用的數據信息。如果sessions的設置低于實際的dispatcher的設置,MAXIMUM_CONNECTIONS的默認值是參數SESSIONS的值。
2)V$DISPATCHER視圖查詢dispatcher的繁忙率:
select network “protocol”, status “status”, sum(owned) “clients”, sum(busy) * 100/(sum(busy)+sum(idle)) “busy rate” from v$dispatche group by network;
note:在選擇dispatcher數量的時候,應該考慮客戶端的數量對于dispatcher的繁忙比率。如果一個dispatcher的繁忙比率 超過50%,就需要考慮增加dispatcher的數量。如果發現部分dispatcher經常處于idle的狀態,應該考慮減少dispatcher的 數量。
可用下面的SQL查看users sessions是否在等待dispatchers:
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;
如果觀察到大量的等待比率并不斷增長,需要考慮增加dispatcher的數量。
增加或減少dispatcher使用:
alter system set mts_dispatchers = ‘protocol, number’;
執行上述語句后只有新的連接建立才會使用new增加的dispatcher。
2)此外,可以使用視圖V$DISPATCHER_RATE視圖來分析沖突。它分組顯示了cur、avg、max的統計信息。如果使用shared Server的性能不理想,則cur的值將接近max的值,對此應該考慮增加dispatcher的數量。如果發現shared Server性能良好,cur值遠遠低于max的值,可以考慮降低dispatcher的個數。
3、對Shared Server的監控:
當PMON后臺進程發現當前存在的shared Servers都處在忙碌狀態,Oracle shared Server進程就會被是動態創建的創建。當然此時MAX_SHARED_SERVERS的值必須大于實際的servers值。當然,如果PMON檢測到 當前有shared servers存在idle狀態的,則會減少相應的shared servers的數量,直到數量達到SHARED_SERVERS的值。所以不必太多的考慮shared servers的狀態。但是有時需要調整SHARED_SERVERS和MAX_SHARED_SERVERS的參數的大小。
對此,可以使用視圖V$SHARED_SERVER視圖獲得shared servers的當前信息。
select name, requests, busy*100/(busy+idle) “busy %”, status from v$shared_server where status != ’QUIT’;
此外,可以查看每個請求的平均等待時間:
select decode(totalq, 0, ‘No Requests’, wait/totalq ||’ hundredths of seconds’ )”Average Wait Time Per Requests” from v$queue where type = ‘COMMON’;
4、監控進程的作用:查看共享連接。如果覺得user程序有問題或是某個進程似乎做了很多操作,可能需要查看當前user的共享連接。對此可以使用 v$session視圖查看應用的狀態和使用的連接類型,可以使用v$circuit獲得相應的server、session和dispatcher的 addresses。
5、shared server和memory 使用:之前有說過,當使用shared server模式時,部分稱為UGA(user global area)的數據將被存放在shared pool中,同時session的data Components被存放在large pool中。如果沒有設置large pool,將存放在shared pool中。
從總體將使用shared server模式,內存的開支減少了。
shared servers使用UGA用于sorts,此模式下,應該設置SORT_AREA_RETAINED_SIZE相對小于SORT_AREA_SIZE,以便可以快速釋放內存給其他user。
6、troubleshooting:常見問題有:
1)所有共享連接都失敗時,查看Oracle net listener在running。
2)查看是否在建立shared connection時存在Oracle net配置的錯誤”TNS_”
3)不要輕易在OS層kill掉user的server進程,建議使用alter system kill session。如果使用dispatcher連接的,kill掉dispatcher進程會更糟,會影響其他user。
4)dispatchers和servers都是后臺進程,所以在設置PROCESSES時要考慮相應的數量。
5)如果參數INSTANCE_NAME, SERVICE_NAMES 或 DB_DOMAIN 沒有被設置,或是設置不正確,則其不能進行自動instance注冊。
• V$CIRCUIT: Contains information about user connections to the database
• V$DISPATCHER: Provides information on the dispatcher processes
• V$DISPATCHER_RATE: Provides rate statistics for the dispatcher processes
• V$QUEUE: Contains information on the multithread message queues
• V$MTS: Contains information for tuning the Oracle shared server
• V$SESSION: Lists session information for each current session
• V$SHARED_SERVER: Contains information about the shared server processes
eg:
SELECT d.network network, d.name disp, s.username oracle_user,
s.sid sid,s.serial# serial#, p.username os_user,
p.terminal terminal, s.program program
FROM v$dispatcher d, v$circuit c, v$session s, v$process p
WHERE d.paddr = c.dispatcher(+)
AND c.saddr = s.saddr(+)
AND s.paddr = p.addr (+)
order by d.network, d.name, s.username
posted on 2010-01-12 12:32 gdufo 閱讀(674) 評論(0) 編輯 收藏 所屬分類: Database (oracle, sqlser,MYSQL)