MySQL 성능 평가를 위한 Sysbench 기반 압력 테스트 전략

데이터베이스 성능 병목 현상의 핵심 요소

웹 애플리케이션 아키텍처에서 대부분의 구성 요소는 수평 확장(horizontal scaling)을 통해 용량을 쉽게 증가시킬 수 있습니다. 네트워크 대역폭, 애플리케이션 서버 클러스터, 캐시 인프라(Redis, Memcached 등)는 추가 서버를 배포함으로써 즉각적인 성능 향상을 기대할 수 있습니다. 그러나 데이터베이스, 특히 MySQL과 같은 관계형 DBMS는 ACID 특성을 유지해야 하므로 데이터 일관성 보장을 위해 수직 확장(vertical scaling)에 크게 의존하게 되며, 이로 인해 시스템 전체의 성능 병목 지점이 되기 쉽습니다. 이러한 이유로, 서비스의 안정적 운영을 위해서는 데이터베이스 레이어에 대한 정밀한 성능 평가가 필수적입니다. 단순한 API 응답 시간 측정을 넘어서, 실제 데이터 입출력(I/O), 트랜잭션 처리 능력, 동시 접속 부하에 대한 검증이 필요합니다.

주요 평가 지표

데이터베이스 압력 테스트 수행 시 다음과 같은 메트릭을 중심으로 분석을 진행합니다:
  • TPS(Transaction Per Second): 초당 처리 가능한 트랜잭션 수를 의미하며, OLTP 워크로드의 핵심 지표입니다.
  • QPS(Query Per Second): 초당 실행되는 쿼리 수로, 읽기/쓰기 비율 분해가 가능해야 의미 있는 분석이 가능합니다.
  • 응답 지연(latency): 평균 지연 외에도 P95, P99와 같은 백분위수 지연 측정이 중요합니다. 예: "95%의 요청은 20ms 이내에 응답됨".
  • 동시 연결 수(concurrency): 시스템이 동시에 처리할 수 있는 세션 또는 스레드의 수를 나타냅니다.

Sysbench를 활용한 실전 테스트 절차

Sysbench는 MySQL, PostgreSQL 등을 지원하는 오픈소스 벤치마킹 도구로, 멀티스레드 기반의 실질적인 부하 생성이 가능합니다. CPU, 메모리, I/O 성능 테스트 외에도 OLTP 워크로드 시뮬레이션이 주된 사용 목적입니다.

1. 설치 및 환경 준비

다음 명령어를 통해 리눅스 환경에 설치할 수 있습니다:
yum install -y epel-release
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
yum -y install sysbench
sysbench --version
테스트 전 MySQL 서버 내 사전 준비가 필요합니다:
  • 테스트 전용 데이터베이스 생성 (예: CREATE DATABASE sbtest;)
  • 접속 전용 계정 생성 및 권한 할당 (예: sbuser, 비밀번호 pass123)

2. 테스트 데이터 준비

다음 명령어를 사용하여 대규모 샘플 데이터를 자동 생성합니다:
sysbench \
  --db-driver=mysql \
  --mysql-host=127.0.0.1 \
  --mysql-port=3306 \
  --mysql-user=sbuser \
  --mysql-password=pass123 \
  --mysql-db=sbtest \
  --tables=20 \
  --table-size=1000000 \
  --events=0 \
  --time=0 \
  oltp_read_write prepare
위 명령은 20개의 테이블을 생성하고 각 테이블에 100만 건의 레코드를 삽입합니다. 이후 테스트 실행 시 실제 부하가 발생합니다.

3. 다양한 워크로드 모드 테스트

읽기/쓰기 혼합 테스트

실제 애플리케이션과 유사한 OLTP 환경을 시뮬레이션합니다.
sysbench \
  --db-driver=mysql \
  --time=300 \
  --threads=100 \
  --report-interval=1 \
  --mysql-host=127.0.0.1 \
  --mysql-port=3306 \
  --mysql-user=sbuser \
  --mysql-password=pass123 \
  --mysql-db=sbtest \
  --tables=20 \
  oltp_read_write run

읽기 전용 테스트

캐시 효율성 검증 또는 SELECT 중심 쿼리 성능 분석에 적합합니다.
oltp_read_only run

쓰기 전용 테스트

INSERT/UPDATE/DELETE 중심의 부하를 평가할 때 사용됩니다.
oltp_write_only run

4. 결과 해석 예시

테스트 중 1초 간격으로 출력되는 로그 예:
[ 15s ] thds: 100 tps: 487.30 qps: 9746.00 (r/w/o: 6822.20/1949.20/974.60) lat (ms,95%): 22.1 err/s: 0.00 reconn/s: 0.00
  • thds: 100 — 100개의 동시 스레드가 작동 중
  • tps: 487.30 — 초당 약 487건의 트랜잭션 처리
  • qps: 9746.00 — 초당 총 9,746건의 쿼리 실행
  • r/w/o — 읽기(6,822), 쓰기(1,949), 기타(974) 쿼리 분포
  • lat (ms,95%) — 95%의 쿼리는 22.1ms 이내 완료
  • err/s, reconn/s — 오류 및 재연결 발생 여부 확인
테스트 종료 후에는 다음 명령어로 테스트 데이터를 정리할 수 있습니다:
sysbench --db-driver=mysql --mysql-db=sbtest --tables=20 cleanup

후속 조치 및 개선 방향

Sysbench는 강력한 벤치마킹 도구지만 기본 출력 형식은 텍스트 기반입니다. 장기적인 모니터링 및 비교 분석을 위해서는 아래와 같은 접근이 효과적입니다:
  • 결과를 CSV 또는 JSON 형식으로 저장 후 시각화 도구(Grafana, Excel 등)와 연계
  • 자동화 스크립트 작성으로 반복 테스트 및 성능 추이 분석
  • MySQL 내부 상태 변수(information_schema, performance_schema)와 연동한 심층 분석
이를 통해 인덱스 최적화, 쿼리 리라이팅, 버퍼풀 설정 조정 등의 성능 개선 작업의 기준점을 마련할 수 있습니다.

태그: MySQL Sysbench 성능테스트 OLTP TPS

6월 2일 21:45에 게시됨