一、簡介
MTS(Multi-Threaded Server)是ORACLE SERVER的一個(gè)可選的配置選擇,是相對(duì)DEDICATE方式而言,它最大的優(yōu)點(diǎn)是在以不用增加物理資源(內(nèi)存)的前提下支持更多的并發(fā)的連接。換句話說,如果你只有2G的物理內(nèi)存,而你又想支持2000個(gè)連接,在獲取最好性能的前提下,你就應(yīng)該選擇MTS了。
本文先說一說MTS的工作方式,然后與DEDICATE方式的做一下比較,接下來說一下MTS具體配置實(shí)現(xiàn),最后說一些優(yōu)化MTS配置選項(xiàng)的問題。
二、MTS的工作方式
1、Joseph C.Johnson以餐館給出一個(gè)MTS的形象的比喻
假設(shè)ORACLE是一家餐館,當(dāng)你走進(jìn)一家餐館時(shí)你感覺最舒服的服務(wù)方式就是有一個(gè)專門的waiter來為你服務(wù),而不管餐館中來了多少人,她只對(duì)你請(qǐng)求應(yīng)答,這是DEDICTE的處理方式,也就是說每一個(gè)ORACLE客戶端的連接都有一個(gè)專門的服務(wù)進(jìn)程來為它服務(wù)。而大部的餐館的服方式都不是一對(duì)一的,當(dāng)你走進(jìn)的時(shí)侯,你就被指定了一個(gè)waiter,她也可能為其它桌服著務(wù),這對(duì)于餐館來說是最有利的,因?yàn)樗麄兛梢苑?wù)更多的客人而不需要增加他們的員工。這樣對(duì)你來說也可能是不錯(cuò)的,如果餐館不是太忙,她服務(wù)的客人的請(qǐng)求都很簡短且容易完成,你的感覺也好像自己擁有一個(gè)專門的waiter,waiter把你的ORDER轉(zhuǎn)給廚師,然后把做好的菜拿給你,這就是MTS的處理方式,這些共享的waiters我們叫她們?yōu)镈ispatchers,廚師我們則叫他們?yōu)镾hared Server Processes。
2、以簡圖說一下MTS的工作方式(SYBEX書中的一幅圖)

1)客戶端向Dispatcher發(fā)一個(gè)服務(wù)請(qǐng)求
2)Dispatch把這個(gè)請(qǐng)求放到SGA區(qū)的請(qǐng)求對(duì)隊(duì)列中
3)由一個(gè)或幾個(gè)服務(wù)進(jìn)程來處理這個(gè)請(qǐng)求
4)服務(wù)進(jìn)程把進(jìn)行的結(jié)果放到Dispatch的SGA區(qū)的的響應(yīng)隊(duì)列中
5)Dispatcher從響應(yīng)隊(duì)列拾起結(jié)果
6)完成客戶端的請(qǐng)求并把結(jié)果回送給客戶端
三、MTS與DEDICATE方式方面做一下比較,為方便比較繪制如下的簡表
序號(hào)
|
比較項(xiàng)
|
MTS
方式
|
DEDICATE
方式
|
1
|
服務(wù)進(jìn)程
|
多個(gè)連接共享一個(gè)服務(wù)進(jìn)程
|
一個(gè)連接有一個(gè)專門的服務(wù)進(jìn)程
|
2
|
每個(gè)客戶端的連接使用的內(nèi)存量
|
3-4M
|
150-200K
|
3
|
適合的應(yīng)用環(huán)境
|
適合連接數(shù)很多且請(qǐng)求很短少的
OLTP
環(huán)境
|
如果
Oracle
服務(wù)器的資源夠用,這種方式是優(yōu)選
|
4
|
CPU
負(fù)載
|
會(huì)造成一些
CPU
的負(fù)載,如果你的
CPU
有瓶頸,則不要用這種方式
|
?
|
四、? MTS的配置實(shí)現(xiàn)
1、? Oracle8i MTS環(huán)境常用到的幾個(gè)參數(shù)
序號(hào)
|
參數(shù)
|
說明
|
1
|
mts_dispatchers
|
用于配置當(dāng)
Instance
啟動(dòng)的時(shí)侯啟用的
Dispatcher
的數(shù)量、及
Dispatcher
所響應(yīng)的協(xié)議,它是一個(gè)動(dòng)態(tài)的參數(shù),可以用
Alter system
進(jìn)行動(dòng)態(tài)修定,它沒有默認(rèn)值。
|
2
|
mts_max_dispatchers
|
用于指定同時(shí)運(yùn)行的
Dispatcher
進(jìn)程的最大數(shù)量,對(duì)于大部分的應(yīng)用,每
250
個(gè)連接啟用一個(gè)
Dispatcher
可以獲得較好的性能。默認(rèn)值是
5
或所配置的
Dispatcher
的數(shù)量
|
3
|
mts_servers
|
用于指定當(dāng)
Instance
啟動(dòng)時(shí)你想啟用的服務(wù)進(jìn)程的數(shù)量,它是一個(gè)動(dòng)態(tài)參數(shù),可以用
Alter systme
動(dòng)態(tài)修定。
|
4
|
mts_max_servers
|
用于指定同時(shí)進(jìn)行的共享的庫的服務(wù)進(jìn)程的數(shù)量,如果你的系統(tǒng)經(jīng)常出現(xiàn)死鎖,應(yīng)該適當(dāng)?shù)脑黾舆@個(gè)值。
|
5
|
mts_service
|
設(shè)為
SID
|
6
|
mts_listener_address
|
TNS
監(jiān)聽的地址
|
2、? Oracle9i MTS環(huán)境常用到的幾個(gè)參數(shù)
序號(hào) | 參數(shù) | 說明 |
1 | Dispatchers | 等同于8i中的mts_dispatchers參數(shù) |
2 | max_dispatchers | 等同于8i中的mts_max_dispatchers參數(shù) |
3 | shared_servers | 等同于8i中的mts_server參數(shù) |
4 | max_shared_servers | 等同于8i中的mts_max_servers參數(shù) |
3、? 以我一個(gè)實(shí)際環(huán)境(Oracle8.1.7.4)舉個(gè)例子,9i類似,我在Init<SID>這個(gè)初始化參數(shù)文件中加入了如下的MTS的參數(shù),完成了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這個(gè)初始化參數(shù),在MTS環(huán)境中為獲取更好的性能建議設(shè)置這個(gè)參數(shù),這樣UGA都從large_pool這樣一個(gè)固定的區(qū)域中進(jìn)行分配,而不用從Shared Pool中動(dòng)態(tài)進(jìn)行分配,這樣也可以減少ORA-04031錯(cuò)誤的發(fā)生。
五、 優(yōu)化MTS配置選項(xiàng)及你可能問的幾個(gè)問題
1、? large_pool_size這個(gè)參數(shù)我該設(shè)為多大呢?
當(dāng)large_pool_size的大小能夠滿足所有的共享服務(wù)進(jìn)程所需的內(nèi)存就可以了,當(dāng)然如果內(nèi)存夠用的話可以適當(dāng)?shù)募哟笠稽c(diǎn),如下的語句便可以得出自實(shí)例啟動(dòng)來MTS連接所用的內(nèi)存的最大數(shù)量,可以看出來是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的數(shù)量是不是夠用呢?
使用如下的語句,當(dāng)dispatcher的繁忙比率超過50%的時(shí)侯,你就要考慮增加Dispatcher的數(shù)量了,用Alter system動(dòng)態(tài)卻可完成。
SELECT?name,?(busy?/?(busy?+?idle))*100?"Dispatcher?%?busy?Rate"
FROM?V$DISPATCHER
3、? 如何判斷共享服務(wù)進(jìn)程是不是夠用呢?
使用如下的語句來確定每次請(qǐng)求的平均等待時(shí)間,監(jiān)測Average Wait time per reques這個(gè)值,當(dāng)這個(gè)值持續(xù)增長時(shí)你該考慮增加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請(qǐng)求Dedicate的連接著?
你在tnsnames.ora中做服務(wù)名配置時(shí)加入SRVR=DEDICATED這個(gè)選項(xiàng)就可以了,示例如下:
billing =
(DESCRIPTION =
? (
?? ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = ks3)(PORT = 1521))
? )
? (
?? CONNECT_DATA =
??? (SERVICE_NAME = billing)
??? (SRVR = DEDICATED)
? )
)
六、 結(jié)文
在你的Oracle的服務(wù)器出現(xiàn)高的內(nèi)存利用率和出現(xiàn)頻繁換頁時(shí),使用MTS是一個(gè)不錯(cuò)的選擇??傮w上說來,MTS較適合OLTP這種類型的應(yīng)用,對(duì)于那些數(shù)據(jù)倉庫、DDS這些類型的應(yīng)用它則是不適合的。
繼續(xù)說一說Oracle的MTS
1、在Oracle Server調(diào)整為MTS方式后,一些客戶端出現(xiàn)了連不上Oracle Server的狀況,大部分報(bào)的錯(cuò)為TNS-12509,如何解決?
回答:
在實(shí)際過程中是存在著這方面的情況,我總結(jié)了一下,大部是由Oracle8 的client引起的,就是那些配服務(wù)名還得掛著個(gè).world的那種客戶端,其實(shí)解決起來很簡單,只需要把tnsname.ora這個(gè)文件中你的那個(gè)服務(wù)名配置的"sid="改成"service_name=",這就Ok了。
2、我使用了成都邁普公司的"隧道網(wǎng)關(guān)"這種產(chǎn)品,以前在dedicated方式是好好的,可是改成MTS后,為什么Client死活連不是Oracle的Server呢?
回答:
其實(shí)我們公司也用了這種產(chǎn)品,在MTS應(yīng)用之初也遇到了這個(gè)問題。出現(xiàn)這個(gè)問題的原因?yàn)檫~普的這種產(chǎn)品只為監(jiān)測靜態(tài)的端返回,它認(rèn)為Oracle的監(jiān)聽端口即為返回端口,實(shí)際在MTS中不是這樣的,多進(jìn)行幾次連接,用netstat -n在客戶端觀看一下就會(huì)明白,MTS返回的端口是動(dòng)態(tài)的,所以邁普的這個(gè)產(chǎn)品就不好用了。解燃眉之急的辦法可以這樣:在MTS客戶端配置"服務(wù)名"時(shí),請(qǐng)求個(gè)Dedicate的連接,即使用SERVER = DEDICATED選項(xiàng),這就把問題解決了。
3、如何跟蹤一下MTS的dispatcher和shared server進(jìn)程?
回答:
這需用到診斷事件了,dispatcher的診斷事件號(hào)為10248,shared server的為10249,如下以shared server為例簡單說一下,假定s015的操作系統(tǒng)的進(jìn)程號(hào)為13161.
sql>conn sys/pass as sysdba
sql>oradebug setospid 13161?
sql>oradebug TRACEFILE_NAME?? --看一下跟蹤文件的名稱
sql>oradebug EVENT 10249 trace name context forever, level 10
也可以在init<SID>.ora中加入如下兩行完成trace:
event="10248 trace name context forever, level X"? -- dispatchers
event="10249 trace name context forever, level X"? -- shared servers
4、如何在MTS中設(shè)置IPC
回答:
LISTENER.ORA:
=============
?
LISTENER=
? (ADDRESS_LIST=
???? (ADDRESS=
??????? (PROTOCOL=IPC)
??????? (KEY=<sid name>)
???? )
???? (ADDRESS=
??????? (PROTOCOL=IPC)
??????? (KEY=<alias in tnsnames.ora for the sid>)
???? )
? )
CONNECT_TIMEOUT_LISTENER=10
STARTUP_WAIT_TIME_LISTENER=0
SID_LIST_LISTENER=
? (SID_LIST=
??? (SID_DESC=
????? (SID_NAME=<sid name>)?
????? (ORACLE_HOME=<home directory path for Oracle>)
??? )
? )
?
地址列表中可以使用其它的協(xié)議,加入應(yīng)的地址。這個(gè)例子完全是一個(gè)IPC的例子
?
TNSNAMES.ORA:
=============
?
<alias>=
? (DESCRIPTION=
???? (ADDRESS=
??????? (PROTOCOL=IPC)
??????? (KEY=<sid name>)
???? )
???? (CONNECT_DATA=
??????? (SID=<sid name>)
???? )
? )
?
?
INIT.ORA entries for MTS:
=========================
?
MTS_DISPATCHERS="IPC,2"
MTS_SERVERS=1
MTS_MAX_DISPATCHERS=6
MTS_MAX_SERVERS=3
MTS_SERVICE=<sid name>
MTS_LISTENER_ADDRESS="(ADDRESS=(PROTOCOL=IPC)(KEY=<sid name>))"
5、如何查看一下某個(gè)shared_server正在忙什么?
回答:
其實(shí)這與Dedicated方式的查看方法是一樣的,還以s015為例,它的spid為13161,使用如下的sql便可查出:
SELECT?a.username,
???????a.machine,
???????a.program,
???????a.sid,
???????a.serial#,
???????a.status,
???????c.piece,
???????c.sql_text
??FROM?v$session?a,
???????v$process?b,
???????v$sqltext?c
?WHERE?b.spid=13161
???AND?b.addr=a.paddr
???AND?a.sql_address=c.address(+)
?ORDER?BY?c.piece
6、我在unix看到一個(gè)shared server的進(jìn)程占用了大量的CPU資源,通過select addr from v$process where spid=<os process pid>查到進(jìn)程的address,而select * from v$session where paddr=<paddr>確沒的結(jié)果,所以我無法得知我的這個(gè)shared server在忙什么,我該怎么辦呢?
回答:
SELECT?status?FROM?v$circuit?
?WHERE?CIRCUIT?IN?
??(
???SELECT?circuit?FROM?v$shared_server?
????WHERE?paddr=<your?paddr>
??)
如果status的返回是EOF,說明實(shí)際這個(gè)shared server已經(jīng)掉死了,你可以把它在操作系統(tǒng)上清除掉了:
eg:
? oracle$kill -9 <shared server's pid>
你不用擔(dān)心kill掉會(huì)有什么大的影響,其它幾分鐘之后,pmon會(huì)為你把這個(gè)shared server進(jìn)程給重新啟動(dòng)的。
7、如何在非down庫的情況下恢復(fù)到Dedicate的連接方式,及啟用更多的dispatcher?
回答:
7.1關(guān)掉:
? sql>ALTER SYSTEM SET MTS_DISPATCHERS='TCP,0';
7.2啟用更多的dispatcher
? sql>ALTER SYSTEM SET MTS_DISPATCHERS='TCP,40';
本文轉(zhuǎn)載自CSDN上hrb_qiuyb的三篇文章
說一說如何配置Oracle的MTS Part1
說一說如何配置Oracle的MTS part2
繼續(xù)說一說Oracle的MTS