一、
简介
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
书中的一幅图
)
![CSDN_Dev_Image_2004-2-281647571.png](https://i-blog.csdnimg.cn/blog_migrate/3b27f72e5a1fa21ebe14748817d1ee0f.png)
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<SID>
这个初始化参数文件中加入了如下的
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 =
(DESCRIPTION =
(
ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = ks3)(PORT = 1521))
)
(
CONNECT_DATA =
(SERVICE_NAME = billing)
(SRVR = DEDICATED)
)
)
六、
结文
在你的
Oracle
的服务器出现高的内存利用率和出现频繁换页时,使用
MTS
是一个不错的选择。总体上说来,
MTS
较适合
OLTP
这种类型的应用,对于那些数据仓库、
DDS
这些类型的应用它则是不适合的。
转载于:https://blog.51cto.com/xu20cn/90336