프린트 하기

OS환경 : Oracle Linux 7.4 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c cpu_count 파라미터 인스턴스 케이징

오라클에는 cpu_count 라는 파라미터가 존재함

이 파라미터의 값은 v$osstat 뷰에 있는 NUM_CPUS value 값에 의해 결정됨(서버의 cpu 코어수)

v$osstat 뷰 확인

1
2
3
4
5
SQL> select value from v$osstat where stat_name = 'NUM_CPUS';
 
     VALUE
----------
         1

 

 

cpu_count 값 확인

1
2
3
4
5
SQL> show parameter cpu_count
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     1

 

 

db 및 서버를 종료하고 서버의 cpu 코어수를 4개로 증가 시킨 뒤 db 기동후 확인해보면

4로 변경되어 있는것을 확인할 수 있음

v$osstat 뷰 및 cpu_count 파라미터 확인

1
2
3
4
5
6
7
8
9
10
11
SQL> select value from v$osstat where stat_name = 'NUM_CPUS';
 
     VALUE
----------
         4
 
SQL> show parameter cpu_count
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     4

 

 

만약 한 서버에 db 인스턴스가 여러개인 경우 필요에 따라 개별 인스턴스별로 cpu 사용을 제한할수 있음

이 기능을 인스턴스 케이징(instance caging)이라고 부름

 

 

인스턴스 케이징은 두가지 방식으로 사용이 가능함

1. 파티션 방식(partition)

이 방식을 사용할때는 각 인스턴스들의 cpu_count 전체 합이 v$osstat 뷰에서 볼수 있는 cpu 수보다 작거나 같음

파티션 방식은 성능이 중요한 DB에 적합함

사용시 예시를 들자면 서버의 cpu 코어 총 갯수가 4인경우에 해당 서버에 인스턴스가 3개 존재할 때, 1번 인스턴스에게 cpu_count를 1을 주고, 2번 인스턴스에게 cpu_count를 2를 주고, 3번 인스턴스에게 cpu_count를 1을 줄수 있음

이 경우 전체 cpu_count 합은 cpu 수와 같은 4가 됨

그리고 각 인스턴스는 cpu_count를 각각 25%, 50%, 25% 씩 나눠서 사용함

이 방식의 단점은 개별 인스턴스에서 사용하지 않는 cpu를 다른 인스턴스에서 사용할 수 없다는 점임

 

 

2. 초과구독 방식(over-subscribe)

이 방식을 사용하면 cpu_count의 합계가 v$osstat에 나온 값에서 3배 이하까지 사용가능함
예를 들어서 cpu가 4개 존재하는 서버일 경우 최대 1번 인스턴스에게 cpu_count 2를 주고, 2번 인스턴스에게 cpu_count를 2를 주고, 3번 인스턴스에게 cpu_count를 2을 줄수 있음

이 경우 전체 cpu_count 합은 cpu 수(4)보다 큰 6이 됨 (참고로 cpu_count의 최대합은 4(cpu) * 3(배) = 12 보다 작아야함)

이때 각 인스턴스가 cpu를 최대로 사용하는 경우 cpu 경합이 일부 발생할 수 있음
그리고 만약 모든 인스턴스가 항상 cpu를 최대로 사용해야하는 경우 서버를 분할해야함

 

 

그리고 인스턴스 케이징을 재기동 없이 동적으로 변경할 수 있고 변경 사항은 몇 초 내에 적용됨

하지만 cpu_count 값을 너무 자주 변경하면 약간의 오버헤드가 발생할 수 있어 필요시에만 조정하는것을 권장함

그리고 이 값을 1로 설정하거나 값을 매우 작은 숫자에서 매우 큰 값으로 변경하지 않는 것이 성능상 좋음

 

 

인스턴스 케이징(cpu 케이징) 적용 방법

기존 인스턴스 케이징 파라미터 및 cpu_count 파라미터 확인

1
2
3
4
5
6
7
8
9
10
11
SQL> select instance_caging from v$rsrc_plan where is_top_plan = 'TRUE';
 
INS
---
OFF
 
SQL> show parameter cpu_count
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     4

현재  인스턴스 케이징이 OFF 이고 cpu_count는 4임

 

 

cpu_count 변경 및 RESOURCE_MANAGER_PLAN 파라미터 활성화

1
2
3
4
5
6
7
SQL> alter system set cpu_count = 2;
 
System altered.
 
SQL> alter system set resource_manager_plan = 'default_plan';
 
System altered.

 

 

인스턴스 케이징 파라미터 및 cpu_count 파라미터 재확인

1
2
3
4
5
6
7
8
9
10
11
SQL> select instance_caging from v$rsrc_plan where is_top_plan = 'TRUE';
 
INS
---
ON
 
SQL> show parameter cpu_count
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     2

인스턴스 케이징이 ON으로 변경되고 cpu_count도 2로 변경됨

 

 

인스턴스 케이징 모니터링

v$rsrcmgrmetric_history 뷰를 이용해 모니터링이 가능함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
select to_char(begin_time, 'HH24:MI:SS') time, sum(avg_running_sessions) avg_running_sessions, sum(avg_waiting_sessions) avg_waiting_sessions 
from v$rsrcmgrmetric_history 
group by begin_time 
order by begin_time;
 
TIME  AVG_RUNNING_SESSIONS AVG_WAITING_SESSIONS
----- -------------------- --------------------
11:31           .060507042                    0
11:32           .004579896                    0
11:33           .002946044                    0
11:34           .004024247                    0
11:35           .003823237                    0
11:36           .003244496                    0
 
6 rows selected.

컬럼 설명

avg_running_sessions : 해당 분 동안 실행 중인 평균 세션 수

이 값이 cpu_count보다 훨씬 작은 경우 인스턴스는 해당 cpu_count 할당을 완전히 활용하지 않다는 뜻

이 경우 성능에 영향을 주지 않고 cpu_count를 줄일 수 있음
avg_waiting_sessions : 해당 분 동안 예약 대기 중인 평균 세션 수

이 값이 계속 0보다 큰 경우 cpu_count를 이 숫자만큼 늘려서 인스턴스의 성능을 향상시킬 수 있음

 

 

참조 : 1362445.1

https://www.dba-oracle.com/t_instance_caging.htm

https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/RESOURCE_MANAGER_PLAN.html#GUID-BFEF14A4-4822-4410-9B51-DCB3376268B3