반응형
1. 하드웨어 최적화
- CPU: EPAS는 CPU의 멀티 코어 성능을 활용할 수 있습니다. 트랜잭션이 많은 OLTP(Online Transaction Processing) 환경에서는 고주파수의 CPU가 유리하며, 분석이나 대량의 데이터를 처리하는 OLAP(Online Analytical Processing) 작업의 경우에는 다중 코어 CPU가 더욱 유리합니다. 또한, 멀티스레딩과 병렬 쿼리 실행을 지원하는 기능이 활성화되어 있는지 확인하는 것이 중요합니다.
- 메모리(RAM): PostgreSQL과 EPAS는 메모리 사용을 통해 데이터베이스 성능을 크게 향상시킬 수 있습니다. 전체 데이터를 메모리 내에서 캐시하여 읽기 성능을 향상시키는 것이 목표입니다. 일반적으로 DB 시스템에는 가능한 많은 메모리를 할당하는 것이 유리하며, 데이터 크기에 맞춰 메모리를 확장해야 합니다.
- 디스크 I/O: SSD(Solid State Drive)와 같은 고속 저장 장치를 사용하는 것이 좋습니다. 디스크 I/O는 데이터베이스 성능에 중요한 영향을 미칩니다. 특히 WAL(Write-Ahead Logging) 파일 및 인덱스 파일이 빠르게 처리될 수 있도록 고속 I/O 디바이스를 사용하는 것이 필수적입니다. RAID 설정을 통해 읽기/쓰기 성능을 높이는 것도 고려할 수 있습니다.
2. 데이터베이스 설정
EPAS는 여러 설정을 통해 성능을 최적화할 수 있습니다. 가장 중요한 설정 항목은 메모리 사용, 버퍼 크기 및 트랜잭션 로그 설정입니다.
- shared_buffers: PostgreSQL 및 EPAS에서 가장 중요한 메모리 설정입니다. 데이터베이스가 데이터를 메모리에 캐싱할 수 있는 버퍼 공간을 정의하며, 일반적으로 시스템 메모리의 25%~40%로 설정하는 것이 적당합니다. 이 값이 너무 작으면 메모리에서 처리되지 못한 작업이 디스크로 넘어가 I/O 부하를 일으키고, 너무 크면 다른 프로세스에서 사용할 메모리를 부족하게 만들어 성능이 저하될 수 있습니다.
- work_mem: 쿼리가 정렬이나 해시 작업을 수행할 때 사용할 메모리 양을 정의합니다. 복잡한 쿼리나 대규모 데이터 집합에 대한 처리를 위해 이 값을 높게 설정해야 하지만, 너무 높게 설정하면 시스템 메모리 부족으로 성능 저하가 발생할 수 있습니다. OLAP 환경에서는 더 많은 메모리를 할당해야 할 수 있습니다.
- maintenance_work_mem: 인덱스 재구성, VACUUM 작업 등과 같은 유지 보수 작업을 수행할 때 사용되는 메모리입니다. 기본값보다 더 크게 설정하는 것이 좋습니다. 적절한 값은 수십 GB까지 될 수 있지만, 시스템 메모리 용량을 초과하지 않도록 주의해야 합니다.
- wal_buffers: WAL(Write-Ahead Logging) 파일의 버퍼 크기를 정의하는 항목입니다. 기본값은 16MB로 설정되지만, 트랜잭션이 빈번하게 발생하는 시스템에서는 이를 더 크게 설정하여 성능을 개선할 수 있습니다.
3. 쿼리 최적화
데이터베이스 성능 최적화에서 가장 중요한 것은 쿼리 최적화입니다. 효율적인 쿼리 작성과 인덱스 관리가 필수적입니다.
- 인덱스 사용: 인덱스는 데이터베이스에서 데이터를 빠르게 찾을 수 있도록 도와주는 중요한 구조입니다. 하지만 인덱스가 너무 많으면 데이터 삽입, 업데이트, 삭제 작업이 느려질 수 있으므로 주의가 필요합니다. 자주 사용되는 쿼리에 적절한 인덱스를 설정해야 하며, 쿼리 성능 분석을 통해 인덱스의 유효성을 지속적으로 점검해야 합니다.
- 실행 계획 분석: EXPLAIN 명령을 사용하여 쿼리 실행 계획을 분석하고, 느린 쿼리를 찾아 최적화할 수 있습니다. 쿼리 실행 계획은 인덱스 사용 여부, 테이블 스캔 방식, 조인 전략 등을 보여줍니다. 필요하다면 인덱스를 추가하거나 테이블 구조를 개선할 수 있습니다.
- JOIN 최적화: 테이블을 조인하는 쿼리에서 적절한 인덱스가 사용되도록 설정해야 합니다. 특히, 대규모 테이블 간의 조인은 성능을 저하시킬 수 있으므로 INNER JOIN, LEFT JOIN 등 적절한 조인 방식을 선택하고, 조인 순서를 최적화하는 것이 중요합니다.
4. Autovacuum 설정
Autovacuum은 PostgreSQL에서 자동으로 테이블을 정리하는 기능입니다. 불필요한 데이터를 삭제하여 디스크 공간을 회수하고, 성능 저하를 방지하는 중요한 역할을 합니다. Autovacuum 설정을 적절하게 조정하면 성능을 크게 향상시킬 수 있습니다.
- autovacuum_naptime: Autovacuum 프로세스가 얼마나 자주 실행될지 설정합니다. 기본값은 1분으로 설정되어 있지만, 데이터 변경이 빈번한 시스템에서는 더 자주 실행되도록 설정하는 것이 좋습니다.
- autovacuum_vacuum_threshold: 테이블에서 삭제되거나 수정된 레코드가 일정 수 이상일 때 VACUUM 작업을 수행하는 임계값을 설정합니다. 너무 높게 설정하면 불필요한 데이터가 테이블에 남아 성능이 저하될 수 있습니다.
- autovacuum_analyze_threshold: 테이블에서 변경된 레코드 수에 따라 자동으로 ANALYZE 작업을 실행하여 쿼리 최적화를 돕습니다. 분석이 필요하지 않은 데이터베이스에서는 이 값을 높게 설정할 수 있습니다.
5. 복제 및 클러스터링
EPAS는 고가용성과 확장성을 위해 복제와 클러스터링을 지원합니다. 데이터베이스 성능을 향상시키기 위해 여러 서버에서 데이터를 분산 처리할 수 있습니다.
- 스트리밍 복제: 데이터베이스의 변경 사항을 실시간으로 다른 서버로 전송하여 복제합니다. 이 기능을 통해 읽기 전용 트래픽을 분산시켜 성능을 개선할 수 있습니다.
- 논리 복제: 데이터를 논리적으로 복제하여 일부 테이블만 복제하거나, 여러 개의 독립된 데이터베이스 인스턴스 간에 데이터를 동기화할 수 있습니다.
- 클러스터링: 데이터베이스 클러스터링을 통해 여러 서버가 하나의 데이터베이스처럼 작동하게 할 수 있습니다. 클러스터링은 대규모 시스템에서 워크로드를 분산시키는 데 유용합니다.
6. 트랜잭션 관리
트랜잭션을 효율적으로 관리하는 것은 데이터베이스 성능에 중요한 영향을 미칩니다. 장기 트랜잭션은 데이터베이스 성능을 저하시킬 수 있으므로 가능한 한 짧게 유지하는 것이 좋습니다.
- 트랜잭션 시간 최소화: 트랜잭션을 너무 오래 유지하면 데이터베이스 락이 걸리거나, WAL 파일의 크기가 커져 성능이 저하될 수 있습니다. 트랜잭션은 가능한 빨리 커밋하는 것이 좋습니다.
- 트랜잭션 격리 수준: EPAS에서는 다양한 트랜잭션 격리 수준을 지원하며, 성능과 일관성 사이에서 균형을 맞춰야 합니다. 필요할 때만 높은 격리 수준을 사용하고, 가능한 한 낮은 격리 수준을 사용하여 성능을 최적화합니다.
7. 모니터링 도구 사용
성능을 지속적으로 모니터링하는 것이 중요합니다. 문제를 사전에 감지하고 해결할 수 있도록 모니터링 도구를 활용합니다.
- pg_stat_statements: 쿼리 성능을 모니터링할 수 있는 확장 모듈입니다. 쿼리의 실행 시간, 실행 빈도, 블록 읽기 및 쓰기 등 다양한 성능 지표를 제공합니다. 이를 통해 느린 쿼리를 분석하고 최적화할 수 있습니다.
- PEM (Postgres Enterprise Manager): EnterpriseDB에서 제공하는 성능 모니터링 도구로, 데이터베이스의 상태를 실시간으로 모니터링하고 성능 경고를 설정할 수 있습니다. 쿼리 성능, 데이터베이스 리소스 사용량 등을 분석하여 문제를 사전에 예방할 수 있습니다.
8. 컨피그 파일 최적화
postgresql.conf 파일에서 성능에 관련된 여러 설정을 최적화할 수 있습니다. 이 파일은 데이터베이스의 동작 방식을 결정하는 중요한 설정들을 포함하고 있습니다.
- max_connections: 데이터베이스에 동시에 연결할 수 있는 최대 연결 수를 설정합니다. 이 값을 너무 높게 설정하면 시스템 자원이 부족해질 수 있으므로, 실제 트래픽에 맞춰 적절히 조정해야 합니다.
- logging_collector: 로그 파일을 수집하여 성능 문제를 추적하는 데 사용됩니다. 로그 수준을 적절히 설정하여 필요한 정보만 기록하고, 불필요한 로깅으로 성능이 저하되지 않도록 합니다.
- effective_cache_size: PostgreSQL이 사용할 수 있는 운영 체제의 디스크 캐시 크기를 추정하는 설정입니다. 데이터베이스의 캐시 성능을 최적화하려면 시스템의 가용 메모리 양에 맞춰 설정해야 합니다.
1. 성능 최적화 설정
# 기본 성능 최적화
shared_buffers = 4GB # RAM의 25~40% 추천 (시스템 RAM에 맞춰 조정)
work_mem = 64MB # 쿼리당 할당되는 메모리 (쿼리 복잡도에 따라 조정)
maintenance_work_mem = 512MB # 인덱스 재구성, VACUUM 등의 작업을 위한 메모리
effective_cache_size = 12GB # 시스템에서 사용할 수 있는 OS 디스크 캐시 추정 (시스템 RAM의 75%)
wal_buffers = 16MB # 기본적으로 16MB로 설정
default_statistics_target = 100 # 통계 수집의 정확도를 높여 쿼리 최적화에 도움
random_page_cost = 1.1 # SSD 사용 시 디스크 접근 비용 조정
effective_io_concurrency = 200 # 디스크 병렬 처리 수준 (SSD 사용 시 200으로 설정)
max_worker_processes = 8 # 최대 워커 프로세스 수 (멀티코어 CPU에서 성능 향상)
max_parallel_workers_per_gather = 4 # 쿼리 병렬 처리 설정
max_parallel_workers = 8 # 최대 병렬 워커 설정
# 연결 및 트랜잭션 설정
max_connections = 100 # 데이터베이스 최대 연결 수 (사용 패턴에 맞춰 조정)
checkpoint_completion_target = 0.9 # 체크포인트가 90% 완료되도록 조정
wal_compression = on # WAL 파일 크기 최적화를 위해 압축 사용
synchronous_commit = off # 비동기 커밋을 통해 쓰기 성능 향상
# Autovacuum 설정
autovacuum = on # Autovacuum 활성화
autovacuum_naptime = 60 # Autovacuum 대기 시간 (60초)
autovacuum_vacuum_scale_factor = 0.1 # 데이터 변경 후 테이블의 10%가 변경되면 VACUUM 실행
autovacuum_analyze_scale_factor = 0.05 # 테이블의 5%가 변경되면 ANALYZE 실행
# 로그 설정
logging_collector = on # 로그 수집기 활성화
log_directory = 'pg_log' # 로그 파일 저장 디렉터리
log_filename = 'postgresql-%Y-%m-%d.log' # 로그 파일 이름 형식
log_rotation_age = 1d # 매일 로그 파일 교체
log_rotation_size = 10MB # 로그 파일이 10MB 이상이면 교체
# 슬로우 쿼리 로그 설정
log_min_duration_statement = 1000 # 1000ms 이상 소요된 쿼리를 로그로 남김 (1초)
log_statement = 'none' # 모든 쿼리를 로깅하지 않고, 슬로우 쿼리만 로깅
log_duration = on # 각 쿼리의 실행 시간 로깅
# 에러 로그 설정
log_min_error_statement = error # 에러 발생 시 쿼리를 로그로 기록
log_min_messages = warning # 경고 이상의 모든 메시지를 로그로 기록
log_checkpoints = on # 체크포인트 로그 기록
log_connections = on # 신규 연결 로그 기록
log_disconnections = on # 연결 해제 로그 기록
log_lock_waits = on # 잠금 대기 시간 로그 기록
log_temp_files = 0 # 모든 임시 파일 기록
# 사용자별 로그 설정 (선택 사항)
log_line_prefix = '%t [%p]: [%l-1] user=%u, db=%d, app=%a '
# 시간, 프로세스ID, 세션ID, 사용자, 데이터베이스, 애플리케이션명을 포함한 로그 포맷
-- pg_stat_statements 설치
CREATE EXTENSION pg_stat_statements;
슬로우 쿼리 로깅 설정 이후, pg_stat_statements 확장을 통해 슬로우 쿼리를 효율적으로 관리하고 분석할 수 있습니다.
반응형
댓글