
Oracle共享服务器(Shared Server)架构深入解析
一、共享服务器概述
官方解释
Oracle共享服务器(Shared Server)是一种先进的数据库连接架构,它远不止是简单的"连接池"。共享服务器采用多生产者-多消费者模型,其中客户端进程与调度器进程(Dnnn)通信,调度器将请求放入公共请求队列,空闲的共享服务器进程(Snnn)从队列中取出请求进行处理,最后将响应放回调度器的响应队列。这种架构通过高效的资源共享和请求分配机制,显著提高了数据库的连接可扩展性和资源利用率。
通俗解释
将共享服务器架构想象成一个高效的呼叫中心系统:
- 专用服务器模式:像为每个客户分配专属客服,无论客户是否咨询,客服都一直占用
- 共享服务器模式:像现代呼叫中心,客户先联系总机(调度器),总机将请求分配给空闲客服(共享服务器)
- 多个客户(生产者)向总机提交请求
- 多个客服(消费者)从任务池获取请求处理
- 处理完成后通过原路返回响应
这种模式避免了资源闲置,大大提高了系统处理能力。
二、共享服务器架构与核心组件
1. 架构组成与数据流
2. 核心进程与内存结构
-- 查看共享服务器进程信息
SELECT name, description FROM V$BGPROCESS WHERE name LIKE 'D%' OR name LIKE 'S%';
-- 查看当前活动的调度器和共享服务器
SELECT * FROM V$SHARED_SERVER_MONITOR;
-- 查看进程详细信息
SELECT program, pid, pname FROM V$PROCESS
WHERE pname LIKE 'D%' OR pname LIKE 'S%';
三、请求处理详细流程
1. 连接建立阶段
-- 客户端连接字符串示例
-- (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521))
-- (CONNECT_DATA=(SERVICE_NAME=prod)(SERVER=SHARED)))
-- 查看调度器配置
SELECT network, status, messages, bytes, breaks
FROM V$DISPATCHER;
-- 查看调度器统计信息
SELECT name, busy, idle, busy/(busy+idle)*100 utilization_pct
FROM V$DISPATCHER_RATE;
2. 请求处理循环
-- 1. 客户端发送请求到调度器
-- 2. 调度器将请求放入公共队列
SELECT * FROM V$QUEUE WHERE type = 'COMMON';
-- 3. 共享服务器从队列获取请求
SELECT * FROM V$SHARED_SERVER WHERE status != 'QUIT';
-- 4. 处理请求并返回响应
SELECT name, requests, busy_time, idle_time
FROM V$SHARED_SERVER ORDER BY requests DESC;
四、内存管理与虚拟电路
1. UGA内存管理
在共享服务器模式下,用户全局区(UGA)存储在SGA中:
-- 查看UGA内存使用
SELECT * FROM V$SGASTAT WHERE pool = 'shared pool' AND name LIKE '%UGA%';
-- 监控共享池使用情况
SELECT * FROM V$SHARED_POOL_ADVICE;
-- 查看虚拟电路信息
SELECT circuit, status, queue, bytes FROM V$CIRCUIT;
2. 内存配置优化
-- 配置共享服务器内存参数
ALTER SYSTEM SET SHARED_SERVERS = 10; -- 初始共享服务器数
ALTER SYSTEM SET MAX_SHARED_SERVERS = 50; -- 最大共享服务器数
ALTER SYSTEM SET SHARED_SERVER_SESSIONS = 100; -- 共享服务器会话数限制
ALTER SYSTEM SET DISPATCHERS = '(PROTOCOL=TCP)(DISP=3)'; -- 调度器配置
-- 配置大池内存(避免共享池碎片化)
ALTER SYSTEM SET LARGE_POOL_SIZE = 256M;
五、性能监控与诊断
1. 关键性能视图
-- 监控共享服务器状态
SELECT * FROM V$SHARED_SERVER_MONITOR;
-- 查看请求队列状态
SELECT * FROM V$QUEUE WHERE type = 'COMMON';
-- 监控调度器性能
SELECT name, status, accepted, refused, busy_rate, idle_rate
FROM V$DISPATCHER;
-- 查看共享服务器负载
SELECT name, status, requests, busy_time, idle_time
FROM V$SHARED_SERVER
ORDER BY requests DESC;
-- 监控虚拟电路
SELECT circuit, server, status, queue, bytes
FROM V$CIRCUIT;
2. 等待事件与性能诊断
-- 查看共享服务器相关等待事件
SELECT event, total_waits, time_waited, average_wait
FROM V$SYSTEM_EVENT
WHERE event LIKE '%shared server%' OR event LIKE '%virtual circuit%'
OR event LIKE '%common queue%'
ORDER BY time_waited DESC;
-- 关键等待事件:
-- virtual circuit wait
-- common queue wait
-- shared server idle wait
-- queue messages
-- 诊断性能问题
SELECT * FROM V$SHARED_SERVER_MONITOR
WHERE status != 'NORMAL';
六、常见问题与解决方案
1. 请求队列拥塞
问题现象:请求队列过长,响应时间变慢
排查方法:
-- 检查队列状态
SELECT * FROM V$QUEUE WHERE type = 'COMMON';
-- 监控队列等待情况
SELECT event, total_waits, time_waited
FROM V$SYSTEM_EVENT
WHERE event = 'common queue';
-- 查看共享服务器利用率
SELECT name, busy_time, idle_time,
ROUND(busy_time/(busy_time+idle_time)*100, 2) utilization_pct
FROM V$SHARED_SERVER;
解决方案:
-- 增加共享服务器进程
ALTER SYSTEM SET SHARED_SERVERS = 25; -- 增加进程数
-- 优化SQL减少处理时间
-- 分析长时间运行的请求
SELECT sql_id, executions, elapsed_time, cpu_time
FROM V$SQL
WHERE executions > 0
ORDER BY elapsed_time DESC;
-- 调整大池大小
ALTER SYSTEM SET LARGE_POOL_SIZE = 512M;
2. 调度器过载
问题现象:调度器拒绝连接或响应缓慢
排查方法:
-- 检查调度器状态
SELECT name, status, accepted, refused, busy_rate
FROM V$DISPATCHER;
-- 查看调度器负载
SELECT network, status, messages, bytes, breaks
FROM V$DISPATCHER;
-- 监控连接拒绝率
SELECT name, accepted, refused,
ROUND(refused/(accepted+refused)*100, 2) refuse_rate
FROM V$DISPATCHER;
解决方案:
-- 增加调度器进程
ALTER SYSTEM SET DISPATCHERS = '(PROTOCOL=TCP)(DISP=5)';
-- 调整调度器配置
ALTER SYSTEM SET DISPATCHERS =
'(PROTOCOL=TCP)(DISP=3)(POOL=ON)(TICK=1)(CONNECTIONS=500)(SESSIONS=1000)';
-- 优化网络配置
ALTER SYSTEM SET DISPATCHERS =
'(ADDRESS=(PROTOCOL=TCP)(HOST=db01)(PORT=1521))(DISP=3)';
3. 内存不足问题
问题现象:UGA内存不足,性能下降
排查方法:
-- 检查大池使用情况
SELECT * FROM V$SGASTAT WHERE pool = 'large pool';
-- 监控UGA内存使用
SELECT SUM(value) total_uga_memory
FROM V$SESSTAT s, V$STATNAME n
WHERE s.statistic# = n.statistic#
AND n.name = 'session uga memory';
-- 查看内存建议
SELECT * FROM V$SGA_TARGET_ADVICE;
SELECT * FROM V$SHARED_POOL_ADVICE;
解决方案:
-- 增加大池大小
ALTER SYSTEM SET LARGE_POOL_SIZE = 1G;
-- 优化内存配置
ALTER SYSTEM SET SGA_TARGET = 4G;
ALTER SYSTEM SET SHARED_POOL_SIZE = 2G;
ALTER SYSTEM SET LARGE_POOL_SIZE = 1G;
-- 监控和调整会话内存限制
ALTER SYSTEM SET SESSIONS_PER_USER = 50;
七、配置优化与最佳实践
1. 容量规划与配置
-- 根据负载估算共享服务器数量
SELECT
-- 当前负载情况
(SELECT COUNT(*) FROM V$SESSION WHERE server = 'SHARED') current_sessions,
(SELECT MAX(requests) FROM V$SHARED_SERVER) max_requests,
-- 建议配置
CEIL((SELECT COUNT(*) FROM V$SESSION WHERE status = 'ACTIVE') * 1.5) suggested_servers,
CEIL((SELECT COUNT(*) FROM V$SESSION) / 100) * 5 suggested_dispatchers
FROM DUAL;
-- 配置优化参数
ALTER SYSTEM SET SHARED_SERVERS = 20; -- 基础服务器数
ALTER SYSTEM SET MAX_SHARED_SERVERS = 100; -- 最大服务器数
ALTER SYSTEM SET DISPATCHERS = '(PROTOCOL=TCP)(DISP=5)';
ALTER SYSTEM SET CIRCUITS = 1000; -- 虚拟电路数
ALTER SYSTEM SET SHARED_SERVER_SESSIONS = 200; -- 共享会话数
2. 监控与维护脚本
-- 创建监控视图
CREATE VIEW shared_server_monitor AS
SELECT
(SELECT COUNT(*) FROM V$SHARED_SERVER WHERE status = 'EXEC') active_servers,
(SELECT current_utilization FROM V$QUEUE WHERE type = 'COMMON') queue_utilization,
(SELECT COUNT(*) FROM V$CIRCUIT) active_circuits,
(SELECT ROUND(SUM(busy_time)/SUM(busy_time+idle_time)*100, 2)
FROM V$SHARED_SERVER) avg_utilization,
(SELECT ROUND(SUM(time_waited)/SUM(total_waits), 2)
FROM V$SYSTEM_EVENT WHERE event = 'common queue') avg_queue_wait
FROM DUAL;
-- 自动化调整脚本
BEGIN
-- 根据负载动态调整共享服务器数量
DECLARE
v_avg_util NUMBER;
v_current_servers NUMBER;
BEGIN
SELECT ROUND(SUM(busy_time)/SUM(busy_time+idle_time)*100, 2)
INTO v_avg_util FROM V$SHARED_SERVER;
SELECT COUNT(*) INTO v_current_servers FROM V$SHARED_SERVER;
IF v_avg_util > 80 THEN
-- 利用率过高,增加服务器
EXECUTE IMMEDIATE 'ALTER SYSTEM SET SHARED_SERVERS = ' ||
LEAST(v_current_servers + 5, 100);
ELSIF v_avg_util < 30 THEN
-- 利用率过低,减少服务器
EXECUTE IMMEDIATE 'ALTER SYSTEM SET SHARED_SERVERS = ' ||
GREATEST(v_current_servers - 2, 10);
END IF;
END;
END;
/
八、故障转移与高可用性
1. 连接时故障转移配置
-- 配置客户端连接字符串支持故障转移
-- (DESCRIPTION=
-- (FAILOVER=ON)
-- (LOAD_BALANCE=ON)
-- (ADDRESS=(PROTOCOL=TCP)(HOST=primary)(PORT=1521))
-- (ADDRESS=(PROTOCOL=TCP)(HOST=standby)(PORT=1521))
-- (CONNECT_DATA=(SERVICE_NAME=prod)(SERVER=SHARED)))
-- 查看连接负载均衡
SELECT name, network, status, accepted, refused
FROM V$DISPATCHER
ORDER BY network;
-- 配置多个监听端点
ALTER SYSTEM SET DISPATCHERS =
'(ADDRESS=(PROTOCOL=TCP)(HOST=db01)(PORT=1521))(DISP=3)',
'(ADDRESS=(PROTOCOL=TCP)(HOST=db02)(PORT=1521))(DISP=2)';
2. 监控连接状态
-- 创建连接健康监控
CREATE VIEW connection_health_monitor AS
SELECT
d.name dispatcher,
d.status,
d.accepted,
d.refused,
ROUND(d.refused/NULLIF(d.accepted + d.refused, 0)*100, 2) refuse_rate,
s.active_servers,
q.queue_depth
FROM V$DISPATCHER d,
(SELECT COUNT(*) active_servers FROM V$SHARED_SERVER WHERE status = 'EXEC') s,
(SELECT current_utilization queue_depth FROM V$QUEUE WHERE type = 'COMMON') q;
-- 设置警报阈值
BEGIN
DBMS_SERVER_ALERT.SET_THRESHOLD(
metrics_id => DBMS_SERVER_ALERT.SHARED_SERVER_UTILIZATION,
warning_operator => DBMS_SERVER_ALERT.OPERATOR_GE,
warning_value => '80',
critical_operator => DBMS_SERVER_ALERT.OPERATOR_GE,
critical_value => '90',
observation_period => 5,
consecutive_occurrences => 3
);
END;
/
九、与传统专用服务器对比
1. 架构对比分析
-- 专用服务器 vs 共享服务器性能对比
SELECT
'DEDICATED' server_type,
COUNT(*) sessions,
SUM(pga_used_mem) total_pga,
AVG(pga_used_mem) avg_pga_per_session
FROM V$PROCESS p, V$SESSION s
WHERE p.addr = s.paddr
AND s.server = 'DEDICATED'
UNION ALL
SELECT
'SHARED' server_type,
COUNT(*) sessions,
SUM(value) total_uga,
AVG(value) avg_uga_per_session
FROM V$SESSTAT s, V$STATNAME n
WHERE s.statistic# = n.statistic#
AND n.name = 'session uga memory'
AND s.sid IN (SELECT sid FROM V$SESSION WHERE server = 'SHARED');
-- 资源使用效率分析
SELECT
server_type,
session_count,
total_memory,
total_memory/session_count memory_per_session,
ROUND(100 * session_count / MAX(session_count) OVER(), 2) efficiency_ratio
FROM (
SELECT
'DEDICATED' server_type,
COUNT(*) session_count,
SUM(pga_used_mem) total_memory
FROM V$PROCESS p, V$SESSION s
WHERE p.addr = s.paddr
AND s.server = 'DEDICATED'
UNION ALL
SELECT
'SHARED' server_type,
COUNT(*) session_count,
(SELECT SUM(bytes) FROM V$SGASTAT WHERE pool = 'large pool') total_memory
FROM V$SESSION
WHERE server = 'SHARED'
);
十、总结
Oracle共享服务器架构通过高效的请求队列和调度机制,提供了显著的可扩展性优势:
核心优势:
- 资源高效利用:通过共享服务器进程服务多个客户端连接
- 高可扩展性:支持数千个并发连接,而不会消耗过多系统资源
- 内置负载均衡:自动分配请求到空闲的共享服务器进程
- 故障恢复能力:支持连接时故障转移和负载均衡
关键成功因素:
- 合理配置:根据工作负载特征调整共享服务器和调度器数量
- 内存优化:确保大池和共享池大小足够支持UGA存储
- 持续监控:定期检查队列状态、服务器利用率和等待事件
- 性能调优:优化SQL减少单个请求处理时间
通过深入理解共享服务器的多生产者-多消费者模型和有效管理队列资源,可以构建高度可扩展的数据库连接架构,满足大规模并发访问的需求。
欢迎关注我的公众号《IT小Chen》
2241

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



