您的位置:首页 > 数据库 > Oracle

关于Oracle Shared Server及一些参数设置与监听之间的联系

2013-03-04 15:23 786 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: