
Oracle 19C 数据库中的 V$SHARED_SERVER 动态性能视图非常重要,它用于监控和管理共享服务器(Shared Server)进程的状态和性能指标。共享服务器模式(也称为多线程服务器模式,MTS)允许多个客户端会话共享少量的服务器进程,这在连接数非常多但每个会话活动不频繁的场景下能显著节省系统资源。
下面我将详细介绍这个视图的各个方面。
🧠 V$SHARED_SERVER 视图详解
1. 视图概述与作用
V$SHARED_SERVER 视图主要用于实时监控所有共享服务器进程的状态、繁忙程度以及各种统计信息。当数据库实例配置并运行在共享服务器模式时,Oracle会创建多个共享服务器进程来处理客户端请求。DBA通过查询此视图可以:
- 监控状态:检查每个共享服务器进程当前是空闲、繁忙还是正在处理特定请求。
- 性能诊断:了解服务器进程的繁忙程度、处理了多少请求、是否有等待或阻塞。
- 容量规划:根据负载情况决定是否需要调整
SHARED_SERVERS、MAX_SHARED_SERVERS等初始化参数。 - 解决问题:诊断与共享服务器相关的性能问题或错误(如请求排队过长)。
2. 字段含义详解
下表详细说明了 V$SHARED_SERVER 视图中的各个字段:
| 字段名 (Column Name) | 数据类型 (Datatype) | 描述 (Description) |
|---|---|---|
| NAME | VARCHAR2(4) | 共享服务器进程的名称。其格式通常为 ‘S’ 后跟三位数字(如 S001, S002)。 |
| PADDR | RAW(4 | 8) |
| STATUS | VARCHAR2(16) | 共享服务器进程的当前状态。常见值有: • EXEC: 正在执行SQL语句。 • WAIT (COMMON): 空闲等待,等待从请求队列中获取新的工作。 • WAIT (SEND): 已处理完请求,正等待向调度程序(Dispatcher)的响应队列发送结果。 • QUIT: 进程正在终止。 |
| MESSAGES | NUMBER | 该共享服务器进程已处理的消息(或请求)总数。反映了该进程的工作量。 |
| BYTES | NUMBER | 该共享服务器进程处理的所有消息的总字节数。 |
| BREAKS | NUMBER | 该共享服务器进程中断的次数(通常与恢复相关)。 |
| CIRCUIT | RAW(4 | 8) |
| IDLE | NUMBER | 该共享服务器进程处于空闲状态的总时间(以秒为单位)。 |
| BUSY | NUMBER | 该共享服务器进程处于繁忙状态(处理请求)的总时间(以秒为单位)。这是评估其负载的关键指标。 |
| REQUESTS | NUMBER | 该共享服务器进程已处理的请求总数。与 MESSAGES 类似,是衡量工作量的指标。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,标识该数据属于哪个容器(PDB)。对于非CDB环境,此值为0。 |
💡 核心解读要点:
- STATUS:最关键的字段,直接反映进程的实时活动。
- BUSY 和 IDLE:这两个时间的比值可以反映共享服务器进程的利用率。如果所有进程的
BUSY时间都很高,可能意味着需要增加共享服务器进程的数量(调整MAX_SHARED_SERVERS)。 - REQUESTS/MESSAGES:数值持续增长是正常的,表明进程正在处理工作。可以定期采样计算速率。
3. 使用场景
V$SHARED_SERVER 在以下场景中非常重要:
- 监控共享服务器负载:检查当前有多少共享服务器进程处于繁忙状态(
STATUS = 'EXEC'),判断系统负载是否过重。 - 诊断性能瓶颈:如果发现所有共享服务器进程都非常繁忙(
BUSY值高),而请求队列仍然很长(可通过V$QUEUE查看),则可能需要增加共享服务器进程的最大数量(MAX_SHARED_SERVERS)。 - 识别异常进程:检查是否有共享服务器进程长时间处于非正常状态(如长时间
EXEC可能表示有长时间运行的语句阻塞了该进程)。 - 容量规划与调优:通过分析历史负载情况(
REQUESTS,BUSYtime),为SHARED_SERVERS(初始值)和MAX_SHARED_SERVERS(最大值)参数设置合理的值。
4. 底层原理与相关知识点
4.1 共享服务器架构简介
共享服务器模式的核心思想是解耦用户会话和服务器进程。在专用服务器模式中,一个客户端连接对应一个服务器进程。而在共享服务器模式中,多个客户端会话通过调度进程(Dispatcher) 共享一个公共请求队列和一组共享服务器进程(Pool of Shared Server Processes)。
其基本工作流程如下:
- 连接建立:用户进程通过监听器连接到某个调度进程(Dispatcher)。监听器会根据负载情况选择负担最轻的调度程序。
- 请求提交:用户请求被调度进程接收后,并不会直接处理,而是被放入一个公共请求队列(Common Request Queue) 中。
- 请求处理:空闲的共享服务器进程(其状态从
WAIT (COMMON)变为EXEC)从公共请求队列中取出一个请求并进行处理。 - 结果返回:处理完成后,共享服务器进程将结果放入该调度进程独有的响应队列(Response Queue) 中。
- 结果发送:调度进程持续监控自己的响应队列,一旦发现有结果,就将其取出发送给对应的客户端用户进程。
- 状态更新:完成结果发送后,共享服务器进程状态变回
WAIT (COMMON),等待下一个请求。
V$SHARED_SERVER 视图主要监控的就是上述流程中第3步到第6步中的共享服务器进程。
4.2 相关重要参数
- SHARED_SERVERS:指定实例启动时创建的共享服务器进程的最小数量,也是PMON进程会维持的最小数量。
- MAX_SHARED_SERVERS:指定允许同时运行的共享服务器进程的最大数量。
- DISPATCHERS:配置调度进程的数量和协议。
- CIRCUITS:指定可用于入站和出站网络会话的虚拟电路总数。
5. 相关视图
| 视图名称 | 主要用途描述 |
|---|---|
| V$DISPATCHER | 提供调度进程(Dispatcher)的详细信息,包括名称、网络地址、状态和各种统计信息。 |
| V$DISPATCHER_CONFIG | 提供调度进程的配置信息。 |
| V$QUEUE | 显示共享服务器环境中请求队列和响应队列的统计信息(如当前队列中的消息数)。这是诊断队列是否拥堵的关键视图。 |
| V$CIRCUIT | 显示虚拟电路(Virtual Circuit)的信息,虚拟电路代表了用户进程到调度进程再到共享服务器进程的完整路径。 |
| V$SHARED_SERVER_MONITOR | 提供用于优化共享服务器的监控信息,例如高峰期的活动共享服务器数量等。 |
| V$SESSION | 显示所有会话信息。在共享服务器模式下,SERVER 字段会显示 ‘SHARED’(正在处理任务)或 ‘NONE’(空闲状态,未绑定共享服务器)。 |
| V$PROCESS | 包含所有Oracle进程的信息。通过 V$SHARED_SERVER.PADDR 与 V$PROCESS.ADDR 关联,可以获取操作系统进程ID(PID)等信息。 |
6. 基表信息
与所有 V$ 视图一样,V$SHARED_SERVER 是基于底层 X$ 表 构建的。这些 X$ 表是 Oracle 内核中的内存结构,没有官方文档支持,其结构和命名可能随版本变化。
根据内部研究,V$SHARED_SERVER 很可能基于名为 **XKSUCF∗∗或类似的XKSUCF** 或类似的 XKSUCF∗∗或类似的X 表。
重要提醒:
- X$表是Oracle数据库的内部结构,其命名、结构、字段含义没有公开的官方文档支持,不同版本之间可能会发生变化。
- 强烈不建议 直接查询 X$ 表。Oracle 不支持这样做,且存在风险。所有需要的信息都应通过公开的 V$ 视图获取。
7. 常用查询 SQL
7.1 共享服务器进程状态概览
此查询是监控共享服务器最基本和常用的命令。
SELECT
name,
status,
requests,
busy,
idle,
messages,
circuit
FROM
v$shared_server
ORDER BY
name;
7.2 关联进程信息查询
此查询将共享服务器信息与操作系统进程信息关联起来,更为详细。
SELECT
ss.name AS "Server Name",
ss.status AS "Status",
p.spid AS "OS PID",
ss.requests AS "Requests",
ss.busy AS "Busy Time",
ss.idle AS "Idle Time",
ss.breaks AS "Breaks"
FROM
v$shared_server ss,
v$process p
WHERE
ss.paddr = p.addr
ORDER BY
ss.name;
7.3 共享服务器负载分析
此查询计算每个共享服务器进程的繁忙率,有助于评估负载情况。
SELECT
name,
requests,
busy,
idle,
ROUND((busy / DECODE((busy + idle), 0, 1, (busy + idle))) * 100, 2) AS "Busy Rate (%)"
FROM
v$shared_server
ORDER BY
"Busy Rate (%)" DESC;
7.4 检查繁忙的共享服务器
此查询用于快速找出当前正在处理请求的服务器进程。
SELECT
name,
status,
circuit,
requests
FROM
v$shared_server
WHERE
status = 'EXEC'
ORDER BY
name;
8. 最佳实践与注意事项
- 监控队列状态:监控
V$SHARED_SERVER的同时,一定要结合V$QUEUE视图。如果V$QUEUE中请求队列(TYPE = 'COMMON')的持续积压(QUEUED值很高),而V$SHARED_SERVER显示所有进程都已繁忙,这是增加MAX_SHARED_SERVERS的明确信号。 - 合理设置参数:
SHARED_SERVERS不宜设置过小,以避免进程频繁创建销毁的开销。MAX_SHARED_SERVERS不宜设置过大,需为操作系统和其他进程预留足够资源。
- 会话状态与服务器状态:理解
V$SESSION中的SERVER状态(‘SHARED’ / ‘NONE’)与V$SHARED_SERVER中的STATUS的区别。一个标记为 ‘NONE’ 的会话意味着它当前没有绑定到任何共享服务器进程,而 ‘SHARED’ 则表示它正在被服务。一个 ‘EXEC’ 状态的共享服务器进程肯定正服务于一个SERVER='SHARED'的会话。 - 不适用的场景:共享服务器模式并非万能。批处理作业、大数据量加载、RMAN备份恢复等长时间运行的操作,最好使用专用服务器模式,以避免独占共享资源,影响其他用户的并发性能。
- 连接配置:要使客户端使用共享服务器模式,通常需要在客户端的
tnsnames.ora连接描述符中显式配置(SERVER=SHARED)。 - 内存考虑:在共享服务器模式下,用户会话的UGA(User Global Area)大部分位于SGA中(具体可能在共享池或大型池中)。因此,需要确保
SGA_TARGET或SHARED_POOL_SIZE和LARGE_POOL_SIZE设置得当,以避免ORA-04031错误。
希望以上详细的解释能帮助你全面深入地理解和使用 V$SHARED_SERVER 视图。如果你有任何疑问,欢迎继续提问。
欢迎关注我的公众号《IT小Chen》

被折叠的 条评论
为什么被折叠?



