- yagom's blog
- 배움에 길에는 끝이 없다.
- Naked Foot
- SAP PP
- SAP ABAP
- SAP BSP
- SAP Inside
- 자바지기
- SECRET OF KOREA
- X-Mobile User Interface World
- 대한민국 자식연합
- 대한민국 토리스토리
- Malus domestica
- PCPINSIDE(거리로 PC, 거실로 PC)
- My Eyes on You
- 조대협의 블로그
- 릴리펏's Logbook
- Dr. Ann(닥터앤)의 DB이야기
- 디지털을 말한다. By oojoo
- Slow Adopter
- T.B 의 SNS 이야기
- Sense and Sensibility
- 언제나 Burning~
- 바스토프의 세상이야기
- Edu&Story
- Min.Gun
- freestation
- nigh
- Programmer
- Shine A Light
- 하루 벌어 하루 살아요. ㅋㅋ
- 아이캐리즈
- 오라클 성능 문제에 대한 통찰 - 조동욱
- 에너쓰오라클
- Science of DataBase
- 기억을 글로 담기
- 홍기선's 아키텍트 이야기 그리고
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- java
- data pump
- oracle
- semi join
- ansi query
- cluster table
- tuning
- oracle tuning
- OUTER JOIN
- nested loops join
- aws
- RBM
- A2P
- index-organized table
- ERP
- 스폰서 요금제
- ORACLE SQL
- MSSQL SQL
- Analytic Function
- Annualized Failure Rate
- Database
- JDBC
- PostgreSQL
- zero rating
- AWS Elastic Beanstalk
- Table
- Mean Time Between Failures
- EA
- MTBF
- Network Neutrality
- Today
- Total
아이짱구
병렬 실행을 위한 매개 변수의 초기화 및 튜닝 본문
Database VLDB and Partitioning Guide
Oracle Database 시작 시 CPU_COUNT, PARALLEL_THREADS_PER_CPU의 값을 기반으로 병렬 실행 매개 변수의 기본값을 계산한다. 매개 변수를 수동으로 조정하여 시스템 구성 상태에 따라서 성능 목표에 맞게 값을 늘리거나 줄일 수 있다.
- 병렬 실행이 전혀 사용되지 않는 시스템에서 PARALLEL_MAX_SERVERS를 0으로 설정할 수 있다.
- 풍부한 SGA 메모리를 갖춘 대규모 시스템의 처리량을 높이기 위해서 PARALLEL_EXECUTION_MESSAGE_SIZE를 늘릴 수 있다.
병렬 실행 매개 변수를 수동으로 조정할 수 있다. 병렬 실행은 기본적으로 활성화 되어 있다.
병렬 실행을 초기화 하거나 조정은 다음 단계를 포함한다.
- 기본 파라미터 설정 사용
- 워크로드의 균형
- 세션에서 병렬 실행의 강제
기본 파라미터 설정 사용
Oracle Database는 병렬 실행 매개 변수를 자동으로 설정된다.
매개 변수 및 기본값
매개 변수 |
기본값 |
비고 |
PARALLEL_ADAPTIVE_MULTI_USER |
TRUE |
병렬 실행하여 SQL의 DOP 요청의 수를 제한하여 시스템 과부하를 방지한다. |
PARALLEL_DEGREE_LIMIT |
CPU_COUNT * PARALLEL_THREADS_PER_CPU * ACTIVE_INSTANCES |
AUTO DOP를 사용하면, 문장에 허용되는 DOP의 최대값을 제어한다. |
PARALLEL_DEGREE_POLICY |
MANUAL |
자동 DOP, 문장 대기열 및 메모리 병렬 실행을 사용할지 여부를 제어한다. 기본적으로 이 기능은 비활성화되어 있다. |
PARALLEL_EXECUTION_MESSAGE_SIZE |
16KB |
병렬 실행 서버 및 병렬 실행 서버 질의 코디네이터 통신에 사용되는 버퍼 크기. 이 버퍼는 공유 풀에 할당한다. |
PARALLEL_FORCE_LOCAL |
FALSE |
병렬 실행을 현재 RAC 인스턴스로 제한한다. |
PARALLEL_MAX_SERVERS |
CPU_COUNT * PARALLEL_THREADS_PER_CPU * (PGA_AGGREGATE_TARGET>0, 2, 1) * 5 |
하나의 인스턴스에 대한 병렬 실행 프로세스와 병렬 복구 프로세스의 최대 수를 지정한다. 수요가 증가하면 인스턴스를 시작할 때 만들어진 프로세스 수에서 최대 이 값으로 프로세스의 수가 증가한다. 이 매개 변수의 설정이 너무 낮으면 질의 처리에 필요한 병렬 실행 프로세스를 얻을 수 없는 경우가 있다. 너무 높게 설정하면 메모리 부족이 발생하여 성능이 저하 될 수 있다. PGA_AGGREGATE_TARGET의 값을 MEMORY_TARGET가 설정 되어 있는 경우 파생 할 수 있다. 다양한 시나리오에서 PGA_AGGREGATE_TARGET 사용에 대한 자세한 내용은 Oracle Database 성능 튜닝 가이드를 참조한다. |
PARALLEL_MIN_SERVERS |
0 |
Oracle Database를 시작할 때 병렬 실행 시작 및 예약 병렬 실행 프로세스의 수를 지정한다. 이 설정을 늘리면 병렬 문장의 시작 비용을 균형화 하는데 도움이 병렬 실행 프로세스는 Database가 중지될 떄까지 삭제되지 않기 때문에 필요한 메모리 사용량은 증가한다. |
PARALLEL_MIN_PERCENT |
0 |
병렬 실행에 필요한 병렬 실행 프로세스의 최소 백분율을 지정한다. 기본값은 0으로 사용 가능 한 병렬 서버 프로세스가 없는 경우, 병렬 문장은 직렬로 실행된다. |
PARALLEL_MIN_TIME_THRESHOLD |
30 Second |
최적화 프로그램의 추정 된 실행 시간. 30보다 큰 값의 문장의 경우 자동 병렬 쿼리 및 자동 DOP로 도출 된다. |
PARALLEL_SERVERS_TARGET |
4 * CPU_COUNT * PARALLEL_THREADS_PER_CPU * ACTIVE_INSTANCE |
문장의 큐잉을 사용할 떄까지 쿼리를 실행하는데 사용할 수 있는 병렬 실행 서버 프로세스 수. 문장의 대기열은 PARALLEL_DEGREE_POLICY가 AUTO로 설정되어 있는 경우에만 활성화 된다. |
PARALLEL_THREADS_PER_CPU |
2 |
병렬로 실행하는 동안 CPU가 처리할 수 있는 병렬 실행 프로세스 또는 스레드의 수를 의미한다. |
일부 매개 변수 설정 방법에 따라 Oracle Database 제약을 받으므로 주의 해야한다. 예를 들어, PROCESSES의 값을 20으로 설정하면 25개의 슬레이브를 검색할 수 없다.
세션에서 병렬 실행의 강제
병렬로 실행해야 하지만 테이블에 대한 DOP 설정 또는 관련 질의에 따라서 변화를 피하고 싶은 경우는 다음 문장을 사용하여 병렬 처리를 적용할 수 있다.
ALTER SESSION FORCE PARALLEL QUERY;
이후의 모든 쿼리는 제한을 위반하지 않는 한 병렬로 실행된다.
DML 문장과 DDL 문장도 적용할 수 있다. 이 절은 세션의 후속 문장에 지정되는 모든 병렬 절보다 우선 되지만 병렬 HINT에 우선하지 않는다.
예를 들어, 일반적인 OLTP 환경에서는 테이블에 병렬 설정이 없지만 매일 밤 배치 스크립트를 사용하여 이러한 테이블에서 데이터를 병렬로 수집할 수 있다. 세션 중에 DOP를 설정하여 사용자가 각 테이블을 병렬로 변경하고 완료되면 질렬로 되돌릴 필요가 없다.
병렬 실행을 위한 일반적인 매개 변수 조정
- 병렬 작업 자원 제한을 설정하는 파라미터
- 자원 소비에 영향을 주는 변수
- I/O와 관련된 파라미터
병렬 작업 자원 제한을 설정하는 파라미터
자원 한계를 설정하는 매개 변수는 아래와 같다.
- PARALLEL_FORCE_LOCAL
- PARALLEL_MAX_SERVERS
- PARALLEL_MIN_PERCENT
- PARALLEL_MIN_SERVERS
- PARALLEL_SERVERS_TARGET
- SHARED_POOL_SIZE
PARALLEL_FORCE_LOCAL 매개 변수의 권장 값은 FALSE 이다.
이 매개 변수는 병렬로 실행되는 SQL문을 Oracle RAC 환경의 단일 인스턴스로 제한되는지 여부를 나타낸다. 이 매개 변수를 TRUE로 설정하면 쿼리 코디네이터가 실행하는 단일 RAC 인스턴스에 처리하는 병렬 슬레이브의 범위를 제한 할 수 있다.
PARALLEL_MAX_SERVERS의 기본 값은 다음과 같다.
(CPU_COUNT * PARALLEL_PER_CPU * (IF PGA_AGGREGATE_TARGET > 0 2 ELSE 1) * 5)
PGA_AGGREGATE_TARGET의 값을 MEMORY_TARGET이 설정되어 있는 경우 파생될 수 있다. 다양한 시나리오에서 PGA_AGGREGATE_TARGET 사용에 대한 자세한 내용은 Oracle Database 성능 튜닝 가이드를 참조한다. 이 계산은 DOP 특성이 높은 테이블에 대한 병렬 쿼리로는 충분하지 않을 수 있다. 높은 DOP 쿼리를 실행하려는 사용자는 PARALLEL_MAX_SERVERS를 다음과 같이 설정하는 것이 좋다.
사용자 프로세스가 너무 많은 경우
동시 사용자 질의 서버 프로세스가 너무 많은 메모리 충돌(페이징), I/O 경합 또는 과도한 컨텍스트 스위칭이 발생할 수 있다. 이 충돌로 인해 병렬 실행을 사용하지 않으면 수준보다는 시스템 처리량이 감소할 수 있다. PARALLEL_MAX_SERVERS 값을 늘리는 것은 그것에 의해 생성되는 로드를 위한 충분한 메모리 및 I/O 대역폭을 확보 한 경우에만 사용해야 한다.
운영체제 성능 모니터링 도구를 사용하면 메모리, 스왑 공간 및 I/O 대역폭의 가용성을 확인할 수 있다. CPU와 디스크 모두 실행 대기열 길이 및 시스템 I/O 서비스 시간을 확인한다. 프로세스를 추가하는 경우 시스템에 충분한 스왑 공간이 있는지 확인 한다. 질의 서버 프로세스 수를 제한하면 병렬 작업을 수행할 수 있는 동시 사용자 수를 제한 할 수 있으며, 시스템 저리량은 안정화 할 수 있다.
사용자의 자원 제한
사용자에게 리소스 소비자 그룹을 설정하는 것으로, 지정된 사용자가 사용할 수 있는 병렬 처리의 양을 제한 할 수 있다. 이것은 한 사용자 또는 사용자 그룹이 사용할 수 있는 세션 동시 로그온 및 병렬 프로세스의 수를 제한하는데 사용한다.
병렬 실행문을 처리하는 각 질의 서버 프로세스는 세션 ID를 사용하여 로그온 한다. 긱 프로세스는 사용자의 동시 세션 제한에 대해 계산된다. 예를 들어, 사용자가 사용할 수 있는 병렬 실행 프로세스를 10개로 제한 하려면 사용자 제한을 11로 설정한다. 1개의 프로세스가 병렬 코디네이터를 위한 기타 10개의 프로세스가 2세트 질의 서버를 구성한다. 이렇게 하면 병렬 코디 네이터 1개의 세션 병렬 실행 프로세스가 10개의 세션을 사용할 수 있다.
사용자 프로필을 사용하여 자원 관리에 대한 자세한 내용 Oracle Database 관리자 가이드, Oracle Real Application Clusters 관리 및 배포 가이드를 참조한다.
PARALLEL_MIN_PERCENT 매개 변수의 권장 값은 0이다.
이 매개 변수를 사용하면 사용자는 사용 중인 응용 프로그램에 따라 허용 DOP를 기다리는 수이다. 본 매개 변수를 0이 아닌 값으로 설정하면 요청된 DOP 시점에서 시스템이 실현되지 않을 경우, Oracle Database 오류를 반환한다. 예를 들어, PARALLEL_MIN_PERVENT 50(50%)로 설정하면 다중 사용자 쿼리 조정 알고리즘이나 리소스 제한으로 DOP가 50% 이상 감소되면 Oracle Database가 ORA-12827 오류를 반환한다.
다음 예를 보자.
SELECT /*+ FULL(e) PARALLEL (e 8) */
d.department_id
, SUM(salary)
FROM employees e
, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_id
ORDER BY d.department_id;
Oracle Database에서 다음 오류를 반환한다.
ORA-12827 : insufficient parallel query slaves available
PARALLEL_MIN_SERVERS 매개 변수를 사용하면 하나의 인스턴스에서 병렬 작업 시작 및 예약 프로세스 수를 지정할 수 있다.
PARALLEL_MIN_SERVERS = n
n 변수는 병렬 작업을 시작하고 유지하는 프로세스 수 이다. 본 설정은 메모리 사용량과 실행 비용의 균형을 유지할 수 있다. 실행되는 프로세스는 Database가 중지될 때까지 종료되지 않는다. 이렇게 하면 쿼리가 실행되는 경우 많은 프로세스를 사용할 수 있다.
PARALLEL_SERVERS_TARGET 매개 변수의 권장 값은 4 * CPU_COUNT * PARALLEL_THREADS_PER_CPU * ACTIVE_INSTANCES 이다.
PARALLEL_DEGREE_POLICY가 AUTO로 설정되어 있으면 시스템에서 현재 사용되고 있는 병렬 프로세스의 수를 PARALLEL_SERVERS_TARGET 이상의 경우, 병렬 실행에 필요한 문장은 대기열에 포함된다. 이것은 시스템에서 사용할 수 있는 병렬 서버 프로세스의 최대 수는 없다(그것은 PARALLEL_MAX_SERVERS에 의해 제어된다). 그러나 PARALLEL_SERVERS_TARGET 및 문장의 대기열을 사용하여 병렬 실행이 필요한 각각의 문장이 필요한 병렬 서버 자원에 할당된 병렬 서버 프로세스의 과잉에 의한 장애를 방지할 수 있다.
SHARED_POOL_SIZE 매개 변수는 병렬 실행에서 직렬 SQL 실행에 필요한 메모리 자원 이외에 더 많은 메모리 자원이 필요하다. 추가 메모리는 질의 서버 프로세스 간의 통신 및 데이터를 전달하는데 사용된다.
Oracle Database는 공유 풀에서 질의 서버 프로세스에 메모리가 할당된다.
다음과 같이 공유 풀을 튜닝할 수 있다.
- 공유 풀의 다른 클라이언트(공유 커서 또는 저장 프로시저 등)를 고려한다.
- 다중 사용자 시스템의 성능은 향상되지만, 작은 값이 메모리 사용량이 감소하게 되면 주의 해야 한다.
- 그 후, 병렬 실행에 사요되는 버퍼의 수를 모니터링하고 V$PX_PROCESS_SYSSTAT의 shared pool PX msg pool에 표시된 현재 최고 수위 목표를 비교한다.
참고: 사용 가능한 메모리가 충분하지 않으면 오류 메시지 12853(PX 버퍼 메모리가 부족합니다. 현재 문자열은 KB이지만 최대 문자열은 KB까지 필요합니다)가 표시한다. 이것은 PX 버퍼를 위한 SGA 메모리가 충분하지 않은 경우에 발생한다. 적어도 MAX - CURRENT Byte를 추가하도록 SGA 메모리를 재구성해야 한다.
기본적으로 Oracle Database는 병렬 실행 버퍼를 공유 풀에서 할당한다.
Oracle Database에서 시작할 때 다음 오류가 표시되면, SHARED_POOL_SIZE 값을 Database가 시작할 수 있도록 낮출 필요가 있다.
ORA-27102 : out of memory
SVR4 Error : 12 : Not enough space
SHARED_POOL_SIZE의 크기를 낮춘 후 다음 오류가 발생할 수 있다.
ORA-04031 : unable to allocate 16084 bytes of shared memory
("SHARED pool", "unknown object", "SHARED pool heap", "PX msg pool")
이 경우 다음 쿼리를 실행하여 Oracle Database가 16,084 바이트가 할당되지 않은 이유를 확인 할 수 있다.
SELECT NAME
, SUM(BYTES)
FROM V$SGASTAT
WHERE POOL = 'SHARED POOL'
GROUP BY ROLLUP(NAME);
출력은 다음과 같다.
NAME SUM(BYTES)
------------ ----------
PX msg pool 1474572
free memory 562132
2036704
메시지 버퍼의 추가 메모리 요구사항 계산
공유 풀의 초기 설정을 확인한 후 메시지 추가 메모리 요구사항을 계산하고, 커서에 필요한 추가 공간을 결정할 필요가 있다.
메시지 버퍼 메모리 추가
메시지 버퍼를 수용할 수 있도록 SHARED_POOL_SIZE 매개 변수의 값을 늘려야 한다. 메시지 버퍼는 질의 서버 프로세스가 서로 통신할 수 있다.
Oracle Database는 생산자 서버와 소지바 서버 간의 가상 연결마다 일정 수의 버퍼가 사용된다. 연결 수는 DOP 증가에 맞추어 그 제곱의 수로 증가한다. 이러한 이유로 병렬 실행에 사용되는 메모리의 최대 용량은 시스템에서 허용되는 DOP의 최대값에 의해 제한된다. 이 값을 제어하려면 PARALLEL_MAX_SERVERS 매개 변수를 사용하거나 정책과 프로필을 사용한다.
필요한 메모리 용량을 계산하려면 다음 공식을 사용한다.
SMP 시스템:
mem in bytes = (3 * size * users * groups * connections)
SMP Real Application Clusters 및 MPP 시스템:
mem in bytes = ((3 * local) + (2 * remote)) * (size * users * groups) / instances
각 인스턴스에서, 이 식에서 계산된 메모리가 사용된다.
각 항목의 의미는 다음과 같다.
- SIZE = PARALLEL_EXECUTION_MESSAGE_SIZE
- USERS = DOP가 최적일 경우 실행이 예상되는 동시 병렬 실행자 수
- GROUPS = 각 쿼리에 사용되는 질의 서버 프로세스의 그룹 수
간단한 SQL 문장에 필요한 것은 1개의 그룹이다. 그러나 쿼리 관련 서브쿼리가 병렬로 처리되는 경우, Oracle Database는 하나의 질의 서버 프로세스 그룹을 사용한다.
- CONNECTIONS = (DOP 2 + 2 * DOP)
시스템이 클러스터 또는 MPP의 경우 인스턴스 수를 고려할 필요가 있다. 인스턴스 수에 따라 DOP가 증가하기 때문이다. 즉, 두 개의 인스턴스 클러스터에서 DOP를 4로 설정하면 DOP는 8이 된다. 소극적인 견적으로 초기 값은 PARALLEL_MAX_SERVERS와 인스턴스 수를 곱하면 4로 나눈 값을 사용하는 것을 추천한다.
- LOCAL = CONNECTIONS / INSTANCES
- REMOTE = CONNECTIONS - LOCAL
공유 풀 원래 설정으로 이 용량을 추가한다. 그러나 이러한 메모리 구조 중 하나의 값을 설정하기 전에 다음 단원에서 설명하는 커서에 대한 추가 메모리도 고려할 필요가 있다.