본문 바로가기

전체 글

(88)
리두와 OWI - 리두 개요 특별한 경우를 제외하면, DML에 의해 생긴 모든 변화에 대해서 리두 데이터를 생성한다. 리두 데이터를 생성하는 이유는 복구를 위한 것이다. 오라클은 "Write ahead rule"과 "Log force at commit"이라는 두 가지 메커니즘을 이용해 데이터의 복구를 보장한다. Write ahead rule은 데이터를 변경시키기 전에 반드시 리두를 먼저 생성한다는 것이다. Write ahead rule은 DML에 의한 변화는 버퍼 캐시에 저장되기 전에 먼저 리두 버퍼에 저장되어야 하고, 버퍼 캐시의 더티 버퍼를 데이터파일에 기록하기 전에, 해당되는 리두 레코드를 리두 버퍼로부터 리두 로그에 파일로 기록한다는 원칙으로 이루어진다. Log force at commit이란 사용자가 커밋을 ..
I/O와 OWI - I/O 개요 I/O 작업 레이어는 다음과 같이 나눌 수 있다. 1) 어플리케이션 레이어: select / insert / update / delete / truncate 2) 오라클 메모리 레이어: Buffer cache | PGA 3) 오라클 세그먼트 레이어: Datafile, tempfile, Tablespace, Segment 4) OS/디바이스 레이어: Async I/O, Direct I/O, Raw Device, RAID, …. I/O 성능 문제의 원인을 파악하는 것과 해결책을 찾는 과정은 항상 1,2,3,4의 순서를 따라야한다. - 어플리케이션 레이어 어플리케이션을 효과적으로 구현하여, 불필요한 I/O를 최소화해야 한다. 비효율적인 어플리케이션을 두고 시스템을 튜닝한다는 것은 거의 불가능하..
세그먼트와 OWI - 세그먼트 개요 세그먼트는 테이블, 인덱스, 언두, LOB 등 오라클이 제공하는 모든 종류의 논리적인 공간을 말한다. 오라클은 사용된 공간과 아직 사용되지 않은 공간을 구분하는 표식인 고수위선(HWM)이 있다. HWM은 세그먼트 헤더 블록에 그 정보가 저장된다. 오라클은 세그먼트 공간관리기법으로 FLM(수동관리)와 ASSM(자동관리)가 있다. 테이블스페이스 생성 시 부여하는 segment space management 속성에 의해 기법이 결정된다. - FLM (FreeList Management, 수동 세그먼트 공간 관리) 프리리스트란 프리 블록을 링크드 리스트 형태로 관리하는 기법을 말한다. 세그먼트 헤더 블록에서는 프리리스트의 헤더 위치와 테일 위치를 관리한다. 개별 데이터 블록에는 블록이 프리리스..
트랜잭션과 OWI - 트랜잭션 개요 사용자가 DML을 수행하게 되면 오라클은 내부적으로 다음과 같은 순서로 작업을 진행한다. 1) 해당 트랜잭션에 대해 언두 세그먼트를 할당한다. 할당이 실패하면 오프라인 상태의 언두 세그먼트를 온라인화해서 사용한다. 이 과정마저 실패하면, 새로운 언두 세그먼트를 생성한다. 2) 언두 세그먼트를 할당 받으면, 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯을 생성한다. 3) 트랜잭션 테이블을 생성하고 나면 TXID를 생성하고, 현재 트랜잭션에 할당한다. 트랜잭션은 반드시 언두 영역을 할당 받은 다음에 ID를 부여받는다. 4) 트랜잭션의 대상이 되는 블록들을 버퍼 캐시로 적재하고 블록 헤더의 ITL에 트랜잭션 엔트리를 등록한다. 5) 변경할 블록들의 변경 정보는 PGA에 체인지 벡터라는 이름으로 ..
Shared Pool / Library Cache와 OWI - Shared Pool과 힙 Shared Pool은 SGA의 Variable 영역에 속한다. Variable 영역은 Shared Pool + Java Pool + Large Pool + Streams Pool 등으로 이루어진다. Shared Pool은 다시 여러 종류의 메모리 영역으로 나누어진다. 대표적인 것들이 라이브러리 캐시와 로우 캐시이다. Shared Pool의 구성요소는 Permanent Area, Library Cache, Row Cache, Reserved Area로 구성된다. Shared Pool은 힙이라고 불리는 메모리 관리 기법을 이용해 관리된다. Shared Pool은 하나의 최상위 힙을 가지며, 최상위 힙은 다시 여러 개의 서브 힙을 포함한다. 힙은 여러 개의 익스텐트를 링크드 리..
버퍼캐시와 OWI - 버퍼캐시 구조 최근에 사용된 블록에 대한 정보를 메모리의 일정 부분에 저장해 놓은 것을 버퍼 캐시라고 한다. Database Buffers에 해당하는 값이 현재 인스턴스의 버퍼 캐시의 크기이다. 오라클은 버퍼 캐시를 효과적으로 관리하기 위해 해시 체인 구조를 사용한다. 버킷 -> 체인 -> 헤더의 구조를 사용한다. 해시 체인 구조는 cache buffers chains 래치를 이용해 보호된다. - Working Set 오라클은 버퍼 캐시를 효율적으로 사용하기 위해 두 종류의 LRU 리스트를 사용한다. LRU 리스트는 프리 버퍼, 사용 중이거나 사용된 버퍼, 더티 버퍼 등을 포함한다. LRUW 리스트는 아직 디스크에 기록되지 않은 변경된 버퍼들의 리스트를 관리한다. 이 리스트들은 다시 메인 리스트와 보..
오라클 래치와 락 (Latch & Lock) 래치와 락 - 오라클의 동기화 매커니즘 오라클은 거대한 동기화 머신이다. 오라클은 래치와 락이라는 두 개의 동기화 매커니즘을 이용해 리소스를 보호한다. 래치와 락의 존재 이유는 동시 작업으로부터 오라클의 자원을 보호하는 것이다. 래치 (Latch) - 래치란? 오라클 매뉴얼에서는 가벼운 락으로 분류하고 있다. 즉, 락 중에서도 아주 빠른 속도로 작동하게끔 구현된 경량화 된 락이라는 것이다. 그러나 보통은 래치와 락을 전혀 다른 객체로 분류하는 것이 일반적이다. 래치는 유닉스에서 제공하는 뮤텍스와 대단히 유사하다. 뮤텍스는 특정 리소스에 대한 배타적인 접근을 가능하게 하는 동기화 메커니즘이다. 래치는 뮤텍스와 같이 아주 빠르고 가볍게 특정 리소스에 대한 동기화를 구현하기 위해 고안된 객체이다. 특히 오라클..
OWI (Oracle Wait Interface) OWI 란? - 오라클은 어떤 작업을 수행하는 과정에서 원하는 리소스를 획득하지 못하는 경우에 리소스에 대한 점유가 해제될 때까지 리소스와 관련된 이벤트를 대기한다. 이처럼 프로세스가 겪는 대기 현상을 기록하고 관찰하는 일련의 기능과 인터페이스, 그리고 방법론을 통칭하여 OWI, 즉 Oracle Wait Interface라고 부른다. 대기 이벤트는 P1, P2, P3 라는 세 개의 파라미터를 통해 현재 대기하는 리소스를 표현한다. 대기 이벤트의 P1, P2, P3의 값은 V$SESSION_WAIT 뷰나 V$SESSION 뷰와 같은 다이나믹 뷰나 SQL Trace 파일 등을 통해 관찰 가능하다. 각 이벤트마다 P1, P2, P3의 의미는 각각 다르며, V$EVENT_NAME 뷰를 통해 확인 가능하다. 오라..