楼主: wgz7747

关于shared server

[复制链接]
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
11#
 楼主| 发表于 2007-5-1 15:57 | 只看该作者
关于shared server的几个初始化参数说明
对于shared server,必须配置的一个参数就是dispatchers这个参数,别的参数都是选配的。
dispatchers采取parameter=value的形式
如下就是一个dispatchers的配置例子
dispatchers='(protocol=tcp)(dispatchers=3)'
当然dispatchers和log_archive_dest_n这个的参数一样,选项很多,但是如果要实现shared server,仅配置这两个parameter,一般情况下就可以了。
另外042的sg上说,根据系统的负载情况,选择配置dispatchers的数量,建议一个dispatchers服务50个concurrent database connections(这里50个我理解的意思应该是连接的connection,但不一定是active的)
另外选配的参数有shared_servers
shared_servers用于指定实例在启动的时候默认启动几个server process,用于服务shared servers
SQL> show parameter dispatchers;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dispatchers                          string      (PROTOCOL=TCP)(dispatchers=3)
max_dispatchers                      integer
SQL> show parameter shared_servers;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers                   integer     30
shared_servers                       integer     3

可以看到我的数据库设置了3个dispatchers,并且设置了三个server process用于shared servers
在下面我的查询中可以看到有三个进程是dispatcher进程,有三个是用于shared server的server process
SQL> select program,background from v$process order by program;

PROGRAM              B
-------------------- -
ORACLE.EXE (ARC0)    1
ORACLE.EXE (ARC1)    1
ORACLE.EXE (CJQ0)    1
ORACLE.EXE (CKPT)    1
ORACLE.EXE (D000)
ORACLE.EXE (D001)
ORACLE.EXE (D002)
ORACLE.EXE (DBW0)    1
ORACLE.EXE (LGWR)    1
ORACLE.EXE (MMAN)    1
ORACLE.EXE (MMNL)    1

PROGRAM              B
-------------------- -
ORACLE.EXE (MMON)    1
ORACLE.EXE (PMON)    1
ORACLE.EXE (PSP0)    1
ORACLE.EXE (QMNC)    1
ORACLE.EXE (RECO)    1
ORACLE.EXE (S000)
ORACLE.EXE (S001)
ORACLE.EXE (S002)
ORACLE.EXE (SHAD)
ORACLE.EXE (SMON)    1
ORACLE.EXE (q000)    1

PROGRAM              B
-------------------- -
ORACLE.EXE (q001)    1
PSEUDO

已选择24行。
可以看出它们都不是后台进程

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
12#
 楼主| 发表于 2007-5-1 16:07 | 只看该作者
042的sg上说shared_server这个参数设置多少都问题不大,因为instance会监控request queue,如果发现等待的request多了之后,会自动生成新的server process来服务于shared server,如果这些server 进程空闲下来的话,instance也会自己来处理这些进程。
042给出的建议是一个server process服务25个concurrent database connections
按这样的比例,是如果dispatchers如果配置3个,那么shared_server就可以配置6个,这样,就可以服务150个user process来共享连接
在我配置了dispatchers和shared_servers这两个参数之后,重启instance,之后我在tnsnames.ora中配置了一个连接串
CLEAR_share =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = wgzhp)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = shared)
      (SERVICE_NAME = clear)
将server=shared设置好之后,使用这个连接串连接就会以shared server连接上数据库
这里需要注意的是配置了instance的参数,只是使instance支持shared server模式连接,但是具体客户端连接过来是不是shared server模式,这是需要在客户端配置连接串的时候指定的
下面我做了个试验,使用我配置的连接串用system用户进行连接,再检查v$session,就可以发现这个session是使用shared server连接过来了
SQL> connect system/clear@clear_share
已连接。
SQL> select username,type,server from v$session;

USERNAME                       TYPE       SERVER
------------------------------ ---------- ---------
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
SYSTEM                         USER       SHARED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED

USERNAME                       TYPE       SERVER
------------------------------ ---------- ---------
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED
                               BACKGROUND DEDICATED

已选择17行。

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
13#
 楼主| 发表于 2007-5-1 16:13 | 只看该作者
另外就是关于dispatchers中的listener和service这两个参数
如果我们的listener监听的默认端口1521,则这个listener参数可以不设置,如果listener监听的不是默认端口1521,并且instance还没有配置local_listener这个初始化参数的话,dispatchers是需要配置listener的,否则就不需要配置
关于dispatchers初始化参数的service部分,如果不指定的话,instance启动的时候启动的这些dispatchers会在注册到listener时帮定到service_names中指定的service,如果要是指定了的话,则会在注册到listener时,只帮定指定的service
这时我们如果要以shared server连接instance的话,在连接串的service_name中写的必须是dispatchers中指定的service

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
14#
 楼主| 发表于 2007-5-1 16:19 | 只看该作者
SQL> select name,status,accept,messages,bytes,breaks,idle,busy,listener,conf_indx from v$dispatcher;

NAME STATUS           ACC   MESSAGES      BYTES     BREAKS       IDLE       BUSY   LISTENER  CONF_INDX
---- ---------------- --- ---------- ---------- ---------- ---------- ---------- ---------- ----------
D000 WAIT             YES         57      23878          0     147088          8          0          0
D001 WAIT             YES         30       6194          0     147094          2          0          0
D002 WAIT             YES          0          0          0     147093          0          0          0

V$dispatcher这个视图主要给出了现在的dispatcher的繁忙程度,以及状态,监控这个视图可以发现现有的dispatcher是不是够用

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
15#
 楼主| 发表于 2007-5-1 16:45 | 只看该作者
v$shared_server_monitor用于监控服务于shared server的server process
max_shared_servers这个参数是比较重要的,这个参数设置的是instance可以启动的最多的server process
circuits这个参数不知道自己理解的是否正确,这个参数设置的目的是为了避免消耗过多的SGA,所以限制进入和出去的network connect,042的sg上说的是
circuits specify the total number of virtual circuits  that are available for inbound and outbound network sessions.

shared_server_sessions设置的用于shared server最大的session个数,这个参数应该是小于sessions这个参数,sessions这个参数是整个实例所能创建的最大的session个数,而shared_server_sessions设置的是用于shared server的session的最大的个数。这样两个参数的差值就是为了保证dedicated server模式连接的数量。这样就能保证不会由于shared server模式连接的session太多,instance不能再提供dedicated server模式的连接。
由于数据库操作是必须以dedicated server模式连接,才能做的。


别的和shared server相关的初始化参数还有
sessions
processes
large_pool_size
local_listener这几个参数

如果不设置large_pool_size的话,那么instance会使用shared pool来存储request queue和reponse queue

oracle的SGA设置的目的是为了重用,就是说一些内存结构放入内存之后,重用的次数越多,则这个SGA区域的作用就越大
比如对于RMAN操作,它也会占用SGA,但是它所占用的这部分内存的重用性就没有,所以为了避免rman所占用的内存将重用性很好的一些sql语句的解析版本给挤出shared pool,就需要设置large_pool_size

个人理解,对于oracle的内存参数的设置,首要需要考虑的就是根据内存结构的重用性是否好,而合理的安排内存
对于哪些重用性不好的内存结构,怎么配置。对于哪些重用性好的内存结构怎么配置,应该尽量将重用性好的内存结构放在一起,并且避免重用性不好的内存结构将重用性好的内存结构给挤出去。
比如db_keep_cache_size、db_recycle_cache_size以及large_pool_size这些参数设置的目的都是用来区分重用性好的内存结构和重用性不好的内存结构的
另外oracle在做大表扫描的时候,将扫描进SGA的block,放到LRU的冷端,也是这个目的,它认为大表扫描的所得到的块,再次访问的可能性比较小,所以放到LRU的冷端,一旦有free block的请求,就将之换出内存。
而对于small table 全表扫描所放入的SGA的block,就放入LRU的热端(这个我记的不是特清楚,应该是的,如果不对的话,恳请指正)

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
16#
 楼主| 发表于 2007-5-1 16:51 | 只看该作者
使用lsnrctl的services命令可以得到一个比较详尽的关于shared server的情况,使用status这个命令就没有shared server的信息
LSNRCTL> services
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=wgzhp)(PORT=1522)))
服务摘要..
服务 "clear" 包含 2 个例程。
  例程 "clear", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
    处理程序:
      "DEDICATED" 已建立:0 已被拒绝:11
         LOCAL SERVER
  例程 "clear", 状态 READY, 包含此服务的 4 个处理程序...
    处理程序:
      "DEDICATED" 已建立:1 已拒绝:0 状态:ready
         LOCAL SERVER
      "D002" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: WGZHP, pid: 6040>
         (ADDRESS=(PROTOCOL=tcp)(HOST=wgzhp)(PORT=3458))
      "D001" 已建立:1 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: WGZHP, pid: 4464>
         (ADDRESS=(PROTOCOL=tcp)(HOST=wgzhp)(PORT=3457))
      "D000" 已建立:1 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: WGZHP, pid: 4928>
         (ADDRESS=(PROTOCOL=tcp)(HOST=wgzhp)(PORT=3455))
服务 "clear2" 包含 1 个例程。
  例程 "clear2", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
    处理程序:
      "DEDICATED" 已建立:0 已被拒绝:0
         LOCAL SERVER
服务 "clear_XPT" 包含 1 个例程。
  例程 "clear", 状态 READY, 包含此服务的 4 个处理程序...
    处理程序:
      "DEDICATED" 已建立:1 已拒绝:0 状态:ready
         LOCAL SERVER
      "D002" 已建立:0 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: WGZHP, pid: 6040>
         (ADDRESS=(PROTOCOL=tcp)(HOST=wgzhp)(PORT=3458))
      "D001" 已建立:1 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: WGZHP, pid: 4464>
         (ADDRESS=(PROTOCOL=tcp)(HOST=wgzhp)(PORT=3457))
      "D000" 已建立:1 已被拒绝:0 当前: 0 最大: 1002 状态: ready
         DISPATCHER <machine: WGZHP, pid: 4928>
         (ADDRESS=(PROTOCOL=tcp)(HOST=wgzhp)(PORT=3455))
命令执行成功
LSNRCTL>

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
17#
 楼主| 发表于 2007-5-1 16:56 | 只看该作者
和shared server相关的数据字典
v$shared_server
v$circuit
v$dispatcher
v$shared_server_monitor
v$queue
v$session
这些视图分别针对了shared server的一个方面
shared server所包括的dispatcher、server process、request queue、reponse queue都是可以从这些视图中发现它们的一些信息的
关于内存的信息,还是需要从v$sgastat视图以及其它的一些关于内存的性能视图

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
18#
 楼主| 发表于 2007-5-1 17:00 | 只看该作者
从下面的这个查询中也可以看出oracle的shared server的queue的数量是取决于dispatcher的数量的,每个dispatcher对应一个response queue,另外还有一个公共的request queue
SQL> select type,queued,wait,totalq from v$queue;

TYPE           QUEUED       WAIT     TOTALQ
---------- ---------- ---------- ----------
COMMON              0          0          8
DISPATCHER          0          0         32
DISPATCHER          0          0         15
DISPATCHER          0          0          0

oracle有自己的advanced queue,
有时候就感觉oracle的一些视图的名字有歧义,比如我看到这个v$queue,我可能还以为是advanced queue的视图呢
这可能也是自己知道的东西太少了吧

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
19#
 楼主| 发表于 2007-5-1 17:09 | 只看该作者
上面有个地方说的是错误的,oracle的net默认的连接方式是shared,如果在连接串中不指定dedicated方式连接的话,默认是shared方式连接
以下几种类型的任务是不能使用shared server方式连接的
1、database administrate 比如数据库启动、停止
2、备份恢复操作,也是必须以dedicated模式连接的
3、batch processing和bulk load操作
4、数据仓库操作

oracle的shared server是一种好的进程和内存使用模型,在系统资源确定的情况下,使用shared server可以支持更多的user process,oracle的shared server适合于大量的用户进程,并且用户进程的request是间歇性或者request所处理的工作量不是太大

如果一个user process的request要处理大量的数据的话,那使用dedicated server还是比较合适的

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
20#
 楼主| 发表于 2007-5-1 17:13 | 只看该作者
042的sg举了一个场景,说在业务高峰期,发现数据库的响应非常慢,经过分析,发现oracle的PGA占用了太多的内存,造成操作系统有非常多的paging操作。
这个时候是使用shared server的一个很好的场景。因为使用shared server,可以用比较少的process,比较少的内存来服务更多的user process

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表