본문 바로가기
WIKI 기술 지식 베이스

벤치마킹(Benchmarking)

원문 보기 위키 갱신

CloudNativePG에서 Kubernetes에 배포한 PostgreSQL을 쉽게 벤치마킹할 수 있도록 CNPG kubectl 플러그인이 준비되어 있어요. 데이터베이스 성능과 스토리지 성능을 나눠서 측정하는 방법을 살펴볼게요.

출처: 문서

본문

CNPG kubectl 플러그인은 CloudNativePG를 사용해 Kubernetes에서 PostgreSQL 배포를 벤치마킹하는 쉬운 방법을 제공해요.

벤치마킹은 두 가지 측면에 집중해요:

  • 데이터베이스: pgbench를 사용
  • 스토리지: fio를 사용

:::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를 실행하면 다음을 수행해요:

  1. PVC 생성
  2. fio 작업 구성을 나타내는 ConfigMap 생성
  3. 단일 파드로 구성된 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시간 벤치마크):

Sequential writes bandwidth

모든 테스트가 끝나면 fio Deployment와 리소스를 다음으로 삭제할 수 있어요:

kubectl cnpg fio <fio-job-name> --dry-run | kubectl delete -f -

fio Deployment를 생성할 때 사용한 것과 같은 이름을 사용하고, 해당하는 경우 네임스페이스를 추가해야 해요.

더 알아보기 (Learn more)