MariaDB (mysql)을 sysbench로 벤치 마크

8969 단어 mariadbsysbench

소개



DB의 버전 업을 할 때나, 파라미터 변경을 할 때, 성능이 열화되어 있지 않거나, 노린 대로 성능이 향상되고 있는지를 확인하는 것이 중요합니다. 이번에는 sysbench라는 도구를 사용해 보았습니다.

sysbench란?



DB의 벤치마크로도 자주 사용되지만, 서버의 CPU, memory, fileio를 계측할 수도 있습니다. DB에 대해서는 oldp(OnLine Transaction Processing)를 사용하여 계측합니다.

sysbench 버전



환경은 CentOS 6.7입니다. yum에서는 epel 리포지토리를 추가하면 install 할 수 있습니다. 설치 방법은 생략합니다.
# sysbench --version
sysbench 1.0.9

1.0.9를 사용했습니다. 1계와 그 이전에는 거동이 상당히 다르기 때문에 주의.

테스트용 데이터베이스 작성



사전에 테스트를 위한 데이터베이스와 사용자를 만들어 둡시다. sysbench는 기본적으로 sbtest 사용자로 연결됩니다.
MariaDB [(none)]> create database sbtest;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sbtest             |
| test               |
+--------------------+
5 rows in set (0.01 sec)

MariaDB [(none)]> GRANT ALL ON sbtest.* TO 'sbtest'@'localhost' IDENTIFIED BY 'sbtest';
Query OK, 0 rows affected (0.00 sec)

테스트용 테이블 작성



자, 다음은 테스트용 테이블 작성이지만 여기에서 sysbench를 사용합니다.
# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --table-size=1000000 --mysql-host=localhost --mysql-password=sbtest --time=60 --db-ps-mode=disable prepare
  • 인수의 1 번째로 lua script를 지정합니다. sysbench를 install하면/usr/share/sysbench 이하에 lua script가 배치됩니다.
  • db-driver로 mysql을 지정합니다.
  • table-size는 100만을 지정
  • db-ps-mode는 prepared-statement, 즉 database server가 준비한 API를 사용할지 어떨지. disable와 auto가 선택 가능.

  • 기타 접속 정보는 환경에 맞추어 주십시오.

    테스트 실시



    실행으로 실행합니다.
    # sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --table-size=100000 --mysql-host=localhost --mysql-password=sbtest --time=60 --db-ps-mode=disable --threads=8 run
    

    스레드 수를 지정할 수 있습니다. 기본값은 1입니다.
    # sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --table-size=100000 --mysql-host=localhost --mysql-password=sbtest --time=60 --db-ps-mode=disable --threads=8 run
    sysbench 1.0.9 (using system LuaJIT 2.0.4)
    
    Running the test with following options:
    Number of threads: 8
    Initializing random number generator from current time
    
    
    Initializing worker threads...
    
    Threads started!
    
    SQL statistics:
        queries performed:
            read:                            365400
            write:                           104362
            other:                           52187
            total:                           521949
        transactions:                        26087  (434.71 per sec.)
        queries:                             521949 (8697.58 per sec.)
        ignored errors:                      13     (0.22 per sec.)
        reconnects:                          0      (0.00 per sec.)
    
    General statistics:
        total time:                          60.0093s
        total number of events:              26087
    
    Latency (ms):
             min:                                  3.52
             avg:                                 18.40
             max:                                 72.39
             95th percentile:                     24.38
             sum:                             479986.45
    
    Threads fairness:
        events (avg/stddev):           3260.8750/10.51
        execution time (avg/stddev):   59.9983/0.00
    

    60초간 실행한 결과가 나옵니다. 성능 지표에는 transactions의 값을 보면 좋을 것입니다.

    script화



    prepare/run/clean을 실행할 수 있도록 script화했습니다.

    sysbench.sh
    #!/bin/sh
    LUA=/usr/share/sysbench/oltp_read_write.lua
    SIZE=1000000
    usage()
    {
      echo "Usage: ./sysbench.sh <prepare|run|cleanup> <num of threads>"
      exit "${1}"
    }
    #chack argumets
    if [ "${1}" = "" -o $# -gt 3 ]; then
      usage 1
    elif [ "${2}" = "" ]; then
      THREADS=1
    else
      THREADS=${2}
    fi
    sysbench ${LUA} --db-driver=mysql --table-size=${SIZE} --mysql-host=localhost --mysql-password=sbtest --time=60 --db-ps-mode=disable --threads=${THREADS} ${1}
    

    이 run을 한층 더 랩 해, thread수를 변화시켜 실행하는 script입니다.

    run.sh
    #!/bin/sh
    DATE=`date '+%Y%m%d%H%M'`
    mkdir $DATE
    for thread in 1 2 4 8 16 64 256
    do
      ./sysbench.sh run ${thread} >> ${DATE}/sysbench_read_write_${thread}.log
    done
    

    또한 각 스레드 수에 대한 결과의 트랜잭션 수를 표시하는 스크립트입니다.

    result.sh
    #!/bin/sh
    usage()
    {
      echo "Usage: ./result.sh <result's directory>"
      exit "${1}"
    }
    #chack argumets
    if [ "${1}" = "" -o $# -gt 2 ]; then
      usage 1
    fi
    grep transaction ${1}/*.log | sort -t _ -nk3 | awk '{print $3}'
    

    결론



    DB의 버전 업시나, 파라미터 변경시에 벤치마크를 실시할 수 있으면 안심이군요.

    덤: MariaDB 버전 간 비교



    MariaDB의 5.5, 10.0, 10.1, 10.2의 각 최신판을 clean install한 결과로, thread수를 바꾸어 실시해 보았습니다.



    5.5.45
    10.0.33
    10.1.28
    10.2.10


    1
    21516
    19136
    18413
    18942

    2
    24803
    28070
    24875
    26851

    4
    23361
    20814
    20271
    19981

    8
    24338
    24357
    22879
    23146

    16
    25256
    27744
    24751
    26371

    64
    24425
    26731
    24579
    25566




    maxcon의 default가 151이므로 256에서는 측정할 수 없습니다. 5계와 10계에서 경향이 다른 것 같은 생각도 합니다만, 내부 구조에 밝은 것은 아니기 때문에, 이 결과로부터의 고찰은 특별히 없습니다.

    좋은 웹페이지 즐겨찾기