分类: Oracle
2007-09-15 18:02:12
Figure 4-1 Oracle Database Dedicated Server Processes
Figure 4-2 Oracle Database Shared Server Processes
Oracle Shared Server工作方式就像许多餐馆一样,一个服务员会服务多个餐桌。如果多数餐桌点菜量都很小,则餐馆只需要很少服务员即可满足需要,并且客户不会觉得自 己等待太久,这就是共享服务器的优点。但是如果忽然两个 餐桌来了很多客人,服务员会被这两个餐桌的工作淹没,其它餐桌就有可能无法因此获得及时响应,这就是共享服务器的缺点,也是它不适应的地方。
共享内存资源已经被默认配置,所以读者不必要配置,但如果如果有更适合生产环境的配置,它也可以被更改。我们可以使用ALTER SYSTEM修改DISPATCHERS或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
(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
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1758))
"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1757))
"D002" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1759))
"D003" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1760))
"D004" 已建立:1 已被拒绝:0 当前: 1 最大: 1002 状态: ready
DISPATCHER
(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
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1758))
"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1757))
"D002" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1759))
"D003" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1760))
"D004" 已建立:1 已被拒绝:0 当前: 1 最大: 1002 状态: ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=netplus)(PORT=1761))
命令执行成功
以下初始化参数控制Shared Server,它们都可以通过ALTER SYSTEM动态修改
SHARED_SERVERS
: 指定实例启动时Shared_servers启动的最小值,这是Shared Server唯一必需的参数
MAX_SHARED_SERVERS
: 指定可以并发运行的最大数量SHARED SERVER
SHARED_SERVER_SESSIONS
:指定共享服务器可以接受的最大会话数量,即使到了这个会话数量,专用连接也是可以进入的。
DISPATCHERS
: 配置SHARED SERVER结构的DISPATCHERS数量
MAX_DISPATCHERS
:指定可并发运行的最大数量DISPATCHER。这个参数现在可以被忽略,因为它只在以后的版本中,DISPATCHERS会根据连接数动态调节,的情况下有用。
CIRCUITS
: 为入站或出站网络会话指定总的虚拟电路数量。一般它不应被手动修改。
Shared_Servers参数指定数据库实例启动时至少启动的SHARED_SERVERS数量,实例启动后数据库可根据服务器的繁忙程度和请求队列的长度来启动更多的SHARED_SERVER
PMON不能把Shared_Server的数量减少到Shared_Servers的值以下,所以能使用该参数保证Shared_Servers的数量.
如果每个连接都有较少量的处理,每25个连接配置一个共享服务器应该是足够的。如果用户需要较大的结果集或密集型的处理,则应该减少平均每服务器处理的连接数
参数MAX_SHARED_SERVERS参数指定可由PMON启动的最大Shared_Servers数量。它没有默认值,如果未被指定,PMON将根据需要启动。
SHARED_SERVERS的值覆盖MAX_SHARED_SERVER的值,因为你可以通过为SHARED_SERVERS指定较大的值,以此强制PMON启动超出MAX_SHARED_SERVER限制的进程数。
限制SHARED SERVER的进程数的主要原因是保留服务器资源,例如:
SHARED_SERVER_SESSION参数限制SHARED_SERVER是的最大并发用户会话数,以此为直接连接保留会话数,以此确保使用直接连接执行管理任务时不会被Shared server占用完所有会话数。
它没有默认值,如果未被指定,系统将按需要启动,它受初始化参数SESSIONS限制
CIRCUITS参数设置可以在共享内存中被启动的虚拟电路数量。它没有默认值,如果未被指定,系统将按需要启动,它受限于Dispatcher参数和系统资源。
如果启动SHARED SERVER,而DISPATCHER又未被指定,数据库会至少启动一个Dispatcher,在这种情况下DISPATCHER配置如下:
dispatchers="(protocol=tcp)"
网络协议地址通过一个或多个以下属性指定
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数量=最大并发会话数/每个Dispatcher的每个连接数
假设系统支持每个进程970个连接,并且
最大并发TCP会话数为4000
最大并发SLL TCP会话数为2500
则根据(4000/9700) 和 (2500/970),Dispatcher应该这样配置
Dispatchers="(PROT=TCP)(DISP=5)(PROT=TCPS)(DISP=3)"
例:这是一个典型例子
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_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 |
列出统计信息以帮助调节保留池和共享池 |
调节共享服务器选项应该考虑到的地方
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>
一般来说,每个连接需要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>
查询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>
通过组合查询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不会自动管理,所以需要手工定义。