面试宝典:介绍下Oracle数据库动态性能视图 V$QMON_SERVER_STATS

在这里插入图片描述
好的,我们来对 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. 使用场景

此视图主要在以下场景中使用:

  1. AQ 工作负载分析与性能调优

    • 当发现消息传播或处理缓慢时,通过此视图可以确认是单个 QMNn 进程繁忙(可能有一个特别大的作业),还是所有 QMNn 进程都很繁忙(系统级资源不足)。
    • 比较不同 QMNn 进程的 TOTAL_MSGS_PROCESSEDTOTAL_EXEC_TIME,可以判断工作负载是否均衡。
  2. 诊断消息积压问题

    • 结合 V$AQ 查看消息积压数量,再通过本视图查看 PROCESSES_RUNNING 和每个进程的繁忙程度,可以判断当前的工作进程数量和处理能力是否能应对积压。
  3. 资源监控与故障排查

    • 监控 TOTAL_SPAWN_FAILURES 可以检查是否存在因资源不足导致工作进程无法创建的问题。
    • 查看 CURRENT_STATE 可以了解每个工作进程的实时状态(例如,是在执行任务还是空闲)。

3. 字段含义详解

V$QMON_SERVER_STATS 视图中的字段主要描述单个 QMNn 进程的生命周期和活动。

字段名称数据类型含义说明
PROCESS_IDNUMBER该 QMNn 进程的唯一标识符。注意,这不是操作系统 PID,而是 Oracle 内部的 ID。
COORDINATOR_PIDNUMBER管理此 QMNn 进程的 QMNC 协调器进程的 PID。用于与 V$QMON_COORDINATOR_STATS 进行关联。
TOTAL_MSGS_PROCESSEDNUMBER由此 QMNn 进程处理的消息总数。这是衡量该“工人”工作量的核心指标。
TOTAL_EXEC_TIMENUMBER此 QMNn 进程花费在执行任务上的总时间(单位:秒)
TOTAL_IDLE_TIMENUMBER此 QMNn 进程处于空闲状态的总时间(单位:秒)。高空闲时间可能意味着工作分配不足或配置的进程数过多。
TOTAL_EXEC_TIME_BETWEEN_JOBSNUMBER在两个任务之间,进程花费在执行管理操作上的总时间。通常此值较小。
TOTAL_SLEEP_TIMENUMBER进程处于睡眠状态的总时间
TOTAL_WAKEUP_CALLS_RECEIVEDNUMBER此进程被 QMNC 协调器唤醒以执行工作的总次数
CURRENT_STATEVARCHAR2(64)进程的当前状态。常见值:IDLE(空闲,等待工作)、EXECUTING JOB(正在执行任务)、SLEEPING(睡眠)、QUIESCING(正在停止)等。这是非常重要的实时诊断信息。
CURRENT_JOBVARCHAR2(64)当前正在执行的任务类型。例如:FLOW_CONTROLPROPAGATION(传播)、DELAYED_MESSAGES(延迟消息)、EXPIRED_MESSAGES(过期消息)等。
CURRENT_JOB_START_TIMEDATE当前任务开始执行的时间。如果 CURRENT_STATEEXECUTING JOB,这个时间可以告诉你这个任务已经运行了多久。
TOTAL_SPAWN_FAILURESNUMBER尝试创建此进程但失败的次数。通常为 0,若非 0 则表明系统资源(如进程数、内存)可能不足。
LAST_JOBVARCHAR2(64)上一个执行的任务类型
LAST_JOB_START_TIMEDATE上一个任务开始的时间
LAST_JOB_END_TIMEDATE上一个任务结束的时间

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';
      

5. 底层详细原理

  1. 进程创建与分配

    • QMNC 协调器进程在需要处理工作时(如定时器到期、有新消息需要传播),会检查当前空闲的 QMNn 进程池。
    • 如果有空闲进程,QMNC 会将一个工作项(Work Queue Item) 分配给该进程。
    • 如果没有空闲进程且未达到 AQ_TM_PROCESSES 参数限制的最大值,QMNC 会派生(Spawn) 一个新的 QMNn 进程来执行工作。
  2. 工作执行与统计

    • 一旦 QMNn 进程被分配了工作项,其状态会变为 EXECUTING JOBCURRENT_JOB 字段会更新为相应的任务类型(如 PROPAGATION)。
    • QMNn 进程开始执行具体的任务逻辑(例如,从源队列表中选择一批消息,将其插入到目标队列表,并从源队列表中删除)。
    • 在此过程中,Oracle 内核会持续更新与该进程相关的内存计数器:
      • 处理的消息数量 (TOTAL_MSGS_PROCESSED)
      • 消耗的 CPU/执行时间 (TOTAL_EXEC_TIME)
      • 当前状态 (CURRENT_STATE)
    • 任务完成后,这些统计信息会被固化到内存结构 (X$QMSST) 中,进程状态可能变回 IDLELAST_JOB_* 时间戳也会被更新。
  3. 进程生命周期

    • 一个 QMNn 进程一旦被创建,可能会被重复用于执行多个工作项。
    • 如果空闲了很长时间(由内部算法决定),QMNC 会发送一个停止指令,该进程会进入 QUIESCING 状态,完成收尾工作后自行终止。这可以避免不必要的资源浪费。

6. 相关知识点介绍

  • AQ_TM_PROCESSES 参数: 此参数定义了实例中允许存在的最大 QMNn 进程数。设置过小可能导致无法及时处理异步任务(如传播),造成消息延迟;设置过大会消耗更多系统资源(进程、内存)。需要根据实际负载监控 V$QMON_SERVER_STATSV$QMON_COORDINATOR_STATS 来找到平衡点。
  • 任务类型(JOB TYPE): 理解 CURRENT_JOBLAST_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值