Oracle RAC 19c Masterclass — Part 21: Resource Manager, Instance Caging & Workload Control

Part 20 was about RAC Services and how to control where workloads run.

Now we move one level deeper:

Once a workload reaches an instance, how do we control how much CPU and other resources it can consume?

This is where Oracle Database Resource Manager becomes essential.

A production RAC should not operate on the assumption that every workload deserves unlimited resources.

Imagine this:

                    RAC
                     |
        +------------+------------+
        |                         |
      RAC1                      RAC2
        |                         |
      OLTP                    REPORTING
        |                         |
      BATCH                    ETL
        |                         |
      AD-HOC                  BACKUP

Without resource controls, a reporting query or batch process can consume enough CPU to affect the OLTP workload.

Resource Manager gives you a mechanism to establish priorities and limits.

1. The Problem We’re Solving

Suppose your RAC has:

RAC1 = 32 CPU
RAC2 = 32 CPU

And the workloads are:

OLTP
REPORTING
BATCH
AD-HOC

At 09:00:

OLTP      50%
REPORTING 20%
BATCH     10%
AD-HOC     5%

Everything looks fine.

At 14:00 someone launches:

SELECT ...
FROM huge_table
JOIN huge_table2 ...

and suddenly:

REPORTING → 95% CPU

The OLTP application starts slowing down.

Without Resource Manager, the database scheduler has fewer mechanisms to enforce business priorities.

2. Resource Manager in One Diagram

Think of it like this:

                       DATABASE
                          |
                  Resource Manager
                          |
             +------------+------------+
             |            |            |
           OLTP       REPORTING      BATCH
             |            |            |
          HIGH         MEDIUM        LOW
          PRIORITY      PRIORITY     PRIORITY

The goal is not necessarily to make low-priority workloads slow.

The goal is to make sure that:

Critical workloads remain protected when the system becomes busy.

3. Resource Manager Building Blocks

The main concepts are:

Resource Plan
      |
      +-- Consumer Groups
      |
      +-- Resource Directives
      |
      +-- Mapping Rules

Let’s understand each one.

4. Consumer Group

A consumer group represents a category of workload.

For example:

OLTP_GROUP
REPORTING_GROUP
BATCH_GROUP
ADHOC_GROUP

Think of it as:

“Which type of workload is this session performing?”

5. Resource Plan

The resource plan defines the overall policy.

Example:

PROD_PLAN

It can contain directives such as:

OLTP_GROUP       → 60%
REPORTING_GROUP  → 20%
BATCH_GROUP      → 15%
ADHOC_GROUP      → 5%

Conceptually:

              PROD_PLAN
                  |
      +-----------+-----------+
      |           |           |
    OLTP      REPORTING     BATCH
     60%          20%         15%
                  |
                ADHOC
                  5%

These percentages are examples—not a universal recommendation.

6. Resource Directive

A directive defines how a particular consumer group behaves within a resource plan.

For example:

OLTP_GROUP
CPU allocation = high

while:

ADHOC_GROUP
CPU allocation = low

You can also define behavior related to:

  • Parallel execution
  • Active session pools
  • Execution time
  • I/O
  • Queuing
  • Other resource controls depending on your Oracle configuration

7. Why Resource Manager Matters More in RAC

In RAC, you don’t only have:

Database

You have:

RAC
 |
 +-- Instance 1
 |
 +-- Instance 2
 |
 +-- Instance N

A resource policy therefore needs to be considered alongside:

Services
CPU
Cache Fusion
Instance load
Application architecture

This is why Part 20 and Part 21 are closely connected.

8. Services + Resource Manager

The architecture becomes:

Application
     |
   SERVICE
     |
     ↓
Consumer Group
     |
     ↓
Resource Manager
     |
     ↓
CPU / Parallelism / I/O

For example:

SALES_APP
    ↓
OLTP_GROUP
    ↓
HIGH PRIORITY

and:

REPORTING
    ↓
REPORTING_GROUP
    ↓
MEDIUM PRIORITY

9. Check Current Resource Manager Configuration

Start with:

SELECT name,
       is_top_plan,
       cpu_managed,
       status
FROM v$rsrc_plan;

Depending on the Oracle 19c release and configuration, available columns can vary, so verify with:

DESC v$rsrc_plan;

10. Check Consumer Groups

SELECT consumer_group,
       status
FROM dba_rsrc_consumer_groups
ORDER BY consumer_group;

You’ll see Oracle’s predefined consumer groups as well as any custom groups.

11. Check Resource Plans

SELECT plan,
       status,
       comments
FROM dba_rsrc_plans
ORDER BY plan;

Again, expect Oracle-supplied plans in addition to custom plans.

12. Check Resource Directives

SELECT plan,
       group_or_subplan,
       mgmt_p1,
       mgmt_p2,
       mgmt_p3
FROM dba_rsrc_plan_directives
ORDER BY plan, group_or_subplan;

This is one of the most useful views when auditing Resource Manager.

13. Important: Don’t Modify SYS Plans Blindly

Before creating anything, inspect the current configuration.

SELECT *
FROM dba_rsrc_plans;

and:

SELECT *
FROM dba_rsrc_plan_directives
ORDER BY plan;

Never assume the database has no existing resource management configuration.

14. Creating a Consumer Group

Let’s build a simple example.

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'OLTP_GROUP',
    comment        => 'Critical OLTP workload'
  );
END;
/

Another:

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'REPORTING_GROUP',
    comment        => 'Reporting workload'
  );
END;
/

And:

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'BATCH_GROUP',
    comment        => 'Batch processing workload'
  );
END;
/

15. Grant Users Access to Consumer Groups

A user needs permission to switch into a consumer group.

For example:

BEGIN
  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
    grantee_name   => 'APPUSER',
    consumer_group => 'OLTP_GROUP',
    grant_option   => FALSE
  );
END;
/

But don’t confuse:

GRANT SWITCH CONSUMER GROUP

with:

Automatically assigning sessions

We’ll handle automatic mapping next.

16. Consumer Group Mapping

This is where Resource Manager becomes really useful.

You can map sessions based on attributes such as:

Username
Service
Module
Action
Client program
Client OS user

For RAC applications, service-based mapping is particularly interesting.

Conceptually:

SERVICE = SALES_APP
        ↓
OLTP_GROUP

and:

SERVICE = REPORTING
        ↓
REPORTING_GROUP

17. Why Service-Based Mapping Is Powerful

Part 20 established:

Application
    ↓
Service

Now Part 21 extends it:

Application
    ↓
Service
    ↓
Consumer Group
    ↓
Resource Plan

This means the application doesn’t necessarily need to know anything about Resource Manager.

The infrastructure controls it.

18. Mapping Example

For example:

BEGIN
  DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
    DBMS_RESOURCE_MANAGER.SERVICE_NAME,
    'SALES_APP',
    'OLTP_GROUP'
  );
END;
/

And:

BEGIN
  DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
    DBMS_RESOURCE_MANAGER.SERVICE_NAME,
    'REPORTING',
    'REPORTING_GROUP'
  );
END;
/

The exact mapping attributes available should be checked against the Oracle 19c documentation and your environment.

19. Check Mapping Rules

Use:

SELECT attribute,
       value,
       consumer_group
FROM dba_rsrc_group_mappings
ORDER BY attribute, value;

This lets you verify what Oracle will use when assigning sessions.

20. Create a Resource Plan

Now create:

PROD_RAC_PLAN

Example:

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN(
    plan    => 'PROD_RAC_PLAN',
    comment => 'Production RAC workload management'
  );
END;
/

21. Add OLTP Directive

For example:

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan             => 'PROD_RAC_PLAN',
    group_or_subplan => 'OLTP_GROUP',
    mgmt_p1          => 60,
    comment          => 'Critical OLTP workload'
  );
END;
/

This example assigns 60% of the first-level CPU allocation.

It does not mean:

“OLTP will always consume exactly 60% CPU.”

Resource Manager becomes especially meaningful under resource contention.

22. Add Reporting

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan             => 'PROD_RAC_PLAN',
    group_or_subplan => 'REPORTING_GROUP',
    mgmt_p1          => 25,
    comment          => 'Reporting workload'
  );
END;
/

23. Add Batch

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan             => 'PROD_RAC_PLAN',
    group_or_subplan => 'BATCH_GROUP',
    mgmt_p1          => 10,
    comment          => 'Batch workload'
  );
END;
/

24. Add Other Group

You generally want a catch-all category.

For example:

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan             => 'PROD_RAC_PLAN',
    group_or_subplan => 'OTHER_GROUPS',
    mgmt_p1          => 5,
    comment          => 'Other workloads'
  );
END;
/

The exact directives and percentages should be designed from measured workload requirements, not copied blindly.

25. Validate the Plan

Before activating:

BEGIN
  DBMS_RESOURCE_MANAGER.VALIDATE_PLAN(
    plan => 'PROD_RAC_PLAN'
  );
END;
/

This is a very important step.

Don’t activate a resource plan without validation.

26. Enable the Plan

You can set the database parameter:

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='PROD_RAC_PLAN' SID='*';

In RAC, using:

SID='*'

is commonly used when you want the parameter applied across instances, subject to the database configuration.

Check:

SHOW PARAMETER resource_manager_plan;

or:

SELECT inst_id,
       name,
       value
FROM gv$parameter
WHERE name = 'resource_manager_plan';

27. Verify on Every RAC Instance

This is essential.

Run:

SELECT inst_id,
       value
FROM gv$parameter
WHERE name = 'resource_manager_plan'
ORDER BY inst_id;

You want to verify the intended configuration across:

RAC1
RAC2
...

28. Instance Caging

Now we reach another important RAC concept:

Instance Caging

The idea is to limit how much CPU an Oracle instance can consume.

For example:

RAC1
32 physical CPUs

You might configure Oracle to operate with:

CPU_COUNT = 24

Conceptually:

Physical CPU
32
 |
 +-- Oracle instance capacity
     24

This creates a boundary around the instance’s CPU consumption.

29. Why Instance Caging?

Imagine:

RAC1
OLTP + Reporting + Batch

A runaway workload can attempt to consume almost all available CPU.

With appropriate CPU management:

OLTP
   ↓
Protected

Reporting
   ↓
Controlled

Batch
   ↓
Controlled

This can make performance more predictable.

30. CPU_COUNT

Check:

SHOW PARAMETER cpu_count;

or:

SELECT inst_id,
       value
FROM gv$parameter
WHERE name = 'cpu_count'
ORDER BY inst_id;

Example:

INST_ID VALUE
------- -----
1       32
2       32

31. Don’t Change CPU_COUNT Blindly

This is an area where inexperienced DBAs can cause serious problems.

Before changing CPU-related configuration, understand:

Physical CPUs
CPU sockets
NUMA
VM allocation
Hypervisor limits
Oracle licensing
Parallel execution
Resource Manager
Workload

A CPU count is not simply:

“Number of CPUs shown by lscpu.”

32. Linux CPU View

Check:

lscpu

and:

nproc

Also inspect:

cat /proc/cpuinfo

For a VM, verify the actual CPU allocation from the virtualization platform.

33. RAC CPU Balance

Suppose:

RAC1 = 32 CPU
RAC2 = 32 CPU

but workload is:

RAC1 → 90%
RAC2 → 30%

Don’t immediately add CPUs.

Ask:

Why?

Possibilities:

  • Service placement
  • Connection load balancing
  • Batch workload
  • Reporting
  • SQL inefficiency
  • Data locality
  • Application behavior

34. Resource Manager Is Not a Replacement for SQL Tuning

Suppose you have:

SELECT *
FROM SALES
WHERE UPPER(CUSTOMER_NAME) = :1;

and there is no appropriate index.

Resource Manager can limit the workload.

It cannot make the SQL efficient.

The correct hierarchy is:

SQL efficiency
      ↓
Data model
      ↓
Indexes
      ↓
Execution plan
      ↓
Workload distribution
      ↓
Resource controls

Resource Manager protects the system.

It doesn’t eliminate the root cause of inefficient SQL.

35. Parallel Execution Control

This is another important area.

Reporting workloads can use parallel execution:

SELECT /*+ parallel(32) */
       ...
FROM huge_table;

On a 32-CPU system, several users doing this simultaneously can create a serious problem.

For example:

User 1 → PX 32
User 2 → PX 32
User 3 → PX 32

You can quickly oversubscribe the system.

36. Why PX Is Dangerous

Imagine:

32 CPUs

Query A → 16 PX
Query B → 16 PX
Query C → 16 PX
Query D → 16 PX

The theoretical requested parallelism is:

64 PX

on:

32 CPUs

Now combine that with:

OLTP
LGWR
DBWn
CKPT
Other background processes

and the system can become CPU constrained.

37. Resource Manager and Parallelism

Resource Manager can be used to control parallel execution behavior.

The exact implementation should be designed around your Oracle version and workload.

The principle is:

OLTP
 ↓
Limited/controlled PX

REPORTING
 ↓
Higher PX allowance

BATCH
 ↓
Controlled PX

Don’t simply allow every user:

PARALLEL 64

38. Detect Parallel Workloads

Find active parallel sessions:

SELECT inst_id,
       sid,
       serial#,
       username,
       sql_id,
       event,
       degree,
       req_degree
FROM gv$px_session
ORDER BY inst_id;

Depending on the release, useful columns can differ, so:

DESC gv$px_session;

is worth checking.

39. Detect High CPU Sessions

A quick real-time query:

SELECT inst_id,
       sid,
       serial#,
       username,
       sql_id,
       module,
       service_name,
       event
FROM gv$session
WHERE status = 'ACTIVE'
AND type = 'USER'
ORDER BY inst_id, sid;

Then correlate with:

SQL_ID
SERVICE_NAME
MODULE
INSTANCE

40. ASH: Find CPU Consumers

Historical analysis:

SELECT service_name,
       instance_number,
       sql_id,
       COUNT(*) samples
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN
      :start_time AND :end_time
AND session_state = 'ON CPU'
GROUP BY service_name,
         instance_number,
         sql_id
ORDER BY samples DESC
FETCH FIRST 50 ROWS ONLY;

This gives you a strong starting point for identifying CPU-heavy SQL.

41. Find Top CPU by Service

SELECT service_name,
       instance_number,
       COUNT(*) cpu_samples
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN
      :start_time AND :end_time
AND session_state = 'ON CPU'
GROUP BY service_name,
         instance_number
ORDER BY cpu_samples DESC;

Example:

SERVICE      INSTANCE CPU_SAMPLES
-----------  -------- -----------
SALES_APP         1       120000
REPORTING         2        95000
BATCH             2        80000

Now you can see where CPU workload is concentrated.

42. Find CPU-Heavy SQL

SELECT sql_id,
       COUNT(*) cpu_samples
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN
      :start_time AND :end_time
AND session_state = 'ON CPU'
AND sql_id IS NOT NULL
GROUP BY sql_id
ORDER BY cpu_samples DESC
FETCH FIRST 20 ROWS ONLY;

Then inspect the SQL:

SELECT sql_id,
       sql_text
FROM v$sql
WHERE sql_id = :sql_id;

For historical SQL, use the appropriate AWR SQL views if the cursor is no longer in memory.

43. Runaway Session Detection

Suppose a user launches a query that consumes CPU for hours.

Find long-running active sessions:

SELECT inst_id,
       sid,
       serial#,
       username,
       sql_id,
       module,
       service_name,
       last_call_et
FROM gv$session
WHERE status = 'ACTIVE'
AND type = 'USER'
ORDER BY last_call_et DESC;

LAST_CALL_ET gives elapsed time in seconds for the current activity in this context.

44. Don’t Kill Sessions Automatically

A common junior DBA response:

ALTER SYSTEM KILL SESSION ...

But first ask:

Who owns it?
What SQL is running?
Is it business critical?
Why is it slow?
Is it blocked?
Is it consuming CPU or I/O?
Is it part of batch processing?

Resource Manager can provide a more controlled approach than manually killing sessions.

45. Resource Manager as a Safety Net

The architecture should be:

              SQL Tuning
                  |
                  ↓
            Good execution
                  |
                  ↓
            Workload Design
                  |
                  ↓
             RAC Services
                  |
                  ↓
          Resource Manager
                  |
                  ↓
         Protect critical work

Each layer has a different job.

46. RAC Resource Management

Now combine everything from the last two parts:

                  APPLICATION
                       |
                     SCAN
                       |
                    SERVICE
                       |
              +--------+--------+
              |                 |
            RAC1              RAC2
              |                 |
         Consumer Group    Consumer Group
              |                 |
        Resource Manager  Resource Manager
              |                 |
             CPU               CPU
              |                 |
              +--------+--------+
                       |
                  Cache Fusion

This is the architecture you should have in mind.

47. Practical Production Example

Let’s create four consumer groups:

OLTP_GROUP
REPORTING_GROUP
BATCH_GROUP
ADHOC_GROUP

Business priorities:

OLTP      → 60
REPORTING → 20
BATCH     → 15
ADHOC     → 5

Services:

SALES_APP → OLTP_GROUP
REPORTING → REPORTING_GROUP
BATCH     → BATCH_GROUP
ADHOC     → ADHOC_GROUP

Then:

                    PROD
                     |
              Resource Plan
                     |
       +-------------+-------------+
       |             |             |
     OLTP        REPORTING       BATCH
      60%            20%           15%
       |
     ADHOC
       5%

This is a policy.

Now you need to test whether the policy produces the desired result.

48. Measuring the Result

Before:

OLTP response time = 2 sec
REPORTING = 80% CPU

After Resource Manager:

OLTP response time = 0.8 sec
REPORTING = slower

That may be a successful result.

Why?

Because the business requirement was:

Protect OLTP.

Resource Manager is not designed to make every workload equally fast.

49. Important Performance Principle

When implementing Resource Manager, ask:

Which workload should suffer first when resources become scarce?

For example:

CPU shortage
    |
    +-- OLTP → protected
    |
    +-- Reporting → slowed
    |
    +-- Batch → slowed further
    |
    +-- Ad-hoc → lowest priority

That is a business decision translated into database architecture.

50. RAC Instance Caging Scenario

Suppose:

RAC1 = 64 CPUs
RAC2 = 64 CPUs

but RAC1 hosts:

OLTP
Reporting
Batch

while RAC2 hosts:

OLTP

You might decide to control the CPU capacity of the instances to prevent one workload from consuming everything.

But before changing CPU configuration, analyze:

CPU utilization
Service placement
Resource Manager
PX workload
VM allocation
NUMA topology

Instance Caging should be a deliberate design decision, not a default setting.

51. Check NUMA

On large physical servers:

numactl --hardware

Example:

available: 2 nodes
node 0 cpus: ...
node 1 cpus: ...

NUMA topology can influence CPU and memory behavior.

For very large RAC systems, you should understand:

CPU
Memory
NUMA
Oracle processes
Parallel execution

before making aggressive resource changes.

52. VM Environments

If RAC runs on VMware, KVM, Oracle VM, or another virtualization platform, also investigate:

vCPU allocation
CPU ready time
CPU contention
NUMA exposure
CPU overcommit
host contention

A database showing:

32 vCPU

doesn’t automatically mean:

32 physical CPUs available at all times.

53. AWR Resource Manager Analysis

AWR can help identify resource manager activity.

Look for:

DB Time
DB CPU
CPU utilization
Wait classes
Resource Manager waits

Depending on your configuration, resource manager-related waits can become visible when sessions are deliberately throttled or queued.

The key is to distinguish:

CPU shortage

from:

Resource Manager intentionally limiting CPU

54. Resource Manager Waits

A session may experience Resource Manager-related waits when it is being throttled.

You can investigate:

SELECT inst_id,
       event,
       COUNT(*) sessions
FROM gv$session
WHERE status = 'ACTIVE'
GROUP BY inst_id, event
ORDER BY sessions DESC;

Look for events associated with resource management and CPU throttling in your workload.

Don’t diagnose solely from the event name; correlate with CPU utilization and the active resource plan.

55. Production Change Procedure

Never implement a new Resource Manager policy like this:

Create plan
 ↓
Activate
 ↓
Hope

Use:

Current-state capture
        ↓
Workload baseline
        ↓
Design policy
        ↓
Create test plan
        ↓
Validate
        ↓
Test
        ↓
Controlled production activation
        ↓
Monitor
        ↓
Compare
        ↓
Adjust

56. Capture Current Configuration

Before changes:

SELECT *
FROM dba_rsrc_plans;

SELECT *
FROM dba_rsrc_plan_directives;

SELECT *
FROM dba_rsrc_consumer_groups;

SELECT *
FROM dba_rsrc_group_mappings;

Save the output.

Also:

SELECT inst_id,
       name,
       value
FROM gv$parameter
WHERE name IN (
    'resource_manager_plan',
    'cpu_count'
)
ORDER BY inst_id, name;

57. Build a Workload Baseline

Capture:

DB CPU
DB Time
CPU utilization
Active sessions
Top SQL
Top services
Parallel SQL
GC waits
I/O

For example:

SELECT service_name,
       instance_number,
       COUNT(*) samples
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN
      :start_time AND :end_time
GROUP BY service_name, instance_number
ORDER BY samples DESC;

58. Resource Manager Audit Script

Here’s a useful starting script:

SET LINESIZE 220
SET PAGESIZE 100

PROMPT ========================================
PROMPT RESOURCE MANAGER PLAN
PROMPT ========================================

SELECT plan,
       status,
       comments
FROM dba_rsrc_plans
ORDER BY plan;

PROMPT ========================================
PROMPT CURRENT PLAN
PROMPT ========================================

SELECT inst_id,
       value
FROM gv$parameter
WHERE name = 'resource_manager_plan'
ORDER BY inst_id;

PROMPT ========================================
PROMPT CONSUMER GROUPS
PROMPT ========================================

SELECT consumer_group,
       status
FROM dba_rsrc_consumer_groups
ORDER BY consumer_group;

PROMPT ========================================
PROMPT PLAN DIRECTIVES
PROMPT ========================================

SELECT plan,
       group_or_subplan,
       mgmt_p1,
       mgmt_p2,
       mgmt_p3
FROM dba_rsrc_plan_directives
ORDER BY plan, group_or_subplan;

PROMPT ========================================
PROMPT GROUP MAPPINGS
PROMPT ========================================

SELECT attribute,
       value,
       consumer_group
FROM dba_rsrc_group_mappings
ORDER BY attribute, value;

59. Verify Active Consumer Groups

You can investigate session assignments using:

SELECT inst_id,
       sid,
       serial#,
       username,
       service_name,
       resource_consumer_group,
       status
FROM gv$session
WHERE username IS NOT NULL
ORDER BY inst_id, resource_consumer_group;

This is extremely useful.

You can answer:

Is the application actually being assigned to the consumer group I intended?

60. Example

Suppose:

SALES_APP

is supposed to use:

OLTP_GROUP

But the query shows:

SALES_APP → OTHER_GROUPS

Then your policy isn’t working as intended.

Investigate:

Service name
Mapping rule
Connection pool
Session attributes
Mapping priority

Don’t assume Resource Manager is active simply because the plan is enabled.

61. The Expert Diagnostic Chain

When an application becomes slow:

Application
    ↓
Service
    ↓
Instance
    ↓
Consumer Group
    ↓
Resource Plan
    ↓
CPU / I/O / PX
    ↓
SQL
    ↓
Wait Event

This gives you a much more precise diagnostic model.

62. Example Incident

Application team reports:

“The SALES application is slow between 14:00 and 15:00.”

You check:

SELECT inst_id,
       service_name,
       resource_consumer_group,
       COUNT(*)
FROM gv$session
WHERE service_name = 'SALES_APP'
GROUP BY inst_id,
         service_name,
         resource_consumer_group;

You discover:

RAC1
SALES_APP
OLTP_GROUP

Good.

Then ASH:

SALES_APP
SQL_ID = abc123
ON CPU

Then you discover:

REPORTING
→ huge parallel queries
→ RAC1

Resource Manager shows:

OLTP_GROUP → protected
REPORTING_GROUP → limited

But CPU is still saturated.

Now you investigate:

Parallelism
SQL efficiency
Service placement
CPU capacity

This is the correct approach.

63. Don’t Overuse Resource Manager

Resource Manager is powerful.

But if you create:

20 consumer groups
15 resource plans
30 mapping rules

you may create a configuration nobody understands.

A good production design is usually:

Simple enough to operate, detailed enough to protect critical workloads.

64. Recommended Starting Model

For a typical enterprise RAC:

OLTP_GROUP
REPORTING_GROUP
BATCH_GROUP
OTHER_GROUPS

Then expand only when there is a real business or technical requirement.

65. Part 21 — Final Architecture

We’ve now built this:

                       USERS
                         |
                         ↓
                       SCAN
                         |
                         ↓
                      SERVICE
                         |
                         ↓
                  CONSUMER GROUP
                         |
                         ↓
                  RESOURCE PLAN
                         |
              +----------+----------+
              |                     |
            RAC1                  RAC2
              |                     |
          CPU control           CPU control
              |                     |
              +----------+----------+
                         |
                    SQL workload
                         |
                   Cache Fusion
                         |
                    Interconnect

This is a much more mature RAC design than simply:

RAC1 + RAC2 + shared storage

66. What You Should Know After Part 21

You should now be comfortable explaining:

Resource Manager
  • Consumer groups
  • Resource plans
  • Resource directives
  • Consumer group mapping
  • CPU allocation
  • Workload priorities
RAC
  • Service-based resource management
  • Instance-level CPU management
  • Instance Caging concept
  • RAC workload distribution
  • Parallel execution risks
Troubleshooting
  • CPU saturation
  • Runaway workloads
  • Resource Manager waits
  • Service imbalance
  • ASH workload analysis
  • Before/after measurement

The Key Lesson

The most important principle from Part 21 is:

RAC availability and performance are not just about adding more CPUs. They are about controlling who gets those CPUs.

A mature architecture looks like:

Business Priority
       ↓
Application
       ↓
Service
       ↓
Consumer Group
       ↓
Resource Plan
       ↓
CPU / Parallelism
       ↓
SQL
       ↓
Data

And when you combine this with Part 19 and Part 20:

             RAC 19c
                |
      +---------+---------+
      |                   |
  Interconnect         Services
      |                   |
 Cache Fusion      Workload routing
      |                   |
      +---------+---------+
                |
        Resource Manager
                |
       Workload protection

That is the foundation of enterprise RAC workload engineering.

Bookmark the permalink.
Loading Facebook Comments ...

Leave a Reply