
好的,我们来对 Oracle 19C 中的 V$PROCESS_PRIORITY_DATA 动态性能视图进行一次全面、深入的详解。这个视图提供了关于 Oracle 进程优先级管理 (Process Priority Management) 的运行时数据,是一个相对高级且专精的诊断工具。
1. 作用与概述
V$PROCESS_PRIORITY_DATA 动态性能视图提供了数据库中进程优先级分配和管理的详细运行时信息。它与 Oracle Database Resource Manager (DBRM) 的 Process Priority Management 功能紧密集成。
核心作用:展示 Oracle 进程(包括后台进程和服务器进程)如何被操作系统调度器分配和管理优先级。它用于确保在系统资源紧张时(特别是 CPU 资源),关键的后台进程(如 LGWR, DBWn, PMON)能获得比非关键的用户进程更高的调度优先级,从而保障数据库的稳定性和核心功能的运行。
2. 使用场景
- 验证和监控进程优先级配置:确认 Resource Manager 的进程优先级管理设置是否已正确应用并生效。
- 诊断系统资源竞争问题:当系统负载极高、响应迟缓时,使用此视图检查关键后台进程的优先级是否被正确提升,以确保数据库的“心跳”(如日志写入)不被饿死。
- 性能优化与调优:评估当前优先级策略的有效性,并根据观察结果调整 Resource Manager 的计划或优先级映射规则。
- 排除因优先级不当引发的故障:极少数情况下,不正确的优先级设置可能导致意想不到的后果(如某个进程始终无法获得CPU),此视图可用于排查此类问题。
3. 字段含义详解
以下是 V$PROCESS_PRIORITY_DATA 视图的主要字段及其含义的详细表格。
| 字段名 | 类型 | 含义详解 |
|---|---|---|
| PROCESS_ID | NUMBER | Oracle 进程标识符:与 V$PROCESS.PID 对应,唯一标识一个数据库进程。 |
| OPERATING_SYSTEM_PID | VARCHAR2(12) | 操作系统进程标识符:与 V$PROCESS.SPID 对应,表示该数据库进程在操作系统层面的真实进程 ID。 |
| PROCESS_NAME | VARCHAR2(5) | 进程名称:与 V$PROCESS.PNAME 对应。对于后台进程,此字段显示进程名称(如 PMON, DBW0, LGWR)。对于服务器进程,此字段通常为 NULL。 |
| PRIORITY_LEVEL | VARCHAR2(8) | 优先级级别:核心字段。表示 Resource Manager 分配给此进程的逻辑优先级。重要值包括: - CRITICAL: 最高优先级,分配给最核心的后台进程(如 LGWR, LMON, LMHB, LMS*, RMS0)。- HIGH: 高优先级,分配给重要的后台进程(如 DBWn, PMON, PSP0, SMON, VKTM)。- MEDIUM: 中优先级,通常分配给服务器进程(用户会话)。 - LOW: 低优先级,可分配给非紧急的批处理作业。 |
| OPERATING_SYSTEM_PRIORITY | NUMBER | 操作系统优先级:核心字段。表示该进程当前在操作系统上实际运行的调度优先级数值。该值的具体范围和含义因操作系统而异(例如,在 Linux 上,值越小优先级越高)。 |
| PRIORITY_MANAGEMENT | VARCHAR2(7) | 优先级管理状态:指示此进程的优先级是否正由 Oracle 自动管理。 - ENABLED: 此进程的优先级正由 Oracle Database Resource Manager 自动管理和调整。 - DISABLED: 此进程的优先级未被 Oracle 管理(使用操作系统默认优先级)。 |
| CURRENT_PRIORITY | VARCHAR2(8) | 当前优先级:此进程的当前有效优先级级别。通常与 PRIORITY_LEVEL 相同。 |
| POLICY | VARCHAR2(8) | 管理策略:指示优先级管理的策略。在 19c 中,通常为 AUTO,表示由 Oracle 自动管理。 |
4. 相关视图与基表
V$PROCESS:最直接的相关视图。通过PROCESS_ID或OPERATING_SYSTEM_PID与V$PROCESS.PID或V$PROCESS.SPID关联,可以获取进程的详细信息(如PROGRAM,BACKGROUND)。V$RSRC_PROCESS_HISTORY:显示进程优先级的历史变化记录,可用于分析优先级动态调整的过程。V$RSRC_CONSUMER_GROUP:资源消费者组信息。进程优先级可以基于其所属的消费者组进行映射。DBA_RSRC_MAPPING_PRIORITY:数据字典视图,显示优先级映射规则的静态配置,即如何根据会话属性(如SESSION_ATTRIBUTE)将其映射到不同的PRIORITY_LEVEL。- 基表 (Underlying Table):
V$PROCESS_PRIORITY_DATA的数据来源于实例内存中维护进程优先级状态的结构。其底层 X表∗∗通常是∗∗‘X表** 通常是 **`X表∗∗通常是∗∗‘XKSUPRPRI` (Kernel Service Process Priority) 或类似结构。这些是 Oracle 内部的、未公开的结构。
5. 底层详细原理与相关知识点
-
Process Priority Management 原理:
- 此功能旨在防止在极端 CPU 竞争下,非关键的用户进程“饿死”关键的后台进程。
- Oracle 内部根据进程的重要性,为其预定义或动态分配一个
PRIORITY_LEVEL(如CRITICAL,HIGH)。 - Oracle 的进程(
ora_xxx_<sid>)会调用操作系统的 API(如 Linux 上的setpriority()或sched_setscheduler()),主动请求操作系统将其调度优先级调整到与PRIORITY_LEVEL相对应的值。 - 操作系统内核的调度器最终会尊重这个请求,在分配 CPU 时间片时优先调度高优先级的 Oracle 进程。
-
优先级映射规则:
- 服务器进程(用户进程)的优先级不是固定的。Resource Manager 可以根据映射规则,基于会话的属性(如
USERNAME,MODULE,ACTION,SERVICE_NAME)来动态决定其优先级。 - 例如,可以配置一条规则,将为
ERP_SERVICE服务连接的进程优先级设置为MEDIUM,而为REPORTING_SERVICE服务的进程优先级设置为LOW。 - 这些规则存储在
DBA_RSRC_MAPPING_PRIORITY中,并由 Resource Manager 在会话创建或属性改变时应用。
- 服务器进程(用户进程)的优先级不是固定的。Resource Manager 可以根据映射规则,基于会话的属性(如
-
与操作系统交互:
OPERATING_SYSTEM_PRIORITY字段的值完全依赖于操作系统。- Linux 示例: 通常使用 nice value。范围一般是 -20 (最高优先级) 到 19 (最低优先级)。Oracle 的
CRITICAL进程可能会设置为 -10 或更高。 - 可以使用
ps -eo pid,ni,pri,cmd | grep ora_命令在操作系统层面验证,输出的NI(nice) 列应与OPERATING_SYSTEM_PRIORITY字段值匹配。
-
启用与配置:
- 进程优先级管理默认是启用的。
- 其行为主要由
_high_priority_processes等隐藏参数控制(例如,_high_priority_processes= LMS*|LMON|LMHB|LMD0|LNC0|LMS0|LCK0|RMS0|RVWR|VKTM|PMON|SMON|DBW0|DBW1|LGWR|DIAG|PSP0|DBRM|GEN0),这些参数定义了哪些进程名属于CRITICAL/HIGH级别。 - 注意:修改这些隐藏参数风险极高,需在 Oracle Support 的指导下进行。
6. 常用查询 SQL
1. 查看所有进程的优先级信息(基础查询)
此查询将进程基本信息与优先级信息关联起来。
SELECT p.spid OS_PID,
pr.process_id Ora_PID,
p.pname Process_Name,
p.program,
pr.priority_level,
pr.operating_system_priority OS_Priority,
pr.priority_management,
pr.current_priority
FROM v$process_priority_data pr
JOIN v$process p ON pr.operating_system_pid = p.spid
ORDER BY pr.priority_level, pr.operating_system_priority;
-- 注意:排序按优先级级别和OS优先级,可以直观看到优先级从高到低的分布
2. 检查关键和高优先级后台进程的当前状态
确保最重要的进程获得了应有的高优先级。
SELECT pr.process_id,
p.pname,
pr.priority_level,
pr.operating_system_priority,
pr.priority_management
FROM v$process_priority_data pr
JOIN v$process p ON pr.operating_system_pid = p.spid
WHERE pr.priority_level IN ('CRITICAL', 'HIGH')
ORDER BY pr.priority_level, p.pname;
3. 查找优先级管理未启用的进程
检查是否有进程意外地脱离了优先级管理。
SELECT pr.process_id,
p.pname,
p.program,
pr.priority_management
FROM v$process_priority_data pr
JOIN v$process p ON pr.operating_system_pid = p.spid
WHERE pr.priority_management = 'DISABLED';
4. 验证用户进程的优先级分配(结合V$SESSION)
查看用户会话及其对应的服务器进程的优先级。
SELECT s.sid,
s.serial#,
s.username,
s.module,
s.service_name,
p.spid,
pr.priority_level,
pr.operating_system_priority
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
JOIN v$process_priority_data pr ON p.spid = pr.operating_system_pid
WHERE s.type = 'USER' -- 只查询用户会话
AND s.username IS NOT NULL
ORDER BY pr.operating_system_priority;
-- ORDER BY pr.priority_level DESC, pr.operating_system_priority;
总结
V$PROCESS_PRIORITY_DATA 视图是深入理解和管理 Oracle Process Priority Management 功能的核心诊断界面。它搭建了一座桥梁,连接了 Oracle Resource Manager 的逻辑优先级设定 (PRIORITY_LEVEL) 和操作系统层面的实际调度优先级 (OPERATING_SYSTEM_PRIORITY)。
通过此视图,DBA 可以:
- 确认数据库的核心进程(如 LGWR, DBWn)是否获得了更高的操作系统调度优先级。
- 验证基于规则的优先级映射是否按预期应用于用户会话。
- 诊断在极端系统压力下,因优先级竞争导致的性能问题。
- 监控和审计整个数据库的进程优先级状态。
这是一个面向高级故障诊断和性能优化的视图,对于维护高可用、高性能的关键业务数据库系统至关重要。
欢迎关注我的公众号《IT小Chen》
914

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



