PostgreSQL 채택이 증가함에 따라 데이터베이스 관리자(DBA)와 개발자들은 종종 다양한 워크로드에서 효율적으로 애플리케이션이 실행되도록 보장하기 위해 성능을 평가해야 합니다. 성능 벤치마킹은 PostgreSQL이 다양한 부하를 처리하는 능력을 측정하는 중요한 과정으로, 병목 현상을 식별하고 최적화할 수 있는 영역을 도와줍니다. 이 기사에서는 전문가처럼 PostgreSQL을 벤치마킹하는 데 도움이 되는 도구, 메트릭 및 테스트 시나리오를 탐색합니다.
PostgreSQL을 왜 벤치마킹해야 하는가?
벤치마킹을 통해 다음을 수행할 수 있습니다:
- 특정 워크로드 하에서 데이터베이스의 처리량과 대기 시간을 측정합니다.
- 하드웨어 또는 구성 병목 현상을 식별합니다.
- 인덱스 변경이나 쿼리 재작성과 같은 최적화의 영향을 비교합니다.
- 고용량 동시 사용자 활동이나 대량 데이터 쓰기와 같은 실제 시나리오를 시뮬레이트합니다.
추적해야 할 주요 메트릭
PostgreSQL을 벤치마킹할 때 다음 메트릭에 초점을 맞춥니다:
- TPS(초당 트랜잭션): 데이터베이스가 초당 완료하는 트랜잭션 수를 측정합니다.
- IOPS(초당 입출력 작업 수): 디스크 활동을 추적합니다.
- 대기 시간: 쿼리 실행에 소요되는 시간을 측정하며 이는 사용자 경험에 영향을 미칩니다.
- 자원 활용: 벤치마킹 중 CPU, 메모리 및 디스크 사용량을 추적합니다.
PostgreSQL 벤치마킹을 위한 도구
1. pgbench
pgbench란 무엇인가요?
pgbench
는 PostgreSQL의 내장 벤치마킹 도구입니다. 이는 동시에 실행되는 클라이언트가 트랜잭션을 수행하여 데이터베이스의 성능을 측정합니다.
설치
PostgreSQL 설치와 함께 제공됩니다. 확인하려면 다음을 실행하세요:
bash
pgbench --version
시작하기
1. 벤치마크 데이터베이스 초기화:
bash
pgbench -i -s 50 mydb
여기서 -s
는 스케일링 팩터를 설정하여 데이터세트의 크기를 결정합니다.
2. 간단한 벤치마크 실행:
bash
pgbench -c 10 -j 2 -T 60 mydb
-c 10
: 클라이언트 연결 수.-j 2
: 스레드 수.-T 60
: 벤치마크 지속 시간(초).
샘플 출력:
transaction type: TPC-B (sort of)
scaling factor: 50
number of clients: 10
number of threads: 2
duration: 60 s
tps = 1420.123 (excluding connections establishing)
2. Sysbench
왜 Sysbench를 사용하나요?
Sysbench는 데이터베이스와 시스템을 위한 다목적 벤치마킹 도구입니다. 이는 pgbench
보다 사용자 정의 작업 부하에 더 많은 유연성을 제공합니다.
설치
다음 명령어를 사용하여 Sysbench를 설치하세요:
bash
sudo apt-get install sysbench
시작하기
1. 벤치마크 준비:
bash
sysbench --db-driver=pgsql --pgsql-db=mydb \
--pgsql-user=postgres --tables=10 --table-size=1000000 \
oltp_read_write prepare
2. 벤치마크 실행:
bash
sysbench --db-driver=pgsql --pgsql-db=mydb \
--pgsql-user=postgres --threads=4 \
--time=60 oltp_read_write run
3. pg_stat_statements
pg_stat_statements란 무엇인가요?
PostgreSQL 쿼리 성능과 실행 통계를 추적하는 확장 기능입니다. 워크로드를 시뮬레이션하지는 않지만 벤치마크 중 느린 쿼리를 분석하는 데 도움이 됩니다.
설정
1. postgresql.conf
에서 확장 기능을 활성화합니다:
shared_preload_libraries = 'pg_stat_statements'
2. 구성을 다시 로드하고 확장 기능을 생성합니다:
CREATE EXTENSION pg_stat_statements;
사용법
다음 쿼리를 실행하여 실행 시간이 긴 문을 식별합니다:
SELECT query, total_exec_time, calls
FROM pg_stat_statements
ORDER BY total_exec_time DESC;
벤치마킹 시나리오
다음은 세 가지 시나리오(read-heavy, write-heavy, 및 혼합 워크로드)에 대한 벤치마크 결과의 시각적 표현입니다. 초당 트랜잭션(TPS) 다이어그램은 PostgreSQL이 동시 트랜잭션을 효율적으로 처리하는 능력을 보여주며, 지연 시간 다이어그램은 쿼리 실행에 소요된 시간을 보여줍니다.
PostgreSQL 초당 트랜잭션(TPS)
PostgreSQL 쿼리 지연
워크로드 유형
1. Read-Heavy 워크로드
목표: 높은 읽기 활동 하에서 데이터베이스 성능을 테스트합니다.
설정: 기본 읽기 전용 트랜잭션을 사용하여 pgbench
를 사용합니다:
bash
pgbench -c 50 -T 120 -S mydb
-S
: SELECT 쿼리만 실행합니다.-c 50
: 50개의 동시 클라이언트를 시뮬레이션합니다.
2. Write-Heavy 워크로드
목표: 빈번한 삽입 또는 업데이트로 데이터베이스 성능을 측정합니다.
설정: 벤치마크를 수정하여 쓰기를 포함시킵니다:
bash
pgbench -c 20 -j 4 -T 120 -N mydb
-N
: 비-SELECT 쿼리 실행.
3. 혼합 읽기/쓰기 워크로드
목표: 읽기와 쓰기를 혼합한 실제 워크로드 모의.
설정: 균형 잡힌 구성 사용:
bash
pgbench -c 30 -j 4 -T 180 mydb
더 나은 벤치마크 결과를 위한 PostgreSQL 최적화
메모리 설정 튜닝
shared_buffers = 25% of system memory
work_mem = 4MB
maintenance_work_mem = 64MB
병렬 쿼리 실행 활성화
max_parallel_workers_per_gather = 4
디스크 I/O 최적화
WAL 파일에 SSD 사용 및 이러한 설정 튜닝:
wal_buffers = 16MB
synchronous_commit = off
예시 결과 및 해석
시나리오: 60초 동안 읽기 중심 워크로드를 실행하는 50개의 동시 클라이언트.
결과:
tps = 2500.456 (excluding connections establishing)
해석: 이 워크로드에서 데이터베이스는 초당 2500개의 트랜잭션을 처리할 수 있다.
만약 TPS가 예상보다 낮다면, 성능 병목 현상을 확인하기 위해 EXPLAIN ANALYZE
를 사용하여 쿼리 계획을 분석하라.
결론
PostgreSQL의 벤치마킹은 성능 제한을 식별하고 다양한 워크로드에 대해 데이터베이스를 최적화하는 강력한 방법입니다. pgbench
와 sysbench
같은 도구들과 pg_stat_statements
에서 얻은 통찰을 결합하여 실제 시나리오를 시뮬레이션하고 PostgreSQL 구성을 세밀하게 조정할 수 있습니다.
이러한 도구와 기술을 숙달함으로써 PostgreSQL 인스턴스가 읽기 집중적 및 쓰기 중심 애플리케이션에 대해 높은 성능을 제공하도록 보장할 수 있습니다.
Source:
https://dzone.com/articles/how-to-benchmark-postgresql-for-optimal-performance