Postgresql

PostgreSQL 15.8 시스템 변수 최적화

dbavayne 2024. 12. 11. 13:48

시스템 변수 확인

SELECT name, context , unit , setting , boot_val , reset_val
FROM pg_settings
WHERE name in ('shared_buffers','work_mem','maintenance_work_mem')
ORDER BY context,name;

 

컬럼명 설명 예시
name PostgreSQL 설정 변수의 이름. listen_addresses, work_mem
context 설정 변경 시 적용 범위를 나타냄.
  • postmaster: PostgreSQL 서버 재시작 필요.
  • sighup: 설정 파일 재로드로 적용 가능.
  • user: 현재 세션에서 즉시 변경 가능.
unit 설정 값의 단위를 나타냄. kB, MB, ms, N/A
setting 현재 PostgreSQL에서 적용 중인 값. *, 128MB, 100
boot_val PostgreSQL 설치 시 초기 설정 값. localhost, 4MB, -1(자동관리)
reset_val 설정을 초기화(RESET)했을 때 복원되는 기본값. *, 64MB

메모리 관리

  • shared_buffers :  시스템 메모리의 25~40%, DB에서 사용할 공유 메모리 크기
  • work_mem : 쿼리 복잡도에 따라 증가시시키며 정렬, 해시 조인 등에 사용되는 메모리 크기
  • maintenance_work_mem : 대규모 작업 시 512MB~1GB, VACUUM, CREATE INDEX 등의 작업에 사용되는 메모리 크기

 

디스크 I/O 및 체크 포인트

  • wal_buffers : 16MB 이상, WAL(Write-Ahead Log)을 기록하기 위한 버퍼 크기.
  • checkpoint_completion_target : 체크포인트 작업이 전체 주기의 몇 퍼센트에 걸쳐 완료될지를 제어 .
    더 높은 값은 I/O 부하를 줄임
  • max_wal_size / min_wal_size : WAL 로그 파일 크기 조정으로 체크포인트 빈도를 줄임
    권고값
    • 작은 워크로드 (소규모 데이터베이스, 읽기 위주):
      1GB ~ 2GB
      • 데이터 변경이 적고, WAL 로그가 빠르게 순환될 필요가 없는 경우 적합.
    • 중간 워크로드 (표준 OLTP, 중간 규모의 데이터베이스):
      4GB ~ 16GB
      • 일반적인 애플리케이션에서 WAL 체크포인트를 줄이면서도 안정적인 성능을 제공.
    • 대규모 워크로드 (대규모 트랜잭션, OLAP):
      16GB ~ 64GB 이상
      • 빈번한 대량 데이터 처리나 대규모 배치 작업이 수행되는 경우에 적합.

 

 

체크 포인트 빈도 확인하는 방법

더보기
SELECT 
checkpoints_timed, --주기적으로 발생한 체크포인트 횟수.
checkpoints_req,   --WAL 로그가 가득 차서 발생한 체크포인트 횟수.
checkpoint_write_time, --체크포인트 중 WAL 데이터를 디스크에 기록하는 데 소요된 평균 시간(밀리초).
checkpoint_sync_time --체크포인트 완료를 위해 디스크 동기화에 소요된 평균 시간(밀리초).
FROM pg_stat_bgwriter;


checkpoints_timed 
값이 매우 높다면 설정된 체크포인트 주기가 너무 짧을 가능성. max_wal_size 증가 고려.

checkpoints_req
비율이 높다면 max_wal_size를 증가시켜 체크포인트 빈도를 줄이는 것이 좋음.

checkpoint_write_time
값이 매우 높다면 I/O 병목 현상이 있을 수 있으며, 디스크 성능 또는 병렬 I/O 설정을 점검.

checkpoint_sync_time
값이 높다면 디스크의 동기화 작업이 느리다는 의미이며, 스토리지 개선을 고려할 수 있음.

위의 예시는 문제없음

만약 checkpoints_req , checkpoint_write_time 두개의 값이 높은지 확인 후 max_wal_size를 증가시키는 방안 고려

 

WAL파일 사용량 확인하는 방법

더보기
SELECT 
wal_bytes, --생성된 WAL 데이터의 총 크기(바이트 단위).
wal_records, --기록된 WAL 레코드 수.
wal_fpi, --기록된 FPI(Full Page Image)의 개수. WAL에 페이지 전체를 저장한 횟수.
stats_reset --통계가 마지막으로 리셋된 시간.
FROM pg_stat_wal;


wal_bytes
값이 지속적으로 크게 증가하면 WAL 사용량이 높음을 의미하며, I/O 부하나 체크포인트 빈도 확인 필요.
값이 빠르게 증가하고 있다면 WAL 사용량이 높음

wal_records
값이 높으면 트랜잭션이 많거나 대량 작업(예: 배치 작업)이 실행되고 있음을 나타냄.
값이 비정상적으로 많다면 트랜잭션이 과도하게 자주 커밋되고 있지 않은지 확인

wal_fpi
값이 높으면 테이블의 업데이트나 체크포인트 빈도가 높을 수 있음. full_page_writes 설정 확인 필요.
값이 높으면 전체 페이지 쓰기가 자주 발생하고 있음을 의미

stats_reset
최근 리셋 이후 데이터이므로 분석 시점 기준으로 확인.
마지막 리셋 시간 이후 얼마나 많은 WAL이 생성되었는지 확인 가능
필요시 pg_stat_reset_wal()로 통계를 초기화하여 최신 데이터 수집

 

위의 예시는 문제없음

 

  • wal_records가 많음: 트랜잭션 수가 많거나 과도한 커밋 가능성.
  • wal_fpi가 높음: 페이지 쓰기 빈도가 많아 full_page_writes 설정 확인 필요

max_wal_size를 증가시키는 방안 고려, wal 크기 줄이는 wal_compression 활성화 고려