
好的,我们来对 Oracle 19C 数据库中的 V$QMON_SERVER_STATS 动态性能视图进行详尽、深入的解析。这个视图与之前介绍的 V$QMON_COORDINATOR_STATS 相辅相成,是监控 AQ 子系统不可或缺的一部分。
1. 作用与概述
V$QMON_SERVER_STATS 视图用于监控和展示高级队列(Advanced Queueing, AQ)中队列监控从属进程(QMNn)的统计信息和运行状态。
- QMNn 进程: 这些是 AQ 架构中的“工作进程”(Worker Processes),由 QMNC 协调器进程动态创建和管理。它们负责执行具体的、繁重的任务,例如:
- 将消息从源队列传播到目标队列。
- 处理过期的消息。
- 管理延迟的消息。
- 清理保留期已过的消息。
- 视图内容: 此视图提供了每个 QMNn “工人” 的详细工作日志,包括它处理了多少消息、工作了多久、空闲了多久、当前在做什么等。通过这些数据,DBA 可以深入了解 AQ 工作的执行细节,定位性能瓶颈是在哪个工作进程上,或者判断工作负载是否均匀分配。
2. 使用场景
此视图主要在以下场景中使用:
-
AQ 工作负载分析与性能调优:
- 当发现消息传播或处理缓慢时,通过此视图可以确认是单个 QMNn 进程繁忙(可能有一个特别大的作业),还是所有 QMNn 进程都很繁忙(系统级资源不足)。
- 比较不同 QMNn 进程的
TOTAL_MSGS_PROCESSED和TOTAL_EXEC_TIME,可以判断工作负载是否均衡。
-
诊断消息积压问题:
- 结合
V$AQ查看消息积压数量,再通过本视图查看PROCESSES_RUNNING和每个进程的繁忙程度,可以判断当前的工作进程数量和处理能力是否能应对积压。
- 结合
-
资源监控与故障排查:
- 监控
TOTAL_SPAWN_FAILURES可以检查是否存在因资源不足导致工作进程无法创建的问题。 - 查看
CURRENT_STATE可以了解每个工作进程的实时状态(例如,是在执行任务还是空闲)。
- 监控
3. 字段含义详解
V$QMON_SERVER_STATS 视图中的字段主要描述单个 QMNn 进程的生命周期和活动。
| 字段名称 | 数据类型 | 含义说明 |
|---|---|---|
| PROCESS_ID | NUMBER | 该 QMNn 进程的唯一标识符。注意,这不是操作系统 PID,而是 Oracle 内部的 ID。 |
| COORDINATOR_PID | NUMBER | 管理此 QMNn 进程的 QMNC 协调器进程的 PID。用于与 V$QMON_COORDINATOR_STATS 进行关联。 |
| TOTAL_MSGS_PROCESSED | NUMBER | 由此 QMNn 进程处理的消息总数。这是衡量该“工人”工作量的核心指标。 |
| TOTAL_EXEC_TIME | NUMBER | 此 QMNn 进程花费在执行任务上的总时间(单位:秒)。 |
| TOTAL_IDLE_TIME | NUMBER | 此 QMNn 进程处于空闲状态的总时间(单位:秒)。高空闲时间可能意味着工作分配不足或配置的进程数过多。 |
| TOTAL_EXEC_TIME_BETWEEN_JOBS | NUMBER | 在两个任务之间,进程花费在执行管理操作上的总时间。通常此值较小。 |
| TOTAL_SLEEP_TIME | NUMBER | 进程处于睡眠状态的总时间。 |
| TOTAL_WAKEUP_CALLS_RECEIVED | NUMBER | 此进程被 QMNC 协调器唤醒以执行工作的总次数。 |
| CURRENT_STATE | VARCHAR2(64) | 进程的当前状态。常见值:IDLE(空闲,等待工作)、EXECUTING JOB(正在执行任务)、SLEEPING(睡眠)、QUIESCING(正在停止)等。这是非常重要的实时诊断信息。 |
| CURRENT_JOB | VARCHAR2(64) | 当前正在执行的任务类型。例如:FLOW_CONTROL、PROPAGATION(传播)、DELAYED_MESSAGES(延迟消息)、EXPIRED_MESSAGES(过期消息)等。 |
| CURRENT_JOB_START_TIME | DATE | 当前任务开始执行的时间。如果 CURRENT_STATE 是 EXECUTING JOB,这个时间可以告诉你这个任务已经运行了多久。 |
| TOTAL_SPAWN_FAILURES | NUMBER | 尝试创建此进程但失败的次数。通常为 0,若非 0 则表明系统资源(如进程数、内存)可能不足。 |
| LAST_JOB | VARCHAR2(64) | 上一个执行的任务类型。 |
| LAST_JOB_START_TIME | DATE | 上一个任务开始的时间。 |
| LAST_JOB_END_TIME | DATE | 上一个任务结束的时间。 |
4. 相关视图与基表
-
相关动态性能视图:
V$QMON_COORDINATOR_STATS: 最重要的关联视图。通过COORDINATOR_PID字段可以关联到管理这些 worker 的“经理”的统计信息。V$AQ: 查看全局 AQ 消息统计,与 worker 的处理量进行对比。DBA_QUEUES/DBA_QUEUE_TABLES: 查看队列的元数据定义。V$PROCESS: 可以通过复杂的关联(通常需要结合COORDINATOR_PID和内部逻辑)找到对应的操作系统进程信息,但不如V$QMON_COORDINATOR_STATS直接。
-
基表(Underlying Base Table):
- **XQMSST∗∗:这是‘VQMSST**: 这是 `VQMSST∗∗:这是‘VQMON_SERVER_STATS
所依赖的底层内存结构(基表)。与XQMCST‘一样,它是一个未公开的、基于内存的XQMCST` 一样,它是一个未公开的、基于内存的 XQMCST‘一样,它是一个未公开的、基于内存的X 表,存储了每个 QMNn 进程的实时统计信息。严禁直接查询。 - 同样可以通过
V$FIXED_VIEW_DEFINITION查看其构建方式:SELECT view_definition FROM v$fixed_view_definition WHERE view_name = 'GV$QMON_SERVER_STATS';
- **XQMSST∗∗:这是‘VQMSST**: 这是 `VQMSST∗∗:这是‘VQMON_SERVER_STATS
5. 底层详细原理
-
进程创建与分配:
- QMNC 协调器进程在需要处理工作时(如定时器到期、有新消息需要传播),会检查当前空闲的 QMNn 进程池。
- 如果有空闲进程,QMNC 会将一个工作项(Work Queue Item) 分配给该进程。
- 如果没有空闲进程且未达到
AQ_TM_PROCESSES参数限制的最大值,QMNC 会派生(Spawn) 一个新的 QMNn 进程来执行工作。
-
工作执行与统计:
- 一旦 QMNn 进程被分配了工作项,其状态会变为
EXECUTING JOB,CURRENT_JOB字段会更新为相应的任务类型(如PROPAGATION)。 - QMNn 进程开始执行具体的任务逻辑(例如,从源队列表中选择一批消息,将其插入到目标队列表,并从源队列表中删除)。
- 在此过程中,Oracle 内核会持续更新与该进程相关的内存计数器:
- 处理的消息数量 (
TOTAL_MSGS_PROCESSED) - 消耗的 CPU/执行时间 (
TOTAL_EXEC_TIME) - 当前状态 (
CURRENT_STATE)
- 处理的消息数量 (
- 任务完成后,这些统计信息会被固化到内存结构 (
X$QMSST) 中,进程状态可能变回IDLE。LAST_JOB_*时间戳也会被更新。
- 一旦 QMNn 进程被分配了工作项,其状态会变为
-
进程生命周期:
- 一个 QMNn 进程一旦被创建,可能会被重复用于执行多个工作项。
- 如果空闲了很长时间(由内部算法决定),QMNC 会发送一个停止指令,该进程会进入
QUIESCING状态,完成收尾工作后自行终止。这可以避免不必要的资源浪费。
6. 相关知识点介绍
AQ_TM_PROCESSES参数: 此参数定义了实例中允许存在的最大 QMNn 进程数。设置过小可能导致无法及时处理异步任务(如传播),造成消息延迟;设置过大会消耗更多系统资源(进程、内存)。需要根据实际负载监控V$QMON_SERVER_STATS和V$QMON_COORDINATOR_STATS来找到平衡点。- 任务类型(JOB TYPE): 理解
CURRENT_JOB和LAST_JOB字段的含义对诊断至关重要:PROPAGATION: 消息传播,这是最常见的耗时任务。EXPIRED_MESSAGES: 清理过期消息。DELAYED_MESSAGES: 处理已到达延迟时间的消息,使其可用。FLOW_CONTROL: 流控制管理。
- ** Buffered Messaging**: QMNn 进程主要处理缓冲消息(Buffered Messaging) 的异步操作。虽然持久消息的传播也由它们处理,但缓冲消息的整个生命周期(过期、清理)都更依赖这些后台进程。
7. 常用查询 SQL
1. 查看所有 QMNn 工作进程的概况和繁忙程度
SELECT process_id,
coordinator_pid,
total_msgs_processed,
total_exec_time,
total_idle_time,
current_state,
current_job,
current_job_start_time
FROM v$qmon_server_stats
ORDER BY total_msgs_processed DESC;
2. 监控当前正在执行的任务(实时诊断)
SELECT process_id,
current_job,
current_job_start_time,
round((SYSDATE - current_job_start_time) * 86400, 2) as seconds_running,
last_job,
last_job_end_time
FROM v$qmon_server_stats
WHERE current_state = 'EXECUTING JOB';
-- 查看哪些任务运行了很长时间
3. 检查工作负载是否均衡
SELECT process_id,
total_msgs_processed,
total_exec_time,
ROUND(NVL(total_msgs_processed / NULLIF(total_exec_time, 0), 0), 2) as msgs_per_sec
FROM v$qmon_server_stats
ORDER BY process_id;
-- 如果每个进程处理的消息数和执行时间差异巨大,可能意味着工作分配不均衡或有“长任务”
4. 检查进程创建失败和状态
SELECT process_id,
coordinator_pid,
total_spawn_failures,
current_state
FROM v$qmon_server_stats
WHERE total_spawn_failures > 0 OR current_state LIKE '%ERROR%';
-- 任何失败或错误状态都需要立即关注
5. 关联 Coordinator 和 Server 视图,获取完整视图
SELECT c.coordinator_pid as mgr_pid,
s.process_id as worker_id,
s.current_state as worker_state,
s.current_job as worker_job,
c.processes_running as total_workers_running,
s.total_msgs_processed
FROM v$qmon_coordinator_stats c
JOIN v$qmon_server_stats s ON c.coordinator_pid = s.coordinator_pid
ORDER BY s.process_id;
总结
V$QMON_SERVER_STATS 动态性能视图提供了 Oracle Advanced Queueing 系统中“工作进程”(QMNn)的微观视角。它与提供“经理”视角的 V$QMON_COORDINATOR_STATS 视图结合使用,为 DBA 提供了从宏观调度到微观执行的完整监控链条。
通过分析此视图,可以:
- 确认 消息处理瓶颈是否出现在工作进程层面。
- 评估 工作负载在各进程间的分布是否均衡。
- 监控 每个进程的实时健康状态和当前任务。
- 诊断 因资源不足导致的进程创建失败等问题。
熟练掌握这个视图对于维护高性能、高可靠性的消息队列系统至关重要。
欢迎关注我的公众号《IT小Chen》

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



