

# RDS for PostgreSQL 메모리
<a name="PostgreSQL.Tuning.concepts.memory"></a>

RDS for PostgreSQL 메모리는 공유 메모리와 로컬 메모리로 구분됩니다.

**Topics**
+ [RDS for PostgreSQL의 공유 메모리](#PostgreSQL.Tuning.concepts.shared)
+ [RDS for PostgreSQL의 로컬 메모리](#PostgreSQL.Tuning.concepts.local)

## RDS for PostgreSQL의 공유 메모리
<a name="PostgreSQL.Tuning.concepts.shared"></a>

RDS for PostgreSQL은 인스턴스가 시작될 때 공유 메모리를 할당합니다. 공유 메모리는 여러 하위 영역으로 나뉩니다. 다음 섹션에서는 가장 중요한 항목에 대해 설명합니다.

**Topics**
+ [공유 버퍼](#PostgreSQL.Tuning.concepts.buffer-pool)
+ [미리 쓰기 로그(WAL) 버퍼](#PostgreSQL.Tuning.concepts.WAL)

### 공유 버퍼
<a name="PostgreSQL.Tuning.concepts.buffer-pool"></a>

*공유 버퍼 풀*은 애플리케이션 연결에서 사용 중이거나 사용 중인 모든 페이지를 보관하는 RDS for PostgreSQL 메모리 영역입니다. *페이지*는 디스크 블록의 메모리 버전입니다. 공유 버퍼 풀은 디스크에서 읽은 데이터 블록을 캐시합니다. 이 풀은 디스크에서 데이터를 다시 읽어야 할 필요성을 줄여 데이터베이스가 더 효율적으로 연산하게 합니다.

모든 테이블과 인덱스는 고정된 크기의 페이지 배열로 저장됩니다. 각 블록에는 행에 해당하는 여러 튜플이 포함되어 있습니다. 튜플은 모든 페이지에 저장할 수 있습니다.

공유 버퍼 풀에는 유한 메모리가 있습니다. 새 요청에 메모리에 없는 페이지가 필요하고 메모리가 더 이상 존재하지 않는 경우 RDS for PostgreSQL은 요청을 수용하기 위해 자주 사용되지 않는 페이지를 삭제합니다. 제거 정책은 클럭 스윕 알고리즘에 의해 구현됩니다.

`shared_buffers` 파라미터는 서버가 데이터 캐싱에 전념하는 메모리 양을 결정합니다. 기본값은 DB 인스턴스에 사용 가능한 메모리를 기반으로 `{DBInstanceClassMemory/32768}`바이트로 설정됩니다.

### 미리 쓰기 로그(WAL) 버퍼
<a name="PostgreSQL.Tuning.concepts.WAL"></a>

*미리 쓰기 로그(WAL) 버퍼*는 RDS for PostgreSQL이 나중에 영구 스토리지에 쓰는 트랜잭션 데이터를 보유합니다. WAL 메커니즘을 사용하여 RDS for PostgreSQL이 다음을 수행할 수 있습니다.
+ 장애 발생 후 데이터 복구
+ 디스크에 빈번한 쓰기를 방지하여 디스크 I/O 감소

클라이언트가 데이터를 변경하면 RDS for PostgreSQL이 변경 사항을 WAL 버퍼에 기록합니다. 클라이언트가 `COMMIT`을 발행하면 WAL 라이터 프로세스는 트랜잭션 데이터를 WAL 파일에 씁니다.

`wal_level` 파라미터는 WAL에 기록되는 정보의 양을 결정하며, 가능한 값은 `minimal`, `replica`, `logical`입니다.

## RDS for PostgreSQL의 로컬 메모리
<a name="PostgreSQL.Tuning.concepts.local"></a>

모든 백엔드 프로세스는 쿼리 처리를 위해 로컬 메모리를 할당합니다.

**Topics**
+ [작업 메모리 영역](#PostgreSQL.Tuning.concepts.local.work_mem)
+ [유지 관리 작업 메모리 영역](#PostgreSQL.Tuning.concepts.local.maintenance_work_mem)
+ [임시 버퍼 영역](#PostgreSQL.Tuning.concepts.temp)

### 작업 메모리 영역
<a name="PostgreSQL.Tuning.concepts.local.work_mem"></a>

*작업 메모리 영역*은 정렬 및 해시를 수행하는 쿼리에 대한 임시 데이터를 보유합니다. 예를 들어, 다음을 포함하는 쿼리 `ORDER BY` 절은 정렬을 수행합니다. 쿼리는 해시 조인 및 집계에서 해시 테이블을 사용합니다.

`work_mem` 파라미터는 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양이며, 메가바이트 단위로 측정됩니다. 기본값은 4MB입니다. 여러 세션을 동시에 실행할 수 있으며 각 세션은 유지 관리 작업을 병렬로 실행할 수 있습니다. 이러한 이유로 사용되는 총 작업 메모리는 `work_mem` 설정의 배수가 될 수 있습니다.

### 유지 관리 작업 메모리 영역
<a name="PostgreSQL.Tuning.concepts.local.maintenance_work_mem"></a>

*유지 관리 작업 메모리 영역*은 유지 관리 작업을 위해 데이터를 캐시합니다. 이러한 작업에는 베큠, 인덱스 생성 및 외래 키 추가가 포함됩니다.

`maintenance_work_mem` 파라미터는 유지 관리 작업에서 사용할 최대 메모리 양을 지정하며, 메가바이트 단위로 측정됩니다. 기본값은 64MB입니다. 데이터베이스 세션은 한 번에 하나의 유지 관리 작업만 실행할 수 있습니다.

### 임시 버퍼 영역
<a name="PostgreSQL.Tuning.concepts.temp"></a>

*임시 버퍼 영역*에서는 각 데이터베이스 세션에 대한 임시 테이블을 캐시합니다.

각 세션은 사용자가 지정한 한도까지 필요에 따라 임시 버퍼를 할당합니다. 세션이 끝나면 서버는 버퍼를 지웁니다.

`temp_buffers` 파라미터는 각 세션에서 사용하는 임시 버퍼의 최대 수를 설정하며, 메가바이트 단위로 측정됩니다. 기본값은 8MB입니다. 세션 내에서 임시 테이블을 처음 사용하기 전에 `temp_buffers` 값을 변경할 수 있습니다.