Oracle共享服务器  --  理论

来源:互联网 发布:手机自动校时软件 编辑:程序博客网 时间:2024/05/29 18:15
作者:GDY1039

关于直接连接和共享服务器进程

Oracle数据库创建服务器进程以处理用户进程连接到数据库实例的请求,服务器进程可以是以下两种形式之一:
Dedicated server process -- 共服务一个用户的进程
Shared Server process -- 可以服务多个用户


直接连接进程

图4-1展示直接连接如何工作,这个情景下,两个用户进程通过直接连接进程连接到数据库。
通常使用Shared Server并通过Dispatcher连接到数据库会更好,一个Shared Server可以更高效因为它处理多个请求却使用更少的资源。图4-2展示Shared Server如何工作。
在以下的情况,用户和管理员应该明确使用Dedicated Server连接
  • 提交一个批处理作业
  • 使用Recovery Manager来备、还原或恢复一个数据库

配置Dedicated Server

如要在一个配置为Shared Server的数据库中使用Dedicated Server,用户必需使用一个配置为Dedicated Server的net service name。具体地说,以下参数必需包含在连接描述中 SERVER=DEDICATED

Figure 4-1 Oracle Database Dedicated Server Processes


Figure 4-2 Oracle Database Shared Server Processes



 

Description of Figure 4-1 follows

Oracle Share Server

形象比喻

Oracle Shared Server工作方式就像许多餐馆一样,一个服务员会服务多个餐桌。如果多数餐桌点菜量都很小,则餐馆只需要很少服务员即可满足需要,并且客户不会觉得自 己等待太久,这就是共享服务器的优点。但是如果忽然两个 餐桌来了很多客人,服务员会被这两个餐桌的工作淹没,其它餐桌就有可能无法因此获得及时响应,这就是共享服务器的缺点,也是它不适应的地方。

Oracle Share Server的优点和缺点

优点:

  1. 通常情况下,Oracle Shared Server能让读者在不需要增加硬件的情况下支持相同或更大数量的连接
  2. Connection Pooling特性能使数据库服务器断开一个空闲的OracleShared Server连接来服务一个输入请求
  3. Oracle Share Server是使用诸如Oracle Connection Manager等选件所必需的基础

缺点:

  1. 生成大量网络通信信息或产生大型结果集合的应用软件不适合Oracle Share Server
  2. 使用一个Oracle Share Server连接时,有些功能会被禁止。如不能启动、关闭或执行Oracle服务器的某些类型的恢复
  3. 不应使用它执行某些管理任务。如批量装入、索引与表的重建以及表分析。

Oracle Shared Server基础结构解析

使用Oracle  Shared Server时的PGA与SGA的变化

  1. 使用专用服务器时PGA包括:游标状态、用户会话数据和栈空间三部份内存。而Oracle Shared Server中PGA只有栈空间。
  2. 专 用服务器SGA包括Shared Pool,数据库高速缓存和重做日志缓冲器。而Oracle Shared Server的SGA包括Shared Pool、数据库高速缓存、数据库缓冲器、大型池(由纵多"用户全局区“组成)、一个请求队列和多个调度程序响应队列组成。
  3. 调度程序所维护的每个连接均被分配一个共享内存段,并形成虚拟电路(virtual circuit),调度程序使用它来管理客户与Oracle数据库之间的通信。

客户连接  Oracle Shared Server 的工作流程

  1. 客户在解析了服务器名称之后联系Oracle数据库
  2. Oracle后台进程PMON(进程监视器)实时通知监听器调度程序(Dispatcher)正维护那些虚拟电路。由此,监听器知道该调度程序(Dispatcher)正管理着的连接数量,这个信息使得监听器能够利用调度程序负荷平衡特性
  3. 监听器确认客户供给的Oracle Service Name,然后找到连接数最小(或负荷最小)的调度程序,并把客户连接请求传递或重定向到最小负荷调度程序(Dispatcher)。
  4. 监听器把调度程序信息发回客户,以便客户能够把连接重定向到合适的调度程序进程。
  5. PMON把连接信息注册给所有监听器,所有监听即可知道刚才的调度程序(Dispatcher)已经增加了一个连接
  6. Dispatcher把用户请求放到全局共用的请求队列 
  7. Shared Server Process执行每个请求,并把已完成的请求放到Dispatcher的响应队列中
  8. Dispatcher把已完成请求返回给客户
  9. 当一个客户连接终止时,PMON再次通监听器,以反映调度程序正在处理的连接数的变化。

配置Oracle Shared Server

共享内存资源已经被默认配置,所以读者不必要配置,但如果如果有更适合生产环境的配置,它也可以被更改。我们可以使用ALTER SYSTEM修改DISPATCHERS或SHARED SERVER。
  • 启用Orache Shared Server
  • Oracle Shared Server的初始化参数
  • 配置Dispatchers
  • 监视Shared Server

启用和关闭Oracle Shared Server

一旦配置SHARED_SERVERS参数被配置成大于0,数据库即转换成Oracle Shared Server状态,这种情况Dispatcher默认为1
如果SHARED_SERVERS参数被清除,数据库即从Oracle Shared Server转换成专用服务器。
为了向后兼容,如果启动时Shared_servers没有指定,而Dispatcher被指定大于0的值,Shared_server即被启用,默认值为1

如何确定数据库正处于专用服务器状态或是Oracle Shared Server状态
在LSNRCTL中执行SERVICE指令,如果正处于专用服务器状态,结果应该像下面

LSNRCTL> service
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
    处理程序:
      "DEDICATED" 已建立:0 已被拒绝:0
         LOCAL SERVER
服务 "orcl" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    处理程序:
      "DEDICATED" 已建立:50 已拒绝:0 状态:ready
         LOCAL SERVER
服务 "orclXDB" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    处理程序:
      "D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 1324>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1126))
服务 "orcl_XPT" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    处理程序:
      "DEDICATED" 已建立:50 已拒绝:0 状态:ready
         LOCAL SERVER
命令执行成功

如果正处于Oracle Shared Server状态,SERVICE指令的结果应该像下面

LSNRCTL> service
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
    处理程序:
      "DEDICATED" 已建立:0 已被拒绝:0
         LOCAL SERVER
服务 "orcl" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 6 个处理程序...
    处理程序:
      "DEDICATED" 已建立:121 已拒绝:0 状态:ready
         LOCAL SERVER
      "D001" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready     从D000至D001共有5个Dispatcher
         DISPATCHER <machine: NETPLUS, pid: 3580>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1758))
      "D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 1996>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1757))
      "D002" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 320>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1759))
      "D003" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 1964>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1760))
      "D004" 已建立:1 已被拒绝:0 当前: 1 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 876>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1761))
服务 "orclXDB" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 0 个处理程序...
服务 "orcl_XPT" 包含 1 个例程。
  例程 "orcl", 状态 READY, 包含此服务的 6 个处理程序...
    处理程序:
      "DEDICATED" 已建立:121 已拒绝:0 状态:ready
         LOCAL SERVER
      "D001" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 3580>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1758))
      "D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 1996>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1757))
      "D002" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 320>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1759))
      "D003" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 1964>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1760))
      "D004" 已建立:1 已被拒绝:0 当前: 1 最大: 1002 状态: ready
         DISPATCHER <machine: NETPLUS, pid: 876>
         (ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1761))
命令执行成功


Oracle Shared Server的初始化参数

以下初始化参数控制Shared Server,它们都可以通过ALTER SYSTEM动态修改
  • SHARED_SERVERS: 指定实例启动时Shared_servers启动的最小值,这是Shared Server唯一必需的参数

    • 例:ALTER SYSTEM SET SHARED_SERVERS=5
  • MAX_SHARED_SERVERS: 指定可以并发运行的最大数量SHARED SERVER

  • SHARED_SERVER_SESSIONS:指定共享服务器可以接受的最大会话数量,即使到了这个会话数量,专用连接也是可以进入的。

  • DISPATCHERS: 配置SHARED SERVER结构的DISPATCHERS数量

  • MAX_DISPATCHERS:指定可并发运行的最大数量DISPATCHER。这个参数现在可以被忽略,因为它只在以后的版本中,DISPATCHERS会根据连接数动态调节,的情况下有用。

  • CIRCUITS: 为入站或出站网络会话指定总的虚拟电路数量。一般它不应被手动修改。

决定Shared_servers的值

Shared_Servers参数指定数据库实例启动时至少启动的SHARED_SERVERS数量,实例启动后数据库可根据服务器的繁忙程度和请求队列的长度来启动更多的SHARED_SERVER
PMON不能把Shared_Server的数量减少到Shared_Servers的值以下,所以能使用该参数保证Shared_Servers的数量.
如果每个连接都有较少量的处理,每25个连接配置一个共享服务器应该是足够的。如果用户需要较大的结果集或密集型的处理,则应该减少平均每服务器处理的连接数

限制Shared Server的数量

参数MAX_SHARED_SERVERS参数指定可由PMON启动的最大Shared_Servers数量。它没有默认值,如果未被指定,PMON将根据需要启动。
SHARED_SERVERS的值覆盖MAX_SHARED_SERVER的值,因为你可以通过为SHARED_SERVERS指定较大的值,以此强制PMON启动超出MAX_SHARED_SERVER限制的进程数。
限制SHARED SERVER的进程数的主要原因是保留服务器资源,例如:
  • 在备份的时候备份作业获取更大的资源
  • 业务繁忙时防止过多的Shared_servers使得服务器当机
  • 另一个原因是服务器调试和性能分析。例如慢慢增加Max_Shared_Servers直至用户不感觉到服务的延时。

限制SHARED SERVER的会话数量

SHARED_SERVER_SESSION参数限制SHARED_SERVER是的最大并发用户会话数,以此为直接连接保留会话数,以此确保使用直接连接执行管理任务时不会被Shared server占用完所有会话数。
它没有默认值,如果未被指定,系统将按需要启动,它受初始化参数SESSIONS限制

保护共享内存

CIRCUITS参数设置可以在共享内存中被启动的虚拟电路数量。它没有默认值,如果未被指定,系统将按需要启动,它受限于Dispatcher参数和系统资源。

配置Dispatcher

如果启动SHARED SERVER,而DISPATCHER又未被指定,数据库会至少启动一个Dispatcher,在这种情况下DISPATCHER配置如下:
dispatchers="(protocol=tcp)"

DISPATCHERS 初始化参数

网络协议地址通过一个或多个以下属性指定
Attribute Description ADDRESS 指定Dispatchers监听的网络协议地址 DESCRIPTION 指定Dispatchers监听的网络协议地址的描述。 PROTOCOL 指定Dispatchers监听的网络协议

以下属性指定启动多少个Dispatcher,默认为1

Attribute Description DISPATCHERS 指定初始启动的Dispatcher数量

以下属性告诉实例每个Dispatcher的网络属性。它们都是可选的。

Attribute Description CONNECTIONS 指定每个Dispatcher可启动的最大连接数Specify the maximum number of network connections to allow for each dispatcher. SESSIONS 指定每个Dispatcher可启动的最大会话数 TICKS Specify the duration of a TICK in seconds. A TICK is a unit of time in terms of which the connection pool timeout can be specified. Used for connection pooling. LISTENER PMON把连接信息发送到的那个监听器的地址。这个属性公在监听器为非本地监听器,使用一个不同于1521的监听端口,默认端口呼LOCAL_LISTENER参数还未得到指定,或监听器正在驻留在一个不同的网络节点上时才需要被设置。 MULTIPLEX Used to enable the Oracle Connection Manager session multiplexing feature. POOL 用来启用连接池特性 SERVICE Dispatcher将向监听器中指定的Service列表注册。

你可以使用3个或更长的首字母作为参数的缩写。For example, you can specify SESSIONS=3, SES=3, SESS=3, or SESSI=3, and so forth.


决定Dispatchers的数量

一旦你知道操作系统上每个进程支持的最大连接数,可通过以下公式计算
Dispatchers数量=最大并发会话数/每个Dispatcher的每个连接数
假设系统支持每个进程970个连接,并且
最大并发TCP会话数为4000
最大并发SLL TCP会话数为2500
则根据(4000/9700) 和 (2500/970),Dispatcher应该这样配置
Dispatchers="(PROT=TCP)(DISP=5)(PROT=TCPS)(DISP=3)"

设置初始的Dispatchers数量

例:这是一个典型例子
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))"

修改Dispatchers的数量

根Shared_Servers不同,Dispatcher不会自动改变。你可以通过ALTER SYSTEM改变Dispatcher的数量。并且可以启动多于Max_Dispatchers数量的Dispatchers,因为Max_Dispatcher在将来的版本可能有用,但本版本中并不工作。
监视以下视图得知Dispatcher进程的负载
V$QUEUE -- 显示Dispatcher的请求和响应队列
V$DISPATCHER -- 显示各个Dispatcher的详细信息
V$DISPATCHER_RATE -- 显示Dispatcher的统计数据
这个视图可得知Dispatcher进程的负载,如果负载太高,则需要增加Dispatcher,反之减少。
当减少Dispatcher时,它不会马上减少,而且等用户断开连接后再减少。

当你改变Discription,address,protocol,connections,ticks,multiplex和POOL属性时,改变不会对现有Dispatchers生效,而只会对新Dispatcher生效。所以要想对所有Dispatcher生效,必需杀掉现有Dispatcher,让系统重新启动新Dispatcher.

关闭指定Dispatcher
为找到特定Dispatcher,可查询动态性能视图
Select Name,Network from V$DISPATCHER;
结果中,Dispatcher会以"Dnnn"的形式展示,所以关闭D001 Dispatcher可用以下命令
ALTER SYSTEM SHUTDOWN IMMEDIATE 'D001';

监视Shared Server
以下视图对于获取你的Shared Server配置和性能监视非常有用
View Description V$DISPATCHER 提供DISPATCHER信息,包括名称,网络地址,状态, various usage statistics, and index number. V$DISPATCHER_CONFIG 提供关于DISPATCHER的配置信息 V$DISPATCHER_RATE 提供DISPATCHER的统计信息 V$QUEUE 包含Shared Servers信息队列的信息 V$SHARED_SERVER 包含Shared Servers的信息 V$CIRCUIT 包含虚拟电路的信息,一种用户通过Dispatcher 和 Servers连接到数据库的东东。 V$SHARED_SERVER_MONITOR 包含调试Shared Server的信息 V$SGA 包含system global area (SGA) 的信息。可能会对于调试Shared Server非常有用。
V$SGASTAT 包含SGA的详细统计信息。 V$SHARED_POOL_RESERVED 列出统计信息以帮助调节保留池和共享池

调节共享服务器选项

调节共享服务器选项应该考虑到的地方
  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大小

一般来说,每个连接需要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>

确定是否有足够的Dispatcher

查询V$dispatcher可监视各Dispatcher进程,从而得知各Dispatcher有多繁忙。如果Dispatcher繁忙时间百分比超过50%,则需要考虑启动更多的调度程序。
以下例显示D000繁忙的比率大约只是0.001%
SQL> select  name, (busy/(busy + idle)) "dispatcher busy rate" from v$dispatcher
;

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

SQL>

测量用户等候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>

确定是否有足够的共享服务器
下例显示请求队列中的平均等时间比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>

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

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

总结

定义直接连接只需使用net service定义参数server=dedicated
启动和关闭Shared server只需要定义Shared Servers参数
Shared Server会有PMON按繁忙程度启动或减少,我们可定义Shared Server的最小值和自动启动的最大值。
Dispatcher不会自动管理,所以需要手工定义。

原创粉丝点击