Oracle Shared Server比较适合一些小而快的事务连接,这些事务的特点就是事务比较短,操作和返回的数据量比较少。而对于一些数据仓库而言,显然是不适合建成 Shared Server模式。下面说一下Shared Server和Dedicated Server的一些区别:
在Dedicated Server环境中,每一个连接都将启动一个专用服务进程,这个专用服务进程始终服务于这个连接直到连接断开。每一个专用服务进程都有一个属于自己的内存区域,叫做PGA(Program GlobalArea),里面存放了会话的信息,包括绑定变量、游标、排序等等。而在Shared Server环境中,这些信息被存放到SGA中的UGA(User Global Area)区域中,这个区域一般都位于大型池中(Large pool)。见下图:
在Shared Server环境中,一个调度器服务多个连接的请求,并将请求放到请求队列(request queue)中,所有调度器共用一个请求队列,接着由共享服务进程(Shared Server processes)来处理这些请求,并将处理后的结果返回到响应队列(response queue),与请求队列不同,每个调度器都有自己的一个响应队列,然后由调度器把响应队列中的结果返回给客户端。其中请求队列和响应队列都是SGA中的一部分。
在一个共享服务环境中,一个客户端请求的步骤是这样的:
1、 客户端发送一个请求到调度器
2、 调度器将请求放入到请求队列中
3、 共享服务进程从请求队列中取出请求进行处理
4、 共享服务进程将处理后的结果放到调度器的响应队列中
5、 调度器从响应队列中取出结果返回给客户端
示例图如下:
同时,在Shared server环境中,也可以使用连接池的方法来存放多个连接请求,数据库定时断开空闲的连接来服务其它新的连接请求。
在Shared server环境中也存在不足,当某一个请求需要处理并返回大量数据的时候,将会导致其它新的请求得不到及时的响应。所以对于这样的请求,最好使用专用服务进程。同时,部分数据库管理操作需要使用专用服务进程,比如数据库启动关闭,数据库备份恢复等等,对于表分析、大量数据加载、索引重建等操作也建议使用专用服务进程。
监听器在Shared server环境中也扮演着重要的角色。PMON进程定期检测调度器的负载情况,并将这些信息反馈给监听器。监听器记录着每个调度器的地址信息及负载情况(当前服务多少个连接等等),当有新的连接请求的时候,监听器将负载较低的调度器地址信息返回给客户端,客户端根据地址信息连接到相应的调度器。
下面谈谈如何配置Oracle shared server环境。
可以通过多种方法来配置shared server,包括创建数据库的时候指定参数、EM、修改初始化参数文件,还有可以通过Alter system进行修改,因为这些参数都是动态参数。
1) DISPATCHERS:指定调度器的数量、响应的协议等等。下面是具体的参数及说明:
其中最经常使用的两个属性值就是DISPATCHERS和PROTOCOL。
DISPATCHERS = “(PRO=TCP)(DIS=3)(PRO=IPC)(DIS=2)”
上面表示配置了3个TCP协议的调度器,2个IPC协议的调度器。那么,调度器的数量应该如何确定呢?主要考虑数据库最大的连接数和每个调度器服务的连接数,可以通过下面的公式进行计算:
调度器数量 = 数据库最大session数 /每个调度器服务的session数;
数据库的session数可以通过下面的视图获得:
1、 v$session:获得当前数据库的session数
SQL> select count(*) from v$session where username is not null;
2、 V$LICENSE:获得当前数据库的session数及数据库启动以来最大的session数
SQL> select sum(sessions_current) cur_sessions,sum(sessions_highwater) high_sessions from V$LICENSE;
比如数据库当前有500个TCP/IP session,每个调度器管理50个session,那么就需要10(500/50)个调度器。参数设置如下:
DISPATCHERS=”(PRO=TCP)(DIS=10)”
当然也可以根据数据库当前的负载,使用ALTER SYSTEM命令动态的增加或减少调度器的数据,如下:
ALTER SYSTEM SET DISPATCHERS=”(PRO=TCP)(DIS=5)”;
设置连接池:
DISPATCHERS="(PROTOCOL=tcp)(DISPATCHERS=1)(POOL=on)(TICK=1)(CONNECTIONS=500)(SESSIONS=1000)"
上面表示启动连接池,一个调度器的连接数最大为500个,sessions数目最大为1000个,并10分钟后自动断开未活动的连接。(TICK=1表示10分钟)
2) MAX_DISPATCHERS:设置最大的调度器数,可以动态调整
ALTER SYSTEM SET MAX_DISPATCHERS=10;
3) SHARED_SERVERS:设置数据库启动时启动的最小SHARED_SERVER数,默认值库1。设置为0表示不使用SHARED_SERVER。
ALTER SYSTEM SET SHARED_SERVERS = 5;
4) SHARED_SERVER_SESSIONS:设置ORACLE SHARED SERVER的最大session数。
当连接到SHARED SERVER的session数超过此值的话,将报错:
ERROR:
ORA-00018 maximum number of sessions exceeded
不过当数据库session超过此值的时候,仍然可以通过专用服务器连接进行连接。
ALTER SYSTEM SET SHARED_SERVER_SESSIONS = 5;
5) MAX_SHARED_SERVERS:设置最大的SHARED_SERVER数。如果未给此参数附值,那么SHARED_SERVER数库无限制。
ALTER SYSTEM SET MAX_SHARED_SERVERS = 20;
下面谈谈ORACLE SHARED SERVER环境的管理:
1)从监听获得信息
D:>lsnrctl services
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 21-APR-2004
20:50:35
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MJW01)
(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Instance "MJW", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
"D001" established:11 refused:1 current:1 max:1002 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=4152))
"D000" established:15 refused:3 current:2 max:1002 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=3845))
The command completed successfully
上面的信息表明当前数据库拥有两个调度器,分别库"D000"和"D001",与"D000"建立连接的总共有15个,拒绝掉的有3个,当前活动的连接有2个;与"D001"建立连接的总共有11个,拒绝掉的有1个,当前活动的连接有1个。
2)从动态性能图获得信息:
V$DISPATCHER:显示当前调度器的一些信息,包括调度器的状态(等待还是繁忙)、当前的连接数、历史的连接数等等。
V$DISPATCHER_CONFIG:显示调度器的一些配置参数。
V$SHARED_SERVER:显示当前数据库SHARED SERVER的一些状态信息
V$SHARED_SERVER_MONITOR:显示当前数据库SHARED SERVER的一些统计信息,包括SHARED SERVER的最大连接数,会话数及启动的SHARED SERVER数等等。
同时,在ORACLE SHARED SERVER环境中,也可以配置专用服务器连接,但只有当你是使用Localnaming方法的时候才可以,如果你是使用Hostnaming方法的话则不可以。有几个方法进行配置,如下:
1、 手工修改Tnsname文件
ora10g =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.172)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora10g)
)
)
2、通过Oracle net manager进行配置
3)对于配置了ORACLE SHARED SERVER的数据库,有一些参数需要值得我们的关注:
1、LARGE POOL SIZE
在ORACLE SHARED SERVER环境中,ORACLE 将UGA存放在LARGE POOL中,而在没有LARGE POOL或者LARGE POOL太小的数据库中,UGA将存放于SHARED POOL中,这样将影响到数据库其它的性能。所以LARGE POOL的大小也值得我们考究。LARGE POOL最小为300K,最大为2G(不同操作系统可能有所不同)。一般来讲,在ORACLE SHARED SERVER环境中,一个连接将占用1-3M的内存,不过要看会话做了哪些操作。我们可以通过下面的语句获得数据库启动以来,最大的UGA值:
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
------------------------------------
244416
可以看到,ORACLE分配的最大UGA库240K,如果数据库同时支持100个并发连接,那么可以将LARGE POOL设置库23M(240K*100)。如果LARGE POOL设置过小,可能遇到下面的错误:
ORA-04031: unable to allocate 490 bytes of shared memory
("large pool","MWEIS","session heap","define var info")
可以通过ALTER SYSTEM命令进行动态修改。
ALTER SYSTEM SET LARGE_POOL_SIZE = 51200000 SCOPE=SPFILE;
2、 调度器数目
可以通过查询V$DISPATCHER视图来查看调度器的状态:
SQL> desc v$dispatcher;
Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
NAME VARCHAR2(4) Y
NETWORK VARCHAR2(128) Y
PADDR RAW(4) Y
STATUS VARCHAR2(16) Y
ACCEPT VARCHAR2(3) Y
MESSAGES NUMBER Y
BYTES NUMBER Y
BREAKS NUMBER Y
OWNED NUMBER Y
CREATED NUMBER Y
IDLE NUMBER Y
BUSY NUMBER Y
LISTENER NUMBER Y
CONF_INDX NUMBER Y
SQL> Select name, (busy / (busy + idle))*100
2 "Dispatcher % busy Rate"
3 From V$DISPATCHER
4 /
NAME Dispatcher % busy Rate
---- ----------------------
D000 0.0052861386871346
如果繁忙的百分比超过50%,那么可以考虑增加调度器,可以使用下面的语句动态修改:
ALTER SYSTEM SET DISPATCHERS=“(PRO=TCP)(DIS=2)”;
3、 调度器响应时间
可以通过查看V$QUEUE 和 V$DISPATCHER来获得连接等待调度器响应的时间:
SELECT decode(sum(totalq),0,’No Responses’,
Sum(wait)/sum(totalq)) “Average Wait time”
FROM V$QUEUE q, V$DISPATCHER d
WHERE q.type = ‘DISPATCHER’
AND q.paddr = d.paddr;
Average Wait Time
------------------
.0413
4、 连接等待shared server处理请求的时间
Select decode(totalq,0,’No Requests’) “Wait Time”,
Wait/totalq || ‘ hundredths of seconds’
“Average Wait time per request”
from V$QUEUE
where type = ‘COMMON’
Wait Time Average Wait time per request
-------- -----------------------------------
.023132 hundredths of a second
tolywang 发表于:2007.07.19 10:16 ::分类: (
Oracle数据库管理 ) ::阅读:(543次) ::
评论 (0) ::
引用 (0)