sysbench로 MySQL benchmark 하기

MySQL 벤치마크를 하는 방법은 여러가지 방법이 있다.

sysbench와 같은 대표적인 벤치마크 툴을 이용할 수도 있고, MySQL에서 제공하는 mysqlslap과 같은 툴을 이용할 수도 있다. 그 외 다양한 벤치마크 툴들이 있다.

오늘은 sysbench로 MySQL 벤치마크를 수행 해본다.

sysbench의 다양한 옵션들

sysbench란?

sysbench는 DB 서버에 자주 사용하는 스크립트 멀티 쓰레드 벤치마크 툴이다. 주로 MySQL(MariaDB), PostgreSQL 벤치마크에 사용한다.

Compiled-in database drivers:
  mysql - MySQL driver
  pgsql - PostgreSQL driver

GitHub - akopytov/sysbench: Scriptable database and system performance benchmark
Scriptable database and system performance benchmark - GitHub - akopytov/sysbench: Scriptable database and system performance benchmark

테스트 환경
- ubuntu 20.04
- MySQL 5.7.35

설치

sysbench를 설치하는 방법은 직접 소스 컴파일을 해도 되고, 패키지 설치 형태로 진행해도 된다. 입맛에 맞게 고르면 된다. 오늘 테스트는 apt로 바로 설치를 진행한다.

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench

sysbench version

설치한 버전을 확인한다.

$ sysbench --version
sysbench 1.0.20

sysbench 도움말

help 옵션을 이용해 sysbench가 제공하는 옵션들을 확인할 수 있다.

sysbench --help

기본 정보 확인

sysbench를 수행해보기 전에, 기본적인 정보들을 체크해보자.

sysbench 번들 벤치마크

  • oltp_*.lua: OLTP 유형의 데이터베이스 벤치마크
  • fileio: 파일시스템 레벨 벤치마크
  • cpu: 단순 CPU 벤치마크
  • memory: 메모리 액세스 벤치마크
  • threads: 쓰레드 베이스 스케쥴러 벤치마크 benchmark
  • mutex: POSIX 뮤텍스 벤치마크

sysbench 주요 커멘드

  • prepare: 테스트를 위한 사전 준비 - ex. 테스트 데이터 생성 등
  • run: testname과 함께 run 커멘드를 사용하면, 실제로 테스트를 실행한다.
  • cleanup: 테스트를 위해 생성한 임시 데이터를 제거(removes) 한다.
  • help: 아래와 같이 testname과 함께 help 커멘드를 사용하면, 테스트를 위한 커멘드 목록을 확인할 수 있다.
sysbench oltp_read_only help

벤치마크 사전 작업

DB 유저, 스키마 준비

아래와 같이 테스트에서 활용할 DB 유저와 스키마를 미리 준비한다.

mysql> create database sysbench;

mysql> create user 'sysbench_user'@'%' identified by '패스워드';

mysql> grant all privileges on sysbench.* to sysbench_user;

sysbench - prepare 수행

아래와 같이 테스트용 데이터를 적재한다. oltp_read_only 타입의 테스트를 수행해보고자 한다.

sysbench --mysql-host=호스트아이피 --mysql-port=포트 \
--mysql-user=유저명 --mysql-password=패스워드 \
--mysql-db=데이터베이스명 --tables=테이블수 --table-size=테이블크기 \ 
--threads=쓰레드수 \
/usr/share/sysbench/oltp_read_only.lua prepare

아래와 같이 데이터 적재가 된 것을 볼 수 있다.

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Initializing worker threads...

Creating table 'sbtest7'...
Creating table 'sbtest1'...
Creating table 'sbtest2'...
Creating table 'sbtest5'...
Creating table 'sbtest4'...
Creating table 'sbtest3'...
Creating table 'sbtest6'...
Creating table 'sbtest10'...
Creating table 'sbtest8'...
Creating table 'sbtest9'...
Inserting 10000000 records into 'sbtest7'
Inserting 10000000 records into 'sbtest4'
Inserting 10000000 records into 'sbtest5'
Inserting 10000000 records into 'sbtest1'
Inserting 10000000 records into 'sbtest2'
Inserting 10000000 records into 'sbtest6'
Inserting 10000000 records into 'sbtest10'
Inserting 10000000 records into 'sbtest9'
Inserting 10000000 records into 'sbtest8'
Inserting 10000000 records into 'sbtest3'
Creating a secondary index on 'sbtest4'...
Creating a secondary index on 'sbtest5'...
Creating a secondary index on 'sbtest10'...
Creating a secondary index on 'sbtest9'...
Creating a secondary index on 'sbtest7'...
Creating a secondary index on 'sbtest3'...
Creating a secondary index on 'sbtest2'...
Creating a secondary index on 'sbtest8'...
Creating a secondary index on 'sbtest1'...
Creating a secondary index on 'sbtest6'...

DB 내에서 크기를 확인 해본다.

-- 테이블별 크기 
+--------------+------------+------------+
| table_schema | table_name | TOTAL (GB) |
+--------------+------------+------------+
| sysbench     | sbtest1    |      2.127 |
| sysbench     | sbtest2    |      2.168 |
| sysbench     | sbtest3    |      2.174 |
| sysbench     | sbtest4    |      2.144 |
| sysbench     | sbtest5    |      2.204 |
| sysbench     | sbtest6    |      2.206 |
| sysbench     | sbtest7    |      2.050 |
| sysbench     | sbtest8    |      2.121 |
| sysbench     | sbtest9    |      2.177 |
| sysbench     | sbtest10   |      2.200 |
+--------------+------------+------------+
10 rows in set (0.00 sec)

-- 테이블 건 count
+----------+----------+----------+
| sysbench | sbtest1  | count(*) |
+----------+----------+----------+
| sysbench | sbtest1  | 10000000 |
| sysbench | sbtest2  | 10000000 |
| sysbench | sbtest3  | 10000000 |
| sysbench | sbtest4  | 10000000 |
| sysbench | sbtest5  | 10000000 |
| sysbench | sbtest6  | 10000000 |
| sysbench | sbtest7  | 10000000 |
| sysbench | sbtest8  | 10000000 |
| sysbench | sbtest9  | 10000000 |
| sysbench | sbtest10 | 10000000 |
+----------+----------+----------+

벤치마크 수행

sysbench - run 수행

아래와 같이 oltp_read_only를 실행해보자.

시간은 120초로 설정해주었다.

sysbench --mysql-host=호스트아이피 --mysql-port=포트 \
--mysql-user=유저 --mysql-password=패스워드 \
--mysql-db=데이터베이스명 --tables=테이블수 --table-size=테이블크기 \
--threads=쓰레드수 --time=120 \
/usr/share/sysbench/oltp_read_only.lua run

완료되면 아래와 같이 결과 리포트가 출력된다.

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 10
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            961226
        write:                           0
        other:                           137318
        total:                           1098544
    transactions:                        68659  (572.09 per sec.)
    queries:                             1098544 (9153.40 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          120.0135s
    total number of events:              68659

Latency (ms):
         min:                                    4.96
         avg:                                   17.48
         max:                                   63.76
         95th percentile:                       23.95
         sum:                              1199912.77

Threads fairness:
    events (avg/stddev):           6865.9000/463.22
    execution time (avg/stddev):   119.9913/0.00

sysbench - cleanup 정리

테스트가 완료 되었으면 테스트 데이터를 정리한다.

sysbench --mysql-host=호스트아이피 --mysql-port=포트 \
--mysql-user=유저 --mysql-password=패스워드 \
--mysql-db=데이터베이스명 --tables=테이블수 --table-size=테이블크기 \
--threads=쓰레드수 \
/usr/share/sysbench/oltp_read_only.lua cleanup

아래와 같이 테스트용 테이블 들을 DROP 처리하며 정리하는 것을 확인할 수 있다.

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...

sysbench에는 위에서 사용한 옵션 외에도 다양한 옵션을 제공한다. 다양한 시나리오로 여러 테스트 케이스를 설계해서 테스트를 해보면 재미있는 결과를 얻을 수 있을 것이다.

날짜 내용
2021.10.24 최초 글 작성