Oracle共享服务器 -- 实操

来源:互联网 发布:js .target属性 编辑:程序博客网 时间:2024/05/16 19:40
作者:GDY1039

启用SHARED SERVERS和关闭

只需要把SHARED_SERVERS设置为大于1的值,系统即转为SHARED SERVER。关闭SHARED SERVERS只需要把该参数设置为0。


SQL> alter system set shared_servers=2;     #更改已成功

系统已更改。

SQL> select name,status from v$shared_server;       #结果显示有S000和S001两个SHARED SERVERS PROCESS正运行

NAME STATUS
---- ----------------
S000 WAIT(COMMON)
S001 WAIT(COMMON)

SQL> alter system set dispatchers="(protocol=tcp)(dispatcher=2)";

系统已更改。

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS           ACC
---- ---------------- ---
D000 WAIT             YES              #STATUS为WAIT表示空闲,正等待任务,ACC为YES表示可以接受新建连接
D001 WAIT             YES

SQL> alter system shutdown immediate 'D000';

系统已更改。

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS           ACC
---- ---------------- ---
D000 REFUSE           NO         #状态显示拒绝任何新建连接
D001 WAIT             YES

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS           ACC
---- ---------------- ---
D001 WAIT             YES            #过一会再试D000已经关闭

SQL>

SQL> alter system set shared_Servers=0;  #关闭SHARED SERVER

系统已更改。

SQL> select name,status,accept as accept from v$dispatcher;

NAME STATUS           ACC
---- ---------------- ---
D001 WAIT             NO         #所有DISPATCHER均拒绝任何新建连接

SQL> select name,status from v$shared_server;    #没有立即生效,ORACLE手册上说是因为系统会等所有有SHARED SERVER连接断开再停止SHARED SERVER PROCESS。

NAME STATUS
---- ----------------
S000 WAIT(COMMON)
S001 WAIT(COMMON)

SQL> select name,status from v$shared_server;       

NAME STATUS
---- ----------------
S000 QUIT               #过一会再试,变成退出的状态
S001 QUIT

SQL> select name,status from v$shared_server;

NAME STATUS
---- ----------------
S000 TERMINATED           #过一会再试变成终止的状态
S001 TERMINATED

SQL> select name,status from v$shared_server;

未选定行                     #已经没有SHARED SERVER PROCESS了

SQL>


在共享服务器中请求一个专用连接

如果在共享服务器中需要请求一个专用连接,如果正使用TNSNAME命名方法,则只需要添加以下参数即可。SERVER=DEDICATED
ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

修改DISPATCHER

启用SHARED SERVERS后DISPATCHER默认为dispatchers="(PROTOCOL=tcp)"
例:这是一个典型例子
Dispatchers="(PROT=TCP)(DISP=2)"
例:强制使用Dispatcher的地址
Dispatchers="(Address=(Protocol=tcp)(host=144.25.16.201))(dispatchers=2)"
例:强制使用Dispatcher的端口
Dispatchers="(Address=(Protocol=tcp)(Port=5000))"
Dispatchers="(Address=(Protocol=tcp)(Port=5001))"

配置连接池特性

该特性通过预建立一个连接池,客户需要连接时从连接池中取,当连接空闲时自动断开,并放回到连接池,以备下个连接请求使用。该特性赋予了Shared Server处理较大数量连接的能力。如果有大量客户并且大量是空闲连接,则适用该特性,例如WEB。
配置示例如下:
SQL> alter system set dispatchers="(protocol=tcp)(dispatcher=2)(pool=on)(tick=1)
(connections=500)(sessions=1000)";

系统已更改。

SQL>
意思如下:
(DISPATCHER=1)  --  配置一个Dispatcher
(PROTOCOL=TCP) --  接受协议是TCP
(POOL=ON)  --  为它打开连接池特性
(TICK=1)  --  当经过10分钟无通信后,连接会被视为空闲,如果TICK=2,经过20分钟后连接会被视为空闲
(CONNECTIONS=500)  --  该DISPATCHER最大可接受500个连接
(SESSIONS=1000)  -- 该DISPATCHER最大可接受1000个会话

关闭指定DISPATCHER

首先查看DISPATCHER的名称
SELECT NAME, NETWORK FROM V$DISPATCHER;
然后根据名称关闭
ALTER SYSTEM SHUTDOWN IMMEDIATE 'D002';

使用共享服务器的动态性能视图

要知道动态性能视图的完整解释,请下载完整ORACLE文档库,然后定位到以下位置
打开文档库首页->打开BOOK标签页->定位到书名为 "Reference" ->打开HTML版 ->定位到"Part III Dynamic Performance Views“中的Dynamic performance (V$) Views->然后找到需要的视图

 使用V$DISPATCHER


SQL> select name,status,messages,idle,busy,bytes,breaks from v$dispatcher;

NAME STATUS             MESSAGES       IDLE       BUSY      BYTES     BREAKS
---- ---------------- ---------- ---------- ---------- ---------- ----------
D000 WAIT                   8685     217560        705    1501540          0

SQL>

以上查访结果显示:
  • 现在有一个Dispatcher,名称为:D000
  • STATUS为WAIT,表示它正处于空闲的状态
  • MESSAGES表示它已经处理完8685条信息
  • IDLE表示自启动以来空闲了271560,
  • BUSY表示繁忙了705
  • BYTES表示该Dispatcher已处理的所有信息的总字节数
  • BREAKS表示它已经处理过的中断(例如从控制台发到<ctrl>+<c>)

 

使用v$dispatcher_config

该视图含有DISPATCHER的配置信息。包括:监听协议,监听地址,接受的最大连接数和会话数及服务名称信息。
SQL> select conf_indx,dispatchers,connections,sessions "SESS", service from v$dispatcher_config;

 CONF_INDX  DISPATCHERS   CONNECTIONS       SESS  SERVICE
--------------------------------------------------------------------------------

0                  2            1002            1002  orcl,orcl,orcl_XPT


SQL>
结果显示:

   1. 系统配置了两个DISPATCHER
   2. 可接受的连接数和会话数都是1002
   3. 可接受以下服务的请求orcl,orcl,orcl_XPT

使用V$DISPATCHER_RATE

显示DISPATCHER的统计数据,例如已处理的平均字节数,曾经出站与入站的最大连接数及每个客户连接的平均处理字节。其中以CUR开头为当前统计数据,以AVG或MAX为平均或最大统计数据
SQL> select name,cur_event_rate,cur_msg_rate,cur_svr_byte_rate from v$dispatcher
_rate;

NAME CUR_EVENT_RATE CUR_MSG_RATE CUR_SVR_BYTE_RATE
---- -------------- ------------ -----------------
D000             77            0                 0
D001            104            0                 0

SQL>
结果显示:

   1. 有两个调试程序
   2. D000当前大约每分钟处理77个事件
   3. D000当前信息量和字节数都为0

使用V$SHARED_SERVER

下例可看到服务器已经处理了多少个请求和信息,并可看到信息的总大小,并可看到自启动以来总繁忙的时间

NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT IDLE BUSY REQUESTS S000 1EE4CBEC WAIT(COMMON) 146 20872 0 00 287354 966 37

shared server性能调优

调节共享服务器选项应该考虑到的地方
  1. 确保有足够的Dispatcher,以便客户没有正在等候Dispatcher响应它们的请求
  2. 确保有足够的Shared Server Process,以便没有请求正在等候得到处理
  3. 配置Large Pool SGA,以便有足够大的地方存储UGA。

配置Large Pool

  • 在init.ora文件中参数LARGE_POOL_SIZE可以被配置成最小300K和至少2G的最大值,最大值跟操作系统相关
    • 例:LARGE_POOL_SIZE = 50M
  • 也可以使用Slter system修改
    • 例:ALTER SYSTEM SET LARGE_POOL_SIZE=100M
  • 当使用默认值时,共享服务器中的每个会话使Large pool增加250KB,并分配给该会话。
  • 当Large Pool未被配置时,UGA会放在Shared Pool中,这会影响Shared Pool性能,所以应该配置一个Large Pool。
  • 使用V$SGASTAT可检查LARGE POOL正使用的空间。FREE MEMORY显示可供使用的空间,SESSION HEAP显示已使用的空间
SQL> select *from v$sgastat where pool='large pool';

POOL         NAME                            BYTES
------------ -------------------------- ----------
large pool   PX msg pool                    206208
large pool   free memory                   7851120
large pool   session heap                   331280

SQL>
结果显示共有空闲LARGE POOL内存7851120字节,会话头使用了331280字节

确定Large Pool大小

一般来说,每个连接需要1MB到3MB之间的内存
查询V$SESSTAT视图可得到所有连接中最大曾经分配的最大内存。把乘以预计的最大连接数即可得出Large Pool的大小.
SQL> 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
------------------------
                 6167676

SQL>
结果显示单个连接曾最大分配内存为6167676字节

确定是否有足够的Dispatcher

查询V$dispatcher可监视各Dispatcher进程,从而得知各Dispatcher有多繁忙。如果Dispatcher繁忙时间百分比超过50%,则需要考虑启动更多的调度程序。

SQL> select  name, (busy/(busy + idle)) "dispatcher busy rate" from v$dispatcher
;

NAME dispatcher busy rate
---- --------------------
D000           .000121704
D001           .000042597
D002           .004935402

SQL>
以上例显示D000繁忙的比率大约只是0.001%,显然远未达到50%,所以不需要增加DISPATCHER

测量用户等候Dispatcher程序多长时间

通过组合查询V$queue和V$dispatcher可得出结果
SQL> Select decode(sum(totalq), 0, 'no responses', sum(wait)/sum(totalq)) "avera
ge wait time" from V$QUEUE Q, V$DISPATCHER D WHERE Q.TYPE='DISPATCHER' AND Q.PAD
DR=D.PADDR;

average wait time
----------------------------------------
0

SQL>
结果显示用户不需要等待,所以不需要增加DISPATCHER。

确定是否有足够的共享服务器

下例显示请求队列中的平均等时间比0.3秒略多一点
SQL> Select decode(totalq,0,'No Requests') "Wait Time", Wait/totalq || ' hundred
ths of seconds' "Average Wait time per request" from V$QUEUE where type='COMMON'
 ;

Wait Time   Average Wait time per request
----------- --------------------------------------------------------------
            .324324324324324324324324324324324324324 hundredths of seconds

SQL>