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
Oracle Share Server
形象比喻
Oracle Shared Server工作方式就像许多餐馆一样,一个服务员会服务多个餐桌。如果多数餐桌点菜量都很小,则餐馆只需要很少服务员即可满足需要,并且客户不会觉得自 己等待太久,这就是共享服务器的优点。但是如果忽然两个 餐桌来了很多客人,服务员会被这两个餐桌的工作淹没,其它餐桌就有可能无法因此获得及时响应,这就是共享服务器的缺点,也是它不适应的地方。
Oracle Share Server的优点和缺点
优点:
- 通常情况下,Oracle Shared Server能让读者在不需要增加硬件的情况下支持相同或更大数量的连接
- Connection Pooling特性能使数据库服务器断开一个空闲的OracleShared Server连接来服务一个输入请求
- Oracle Share Server是使用诸如Oracle Connection Manager等选件所必需的基础
缺点:
- 生成大量网络通信信息或产生大型结果集合的应用软件不适合Oracle Share Server
- 使用一个Oracle Share Server连接时,有些功能会被禁止。如不能启动、关闭或执行Oracle服务器的某些类型的恢复
- 不应使用它执行某些管理任务。如批量装入、索引与表的重建以及表分析。
Oracle Shared Server基础结构解析
使用Oracle Shared Server时的PGA与SGA的变化
- 使用专用服务器时PGA包括:游标状态、用户会话数据和栈空间三部份内存。而Oracle Shared Server中PGA只有栈空间。
- 专 用服务器SGA包括Shared Pool,数据库高速缓存和重做日志缓冲器。而Oracle Shared Server的SGA包括Shared Pool、数据库高速缓存、数据库缓冲器、大型池(由纵多"用户全局区“组成)、一个请求队列和多个调度程序响应队列组成。
- 调度程序所维护的每个连接均被分配一个共享内存段,并形成虚拟电路(virtual circuit),调度程序使用它来管理客户与Oracle数据库之间的通信。
客户连接 Oracle Shared Server 的工作流程
- 客户在解析了服务器名称之后联系Oracle数据库
- Oracle后台进程PMON(进程监视器)实时通知监听器调度程序(Dispatcher)正维护那些虚拟电路。由此,监听器知道该调度程序(Dispatcher)正管理着的连接数量,这个信息使得监听器能够利用调度程序负荷平衡特性
- 监听器确认客户供给的Oracle Service Name,然后找到连接数最小(或负荷最小)的调度程序,并把客户连接请求传递或重定向到最小负荷调度程序(Dispatcher)。
- 监听器把调度程序信息发回客户,以便客户能够把连接重定向到合适的调度程序进程。
- PMON把连接信息注册给所有监听器,所有监听即可知道刚才的调度程序(Dispatcher)已经增加了一个连接
- Dispatcher把用户请求放到全局共用的请求队列
- Shared Server Process执行每个请求,并把已完成的请求放到Dispatcher的响应队列中
- Dispatcher把已完成请求返回给客户
- 当一个客户连接终止时,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
(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))
命令执行成功
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 初始化参数
网络协议地址通过一个或多个以下属性指定
以下属性指定启动多少个Dispatcher,默认为1
以下属性告诉实例每个Dispatcher的网络属性。它们都是可选的。
你可以使用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配置和性能监视非常有用
调节共享服务器选项
调节共享服务器选项应该考虑到的地方
- 确保有足够的Dispatcher,以便客户没有正在等候Dispatcher响应它们的请求
- 确保有足够的Shared Server Process,以便没有请求正在等候得到处理
- 配置Large Pool SGA,以便有足够大的地方存储UGA。
配置Large Pool
- 在init.ora文件中参数LARGE_POOL_SIZE可以被配置成最小300K和至少2G的最大值,最大值跟操作系统相关
- 也可以使用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不会自动管理,所以需要手工定义。