벤치마킹(Benchmarking)
CloudNativePG에서 Kubernetes에 배포한 PostgreSQL을 쉽게 벤치마킹할 수 있도록 CNPG kubectl 플러그인이 준비되어 있어요. 데이터베이스 성능과 스토리지 성능을 나눠서 측정하는 방법을 살펴볼게요.
출처: 문서
본문
CNPG kubectl 플러그인은 CloudNativePG를 사용해 Kubernetes에서 PostgreSQL 배포를 벤치마킹하는 쉬운 방법을 제공해요.
벤치마킹은 두 가지 측면에 집중해요:
:::info[IMPORTANT]
pgbench와 fio는 스테이징 또는 사전 프로덕션 환경에서 실행해야 해요. 프로덕션 환경에서는 이 플러그인을 사용하지 마세요. 같은 공유 환경에서 실행되는 데이터베이스와 다른 워크로드/애플리케이션에 치명적인 결과를 초래할 수 있어요.
:::
pgbench
kubectl CNPG 플러그인 명령 pgbench는 기존 Postgres Cluster에 대해 사용자가 정의한 pgbench 작업(job)을 실행해요.
--dry-run 플래그를 통해 나중에 수정/실행할 작업 매니페스트를 생성할 수 있어요.
pgbench의 일반적인 명령 구조는 다음과 같아요:
kubectl cnpg pgbench \
-n <namespace> <cluster-name> \
--job-name <pgbench-job> \
--db-name <db-name> \
-- <pgbench options>
:::info[IMPORTANT]
작업에서 사용할 특정 옵션에 대한 정보는 pgbench 문서를 참고해 주세요.
:::
이 예시는 cluster-example이라는 Cluster에서 app 데이터베이스를 pgbench OLTP 유형 목적으로 초기화하는 pgbench-init이라는 작업을 스케일 팩터 1000으로 생성해요:
kubectl cnpg pgbench \
--job-name pgbench-init \
cluster-example \
-- --initialize --scale 1000
:::note 이렇게 하면 100000000개의 레코드를 가진 데이터베이스가 생성되며, 디스크에 약 13GB의 공간을 차지해요. :::
작업의 진행 상황은 다음으로 확인할 수 있어요:
kubectl logs jobs/pgbench-run
다음 예시는 앞서 초기화한 데이터베이스에 대해 pgbench를 단일 연결로 30초 동안 실행하는 pgbench-run이라는 작업을 생성해요:
kubectl cnpg pgbench \
--job-name pgbench-run \
cluster-example \
-- --time 30 --client 1 --jobs 1
다음 예시는 --db-name 플래그와 pgbench 네임스페이스를 사용해 기존 데이터베이스에 대해 pgbench를 실행해요:
kubectl cnpg pgbench \
--db-name pgbench \
--job-name pgbench-job \
cluster-example \
-- --time 30 --client 1 --jobs 1
기본적으로 작업은 만료되지 않아요. --ttl 플래그로 자동 삭제를 활성화할 수 있어요. 지정한 기간(초 단위)이 지나면 작업이 삭제돼요.
kubectl cnpg pgbench \
--job-name pgbench-run \
--ttl 600 \
cluster-example \
-- --time 30 --client 1 --jobs 1
특정 워커 노드에서 pgbench 작업을 실행하려면 --node-selector 옵션을 사용할 수 있어요. 앞선 초기화 작업을 workload=pgbench 레이블이 있는 노드에서 실행하고 싶다면 이렇게 하면 돼요:
kubectl cnpg pgbench \
--db-name pgbench \
--job-name pgbench-init \
--node-selector workload=pgbench \
cluster-example \
-- --initialize --scale 1000
작업 상태는 다음으로 가져올 수 있어요:
kubectl get job/pgbench-job -n <namespace>
NAME COMPLETIONS DURATION AGE
job-name 1/1 15s 41s
작업이 완료되면 다음을 실행해 결과를 수집할 수 있어요:
kubectl logs job/pgbench-job -n <namespace>
fio
kubectl CNPG 플러그인 명령 fio는 기본값과 읽기 작업으로 fio 작업을 실행해요. --dry-run 플래그를 통해 나중에 수정/실행할 작업 매니페스트를 생성할 수 있어요.
:::note
kubectl 플러그인 명령 fio는 ConfigMap을 사용해 미리 정의된 fio 작업 값으로 Deployment를 생성해요. 커스텀 작업 값을 제공하고 싶다면 --dry-run 플래그로 매니페스트를 생성하고, 생성된 ConfigMap에 커스텀 작업 값을 넣을 것을 권장해요.
:::
기본 사용 예시:
kubectl cnpg fio <fio-name>
커스텀 값 사용 예시:
kubectl cnpg fio <fio-name> \
-n <namespace> \
--storageClass <name> \
--pvcSize <size>
fio 네임스페이스에서 standard라는 StorageClass와 pvcSize: 2Gi에 대해 fio 명령을 실행하는 예시:
kubectl cnpg fio fio-job \
-n fio \
--storageClass standard \
--pvcSize 2Gi
Deployment 상태는 다음으로 가져올 수 있어요:
kubectl get deployment/fio-job -n fio
NAME READY UP-TO-DATE AVAILABLE AGE
fio-job 1/1 1 1 14s
kubectl 플러그인 명령 fio를 실행하면 다음을 수행해요:
- PVC 생성
- fio 작업 구성을 나타내는 ConfigMap 생성
- 단일 파드로 구성된 fio Deployment 생성 — 파드가 PVC에서 fio를 실행하고, 벤치마크 완료 후 그래프를 생성한 다음 웹서버로 생성된 파일을 서빙하기 시작해요. 이를 위해
fio-tools이미지를 사용해요.
Deployment가 생성한 파드는 결과를 서빙하기 시작하면 준비 상태가 돼요. Deployment가 생성한 파드의 포트를 포워딩할 수 있어요
kubectl port-forward -n <namespace> deployment/<fio-name> 8000
그런 다음 브라우저를 사용해 http://localhost:8000/에 연결해 데이터를 얻을 수 있어요.
기본 8k 블록 크기는 PostgreSQL 워크로드를 에뮬레이션하기 위해 선택됐어요. 사용 가능한 IOPS 수를 제한하는 디스크는 이 파라미터를 변경할 때 매우 다른 처리량 값을 보일 수 있어요.
아래는 전용 Kubernetes 노드에 마운트된 로컬 디스크에서의 순차 쓰기 다이어그램 예시예요(1시간 벤치마크):

모든 테스트가 끝나면 fio Deployment와 리소스를 다음으로 삭제할 수 있어요:
kubectl cnpg fio <fio-job-name> --dry-run | kubectl delete -f -
fio Deployment를 생성할 때 사용한 것과 같은 이름을 사용하고, 해당하는 경우 네임스페이스를 추가해야 해요.