gdufo

           

          Tuning the Oracle Shared Server

           

          1Overview
          Oracle shared server
          主要用于允許多user進程能夠共享有限數量的servers
          dedicated server環境中,每個user 進程都會分配到一個server進程,但如果這些server進程不能完全被利用,常處于idle狀態,就會造成內存和cpu的浪費。
          當使用shared server模式,user進程是動態的被分配到可以被任何user進程共享的server進程上的。當dispatcher進程獲得一個user 進程請求后會將其放入請求隊列,以便server進程可以處理該請求并將結果返回給dispatcherresponse隊列。隨后 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視圖來分析沖突。它分組顯示了curavgmax的統計信息。如果使用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_SERVERSMAX_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獲得相應的serversessiondispatcher addresses

          5shared servermemory 使用:之前有說過,當使用shared server模式時,部分稱為UGAuser global area)的數據將被存放在shared pool中,同時sessiondata Components被存放在large pool中。如果沒有設置large pool,將存放在shared pool中。
          從總體將使用shared server模式,內存的開支減少了。
          shared servers
          使用UGA用于sorts,此模式下,應該設置SORT_AREA_RETAINED_SIZE相對小于SORT_AREA_SIZE,以便可以快速釋放內存給其他user

          6troubleshooting:常見問題有:
          1
          )所有共享連接都失敗時,查看Oracle net listenerrunning
          2
          )查看是否在建立shared connection時存在Oracle net配置的錯誤”TNS_”
          3
          )不要輕易在OSkilluserserver進程,建議使用alter system kill session。如果使用dispatcher連接的,killdispatcher進程會更糟,會影響其他user
          4
          dispatchersservers都是后臺進程,所以在設置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)

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 镇巴县| 五大连池市| 自治县| 象山县| 砀山县| 娱乐| 蒙山县| 长岭县| 云阳县| 河北区| 星座| 久治县| 开封市| 自贡市| 炎陵县| 博兴县| 雅江县| 蒙山县| 集安市| 清原| 长宁县| 太湖县| 宁蒗| 宝应县| 旬邑县| 晋中市| 肇庆市| 察哈| 满洲里市| 邓州市| 永昌县| 三明市| 蒲江县| 台湾省| 苏尼特右旗| 盐城市| 靖安县| 新建县| 新余市| 阳高县| 白沙|