ORACLE MTS的介紹(zt)

zhouwf0726發表於2019-03-23
http://m77m78.itpub.net/post/125/281028
MTS(Multi-Threaded Server)是ORACLE SERVER的一個可選的配置選擇,是相對DEDICATE方式而言,它最大的優點是在以不用增加物理資源(記憶體)的前提下支援更多的併發的連線。換句話說,如果你只有2G的實體記憶體,而你又想支援2000個連線,在獲取最好效能的前提下,你就應該選擇MTS了。

公司資料庫伺服器負載較大.pgsp已經用去了66%之多

統計了一下程式,確定根本原因在於oracle程式數太多.也就是dedicated連線數太多.

考慮將使用者連線方式改為multithread方式.


檢視Oracle的配置,MTS配置預設已經開啟. v$dispatcher , v$shared_server 中記錄數均為1

但是在客戶端tnsnames.ora 中把 (SERVER = DEDICATED)改為 (SERVER = SHARED)後連線資料庫時,得到錯誤:

ORA-12519:

再回頭看伺服器配置引數 show parameter dispatchers

mts_dispatchers = (PROTOCOL=TCP) (SERVICE=devaXDB)

看監聽器,lsnrctl status 未發現 service devaXDB

metalink帳號失效,只好瘋狂Google. 沒有發現類似的解決方法

alter system register;

後來...

修改了listener.ora , 將
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = shdemo1)(PORT = 1521))
)
中的IP地址改為主機名.

重啟lsnr , OK


作為備忘,將MTS相關的一篇文章摘抄下來,方便查閱


一、簡介
  
  MTS(Multi-Threaded Server)是ORACLE SERVER的一個可選的配置選擇,是相對DEDICATE方式而言,它最大的優點是在以不用增加物理資源(記憶體)的前提下支援更多的併發的連線。換句話說,如果你只有2G的實體記憶體,而你又想支援2000個連線,在獲取最好效能的前提下,你就應該選擇MTS了。
  
  本文先說一說MTS的工作方式,然後與DEDICATE方式的做一下比較,接下來說一下MTS具體配置實現,最後說一些優化MTS配置選項的問題。
  
  二、MTS的工作方式
  
  1、Joseph C.Johnson以餐館給出一個MTS的形象的比喻
  
  假設ORACLE是一家餐館,當你走進一家餐館時你感覺最舒服的服務方式就是有一個專門的waiter來為你服務,而不管餐館中來了多少人,她只對你請求應答,這是DEDICTE的處理方式,也就是說每一個ORACLE客戶端的連線都有一個專門的服務程式來為它服務。而大部的餐館的服方式都不是一對一的,當你走進的時侯,你就被指定了一個waiter,她也可能為其它桌服著務,這對於餐館來說是最有利的,因為他們可以服務更多的客人而不需要增加他們的員工。這樣對你來說也可能是不錯的,如果餐館不是太忙,她服務的客人的請求都很簡短且容易完成,你的感覺也好像自己擁有一個專門的waiter,waiter把你的ORDER轉給廚師,然後把做好的菜拿給你,這就是MTS的處理方式,這些共享的waiters我們叫她們為Dispatchers,廚師我們則叫他們為Shared Server Processes。
  
  2、以簡圖說一下MTS的工作方式(SYBEX書中的一幅圖)
  
  1)客戶端向Dispatcher發一個服務請求
  
  2)Dispatch把這個請求放到SGA區的請求對佇列中
  
  3)由一個或幾個服務程式來處理這個請求
  
  4)服務程式把進行的結果放到Dispatch的SGA區的的響應佇列中
  
  5)Dispatcher從響應佇列拾起結果
  
  6)完成客戶端的請求並把結果回送給客戶端
  
  三、MTS與DEDICATE方式方面做一下比較,為方便比較繪製如下的簡表
  
  序號
  
  比較項
  
  MTS方式
  
  DEDICATE方式
  
  1
  
  服務程式
  
  多個連線共享一個服務程式
  
  一個連線有一個專門的服務程式
  
  2
  
  每個客戶端的連線使用的記憶體量
  
  3-4M
  
  150-200K
  
  3
  
  適合的應用環境
  
  適合連線數很多且請求很短少的OLTP環境
  
  如果Oracle伺服器的資源夠用,這種方式是優選
  
  4
  
  CPU負載
  
  會造成一些CPU的負載,如果你的CPU有瓶頸,則不要用這種方式

四、 MTS的配置實現
  
  1、 Oracle8i MTS環境常用到的幾個引數
  
  序號
  
  引數
  
  說明
  
  1
  
  mts_dispatchers
  
  用於配置當Instance啟動的時侯啟用的Dispatcher的數量、及Dispatcher所響應的協議,它是一個動態的引數,可以用Alter system進行動態修定,它沒有預設值。
  
  2
  
  mts_max_dispatchers
  
  用於指定同時執行的Dispatcher程式的最大數量,對於大部分的應用,每250個連線啟用一個Dispatcher可以獲得較好的效能。預設值是5或所配置的Dispatcher的數量
  
  3
  
  mts_servers
  
  用於指定當Instance啟動時你想啟用的服務程式的數量,它是一個動態引數,可以用Alter systme動態修定。
  
  4
  
  mts_max_servers
  
  用於指定同時進行的共享的庫的服務程式的數量,如果你的系統經常出現死鎖,應該適當的增加這個值。
  
  5
  
  Mts_service
  
  設為SID
  
  6
  
  mts_listener_address
  
  TNS監聽的地址
  
  2、 Oracle9i MTS環境常用到的幾個引數
  
  序號
  
  引數
  
  說明
  
  1
  
  Dispatchers
  
  等同於8i中的mts_dispatchers引數
  
  2
  
  max_dispatchers
  
  等同於8i中的mts_max_dispatchers引數
  
  3
  
  shared_servers
  
  等同於8i中的mts_server引數
  
  4
  
  max_shared_servers
  
  等同於8i中的mts_max_servers引數
  
  3、 以我一個實際環境(Oracle8.1.7.4)舉個例子,9i類似,我在Init這個初始化引數檔案中加入瞭如下的MTS的引數,完成了MTS的配置。
  
  #mts set by qiuyb
  
  mts_dispatchers="(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.223.125))(DISPATCHERS=10)"
  
  mts_max_dispatchers=20
  
  mts_servers=10
  
  mts_max_servers=50
  
  mts_service=BILLING
  
  mts_listener_address="(address=(protocol=tcp)(host=192.168.223.125)(port=1521))" large_pool_size=400M
  
  #End of qiuyb's Set
  
  需要說明的是large_pool_size這個初始化引數,在MTS環境中為獲取更好的效能建議設定這個引數,這樣UGA都從large_pool這樣一個固定的區域中進行分配,而不用從Shared Pool中動態進行分配,這樣也可以減少ORA-04031錯誤的發生。
  
  五、 優化MTS配置選項及你可能問的幾個問題
  
  1、 large_pool_size這個引數我該設為多大呢?
  
  當large_pool_size的大小能夠滿足所有的共享服務程式所需的記憶體就可以了,當然如果記憶體夠用的話可以適當的加大一點,如下的語句便可以得出自例項啟動來MTS連線所用的記憶體的最大數量,可以看出來是200多M。
  
  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
  
  ------------------------
  
  214457296
  
  2、 如何判斷我dispatcher的數量是不是夠用呢?
  
  使用如下的語句,當dispatcher的繁忙比率超過50%的時侯,你就要考慮增加Dispatcher的數量了,用Alter system動態卻可完成。
  
  SELECT name, (busy / (busy + idle))*100 "Dispatcher % busy Rate"
  
  FROM V$DISPATCHER
  
  3、 如何判斷共享服務程式是不是夠用呢?
  
  使用如下的語句來確定每次請求的平均等待時間,監測Average Wait time per reques這個值,當這個值持續增長時你該考慮增加shared servers了。
  
  SELECT decode(totalq,0,'No Requests') "Wait Time",
  
  Wait/totalq ||'hundredths of seconds' "Average Wait time per request"
  
  FROM V$QUEUE
  
  WHERE type = 'COMMON'
  
  4、 如何在MTS配置的Server請求Dedicate的連線著?
  
  你在Tnsnames.ora中做服務名配置時加入SRVR=DEDICATED這個選項就可以了,示例如下:
  
  billing =
  
  (DEscrīptION =
  
  (
  
  ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = ks3)(PORT = 1521))
  
  )
  
  (
  
  CONNECT_DATA =
  
  (SERVICE_NAME = billing)
  
  (SRVR = DEDICATED)
  
  )
  
  )
  
  六、 結文
  
  在你的Oracle的伺服器出現高的記憶體利用率和出現頻繁換頁時,使用MTS是一個不錯的選擇。總體上說來,MTS較適合OLTP這種型別的應用,對於那些資料倉儲、DDS這些型別的應用它則是不適合的。

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

相關文章