시스템 변수 확인
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 | 설정 변경 시 적용 범위를 나타냄. |
|
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 활성화 고려
'Postgresql' 카테고리의 다른 글
Visibility Map(가시성 맵) (0) | 2024.12.17 |
---|---|
쿼리성능 분석 툴 pg_stat_statements (0) | 2024.12.17 |
VACUUM type 에 따른 redo 발생량 차이 (0) | 2024.11.13 |
PostgreSQL architecture (Local Memory) (0) | 2024.11.13 |
[book] PostgreSQL 9.6 성능 이야기 - vacuum (0) | 2024.10.30 |