PostgreSQL 아키텍처 공유 메모리 이해

완료됨

PostgreSQL은 다음과 같이 분류할 수 있는 메모리를 사용합니다.

  • 로컬 메모리 - 각 프로세스에 할당됩니다.
  • 공유 메모리 - 모든 프로세스에서 사용합니다.

로컬 메모리

PostgreSQL의 각 프로세스에는 쿼리 처리를 위한 메모리가 필요합니다. 다음 서버 매개 변수를 사용하여 메모리 사용량을 정의할 수 있습니다.

work_mem은 ORDER BY 및 DISTINCT 작업에 대한 튜플을 정렬하는 데 필요한 메모리를 정의합니다. 이 매개 변수는 내부 정렬 작업 및 해시 테이블에 사용할 수 있는 메모리 양을 결정합니다. 사용 가능한 메모리가 크고 워크로드에 복잡한 정렬이 포함된 쿼리가 있는 경우 이 매개 변수 값을 늘리면 디스크로 스필하기 전에 더 큰 메모리 내 검사를 허용하여 성능을 향상시킬 수 있습니다.

그러나 하나의 복잡한 쿼리에는 여러 정렬 및 해시 작업이 동시에 실행될 수 있습니다. 각 작업은 디스크 기반 임시 파일에 쓰기를 시작하기 전에 이 값이 허용하는 만큼의 메모리를 사용합니다. 따라서 사용량이 많은 시스템에서는 총 메모리 사용량이 개별 work_mem 매개 변수 사용량의 몇 배가 됩니다.

이 값을 튜닝하려면 총 RAM * 0.25 / max_connections를 초기값으로 사용합니다.

maintenance_work_mem진공인덱스 다시 작성에 필요한 메모리입니다. 이 매개 변수는 내부 정렬 작업 및 해시 테이블에 사용할 수 있는 메모리 양을 결정합니다. 기본값은 64KB이지만 이 값을 늘리면 진공 처리 성능이 개선됩니다.

autovacuum_work_mem은 각 자동 진공 프로세스에서 사용할 최대 메모리를 설정합니다.

temp_buffers는 임시 테이블을 저장하기 위한 메모리를 정의합니다. 이 매개 변수는 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다.

effective_cache_size는 운영 체제 및 데이터베이스 내에서 디스크 캐싱에 사용할 수 있는 메모리의 양을 정의합니다. PostgreSQL 쿼리 계획 도구는 이 메모리가 RAM에 고정되어 있는지 확인합니다. 인덱스 검사는 높은 값인 경우 사용될 가능성이 가장 높습니다. 그렇지 않고 값이 낮으면 순차적 검사가 사용됩니다.

effective_cache_size를 컴퓨터 총 RAM의 50%로 설정합니다.

공유 메모리

공유 메모리는 시작 시 할당됩니다. 공유 메모리는 다음 용도로 사용됩니다.

shared_buffers는 서버에서 사용하는 공유 메모리 버퍼를 정의합니다. PostgreSQL은 테이블 및 인덱스의 페이지를 영구 스토리지에서 공유 버퍼 풀로 로드한 다음 메모리에서 작동합니다. 이 공유 버퍼 풀은 서버에서 사용하는 공유 메모리의 주요 구성 요소입니다. 기본값은 128MB입니다(컴퓨팅 계층에 따라 다름). 더 많은 메모리를 할당하려면 서버를 다시 시작해야 합니다.

wal_buffers는 영구 스토리지에 쓰기 전에 WAL(미리 쓰기 로깅)을 위한 공유 메모리 내 디스크 페이지 버퍼 수를 정의합니다.

요약하면, 조정할 수 있는 메모리와 관련된 중요한 서버 매개 변수는 다음과 같습니다.

  • shared_buffers
  • work_mem
  • effective_cache_size