一、 简介

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
1) 客户端向 Dispatcher 发一个服务请求
2) Dispatch 把这个请求放到 SGA 区的请求对队列中
3) 由一个或几个服务进程来处理这个请求
4) 服务进程把进行的结果放到 Dispatch SGA 区的的响应队列中
5) Dispatcher 从响应队列拾起结果
6) 完成客户端的请求并把结果回送给客户端

 

三、MTSDEDICATE方式方面做一下比较,为方便比较绘制如下的简表

 

序号

比较项

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 这些类型的应用它则是不适合的。