一、共享服务器的概念·
每一个Oracle应用程序有两个与之相联的进程,一个是运行在客户端机器或者应用服务器上的用户进程,一个是运行在Oracle服务器上的服务器进程;·
默认的专用服务器配置下,每一个服务器进程只专职于处理一个用户会话的请求,在Unix上,服务器进程是一个可用ps命令观测到的单独的进程,在Windows系统上,服务器进程是一个运行于oracle.exe进程中的线程;·
另有一种配置称为共享服务器,少数一些服务器进程为所有的用户进程服务,在9i以前的版本,这种配置也称为MTS(多线程服务器);·
专用服务器和共享服务器的差别有点类似于外出时坐专车和打的士的区别,专用服务器能更有效地实现用户进程和实例间的通讯,但资源利用率低,共享服务器资源利用率高,在相同的CPU和内存条件下可以支持更多的并发用户,但配置不当时会引起用户进程较长时间的等待从而降低系统的性能和响应速度。
二、共享服务器的架构
共享服务器的架构共享服务器配置包含以下组件:· 用户进程(User Process)
用户进程可能由客户端软件产生,也可能通过中间组件产生,用于管理到Oracle服务器的连接;· 网络监听进程(Oracle Net
Listen Process)
监听进程用于监听来自用户进程的对数据库的查询或DML请求,并将这些请求分配给当前比较清闲的某个调度进程;·
调度进程(Dispatcher Process)
调度进程是Oracle的后台进程,用于接受来自用户进程的请求并返回结果,最多只能有五个同时运行的调度进程,在Unix上可以用ps命令看到,用Unix
kill命令杀掉一个调度进程时会同时断开这个进程负责的所有用户进程;· 请求队列(Request Queue)
请求队列用于存放调度进程接受到的请求,存在于SGA中,一个实例只有一个;· 共享服务器进程(Shared Server
Process)
共享服务进程是Oracle的后台进程,用于与SGA交互来处理用户进程的请求,功能与专用服务器类似(用于解析SQL语句,将数据块从磁盘读入数据缓存,等等),服务器进程的最大数量由操作系统指定;·
响应队列(Response Queue)
响应队列用于存放共享服务器进程处理的结果,存在于SGA中,每个调度进程对应一个,调度进程将这些结果返回请求的用户进程;·
必须满足下面条件时才可配置成共享服务器:Ø 众多的应用程序用户;
一般并发用户数在200以上时需要考虑,具体要看服务器的CPU和内存资源;Ø
事务时间短;长事务会造成少数用户独占服务器进程,而使其它用户长时间地等待,不适于配置成共享服务器。Ø
不连续的事务;用户活动间有时常的停顿,通常OLTP事务就是如此,这时服务器进程能为其它用户提供服务。
三.配置共享服务器
配置共享服务器·
配置共享服务器时需要正确地设置下面几个初始化参数,这些参数用于指定实例启动时产生的调度进程和共享服务器进程的数量,以及运行期间如何管理这些进程;Ø
DISPATCHERS 指定实例启动时产生的对应网络协议的调度进程数量,可选值是0-5;Ø
MAX_DISPATCHERS 指定实例允许的最大调度进程数,默认值为5,调度进程的增减必须由管理员手工指定(Alter system
set dispatchers = ?);Ø SHARED_SERVERS
指定实例启动时产生的共享服务器进程数量,设为零时禁用共享服务器选项,最小值为1,最大值依赖于操作系统;Ø
MAX_SHARED_SERVERS
指定实例允许的共享服务器的最大数量,最大值依赖于操作系统,服务器进程可由PMON后台进程根椐系统负载来动态增减;Ø
CIRCUITS 用于指定网络连接的虚拟电路最大数量;Ø PROCESSES
用于指定实例允许的进程的最大数量;· 管理员执行管理操作时不能使用共享服务器,必须启动专用的服务器进程。
四.测量共享服务器的性能
测量共享服务器的性能· 测量共享服务器配置的性能可用到下面一些性能视图:Ø
V$SHARED_SERVER 共享服务器进程的详细统计,包括每个进程的空闲和繁忙时间;Ø
V$QUEUE 包含请求队列和响应队列的信息;Ø V$SHARED_SERVER_MONITOR
关于共享服务器进程的合计信息,包含经由PMON启动和终止的共享服务器进程数,共享服务器进程的高水位,并发会话的最大数量,虚抑电路的最大数量;Ø
V$DISPATCHER 调度进程的详细统计,包括每个进程的空闲和繁忙时间;Ø
V$DISPATCHER_RATE 包含调度进程服务的历史和实时的统计;Ø V$CIRCUIT
包含连接路径(用户进程和调度进程,共享服务器进程的关系)的统计,· 测量共享服务器进程的性能Ø
共享服务器进程的忙百比例:Select Name,Decode(Busy + Idle, 0, 0, Round((Busy /
(Busy + Idle)) * 100, 4)) "busy_rate"From V$shared_ServerWhere
Status != 'QUIT';
Ø 用户请求在请求队列中的平均等待时间(百分之一秒)Select
Decode(Totalq,0,'TOTALQ IS ZERO',Round(Sum(Wait) / Sum(Totalq), 4))
"AVG SHARED_SERVER WAIT"From V$queueWhere Type = 'COMMON'Group By
Totalq;
Ø 当上面的数值很大或者不断上升时需要考虑增加SHARED_SERVERS的值;
· 测量调度进程的性能Ø
调度时程的忙百分比(当这个比例超过50时,需要增加DISPATCHERS 的值):Select Name
"Dispatcher",Network,(Round(Sum(Busy) / (Sum(Busy) + Sum(Idle)),
4)) * 100 "Busy_Rate"From V$dispatcherGroup By Name, Network;
Ø 用户请求等待调度进程调度的平均时间(百分之一秒)Select
Decode(Totalq,0,'TOTALQ IS ZERO',Round(Sum(Wait) / Sum(Totalq), 4))
"AVG DISPATCHER WAIT"From V$dispatcher d, V$queue qWhere d.Paddr =
q.PaddrAnd q.Type = 'DISPATCHER'Group By Totalq;
Ø 调度进程服务的连接数量(当前,历史最高以及差异)Select
Name,Cur_In_Connect_Rate,Max_In_Connect_Rate,Max_In_Connect_Rate -
Cur_In_Connect_Rate "VARIANCE"From V$dispatcher_Rate;
· 查询共享服务器环境下的累积活动:Select * From V$shared_Server_Monitor;·
查询用户进程,调度进程和共享服务器进程间的对应关系:Select s.Username, d.Name "DISPATCHER",
Ss.Name "SHARED_SERVER"From V$circuit c, V$session s, V$dispatcher
d, V$shared_Server SsWhere c.Saddr = s.SaddrAnd c.Dispatcher =
d.PaddrAnd c.Server = Ss.Paddr;
五.改进共享服务器的性能
改进共享服务器的性能·
共享服务器环境下的性能调整方向是,在现有的资源配置下支持更多的用户,而不是一定要如何提高系统的吞吐量或响应时间;·
性能问题表现在以下三个方面:相关的SGA组件配置不充分,共享服务器进程太少,调度进程太少;·
相关的SGA组件配置Ø
共享服务器配置下,用户的会话与游标信息是存放于UGA中的(专用服务器配置下存放于PGA中),UGA通常存在于共享池中,共享池的主要功能是用来缓存SQL语句及数据字典的,这就要求共享池有足够的空间,不致于因UGA的消耗而降低系统的库缓存命中率和字典缓存命中率;Ø
下面的查询语句可以看到系统UGA占用的空间,这个空间占用是动态变化的:Select Sum(s.Value) "Total UGA
Bytes"From V$sesstat s, V$statname nWhere s.Statistic# =
n.Statistic#And n.Name = 'session uga memory
max';Ø 在配置了大池后,部分UGA数据会从SGA中移到大池中;·
有三种改变共享服务器进程数量的方法:Ø
PMON后台进程能够根椐系统的负载动态增减服务器进程的数量;Ø
管理员动态增加服务器进程的数量:Alter system set shared_servers =
xx;Ø
管理员手工增加服务器进程的数量:更改初始参数shared_servers的值,再重启;·
改变调度进程数量的方法只有两种Ø 管理员动态增加调度进程的数量:Alter system set
dispatchers = ‘tcp,5’;Ø
管理员手工增加调度进程的数量:更改初始参数dispatchers的值,再重启;Ø
用户进程在其生命周期里只和一个调度进程发生联系,新加入的调度进程只能为在它之后产生的用户进程服务;Ø
Oracle推荐配置是,每个调度进程服务250个左右的并发用户连接;