MySQL道普請便り

第163回sysbench 1.0を使ってMySQLの負荷テストをする

今回はsysbench 1.0を使ってMySQLの負荷テストする方法を紹介したいと思います。

第26回 SysBenchを使ってMySQLの負荷テストをする でsysbenchについてはすでに紹介していますので、sysbenchの概要などはこちらの記事をご参照ください。以前の記事ではsysbenchのバージョンは0.4.12であり、最新のsysbenchはオプションやコマンドなどが若干異なっています。そのため、以前の記事のアップデート版として最新のsysbenchで負荷テストする方法を紹介します。

インストール方法

各OSごとのインストール方法はInstalling from Binary Packagesをご参照ください。今回はCentOS7にsysbenchをインストールしてみます。

# curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
# sudo yum -y install sysbench

2022/1現在の最新バージョン1.0.20がインストールされました。

# sysbench --version
sysbench 1.0.20

sysbenchの構文

sysbenchの一般的なコマンドライン構文は次のとおりです。

sysbench [オプション]... [テスト名] [コマンド]
  • オプション…接続先のMySQLの情報やスレッド数などオプションを指定
  • テスト名…同梱されたテストシナリオ、または自作したテストシナリオを指定
  • コマンド…アクションを指定
    • prepare …テーブル作成やデータ投入などテスト前の準備を実行
    • run …指定したテスト名に基づくテストを実際に実行
    • cleanup …一時データを作成するテストでのテスト実行後に一時データを削除
    • help …指定したテスト名も基づくhelp情報を表示

sysbenchを実行する前の準備

sysbenchを実行する前に、sysbench用のデータベースとユーザを作成します。

mysqlコマンドラインクライアントでログインして、以下のCREATE文を実行してデータベースを作成します。

mysql> CREATE DATABASE sbtest;
Query OK, 1 row affected (0.00 sec)

続けて、ユーザの作成です。sbtestデータベースだけに権限を与えるようにすれば良いので、以下のようなコマンドになります。

mysql> CREATE USER [email protected] IDENTIFIED BY 'Password1!';
mysql> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected] ;
Query OK, 0 rows affected, 1 warning (0.00 sec)

Password1!の部分はデータベースのポリシーに合わせて適切な値に変更して実行してください。またsysbenchに必要なデータベースはsbtestだけなので、必要な権限だけを与えましょう。

続いて、負荷テストを行うためにテーブル作成とデータを作成します。ここはsysbenchが自動作成してくれます。オプションとテスト名oltp_commonコマンドprepareを指定して実行することで、sysbench実行のための準備をしてくれます。

今回は3つのテーブルを作成し、テーブルあたり10000行のデータを準備します。

sysbench  \
    --mysql-host=127.0.0.1 \
    --mysql-port=3306 \
    --mysql-db=sbtest \
    --mysql-user=sbtest \
    --mysql-password=Password1! \
    --tables=3 \
    --table_size=10000 \
    oltp_common prepare

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Creating table 'sbtest1'...
Inserting 10000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...
Creating table 'sbtest2'...
Inserting 10000 records into 'sbtest2'
Creating a secondary index on 'sbtest2'...
Creating table 'sbtest3'...
Inserting 10000 records into 'sbtest3'
Creating a secondary index on 'sbtest3'...

以下のようなsbtest+連番のテーブルが作成されます。

CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  `pad` char(60) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`)
) ENGINE=InnoDB

オプションについて

  • --mysql-host …MySQLのホスト名を指定(デフォルト localhost)
  • --mysql-port …MySQLのポートを指定(デフォルト 3306)
  • --mysql-db …MySQLのデータベース名を指定(デフォルト sbtest)
  • --mysql-user …MySQLのユーザ名を指定(デフォルト sbtest)
  • --mysql-password …MySQLのパスワードを指定(デフォルト なし)
  • --tables …作成するテーブル数を指定(デフォルト 1)
  • --table_size …作成する1テーブルあたりの行数を指定(デフォルト 10000)

sysbenchを実行する

オプションと一般的なReadとWriteを実行するテスト名oltp_read_writeコマンドrunを指定して実行することで、sysbenchを実行します。今回は同時スレッド数3で10秒間テストするように設定しています。

sysbench  \
    --mysql-host=127.0.0.1 \
    --mysql-port=3306 \
    --mysql-db=sbtest \
    --mysql-user=sbtest \
    --mysql-password=Password1! \
    --tables=3 \
    --table_size=10000 \
    --threads=3 \
    --time=10 \
    oltp_read_write run

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

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


Initializing worker threads...

Threads started!

実行完了後、以下のような結果が出力されます。

SQL statistics:
    queries performed:
        read:                            65758
        write:                           18788
        other:                           9394
        total:                           93940
    transactions:                        4697   (469.47 per sec.)
    queries:                             93940  (9389.40 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          10.0031s
    total number of events:              4697

Latency (ms):
         min:                                    3.58
         avg:                                    6.38
         max:                                   22.83
         95th percentile:                        9.39
         sum:                                29979.39

Threads fairness:
    events (avg/stddev):           1565.6667/163.05
    execution time (avg/stddev):   9.9931/0.00

ここから負荷テストの結果が確認できます。

  • Readクエリ数… read: 65758
  • Writeクエリ数… write: 18788
  • 1秒間あたりのクエリ発行数(QPS)…9389.40 per sec
  • 1秒間あたりのトランザクション実行数(TPS)…469.47 per sec.
  • トータルのクエリ発行数… total: 93940

オプションについて

  • --tables …テストするテーブル数を指定(デフォルト 1)
  • --table_size …テストする1テーブルあたりの行数を指定(デフォルト 10000)
  • --threads …同時実行するスレッド数を指定(デフォルト 1)
  • --time …テストを実行する秒数を指定(デフォルト 10)

テスト名について

sysbenchではいくつかのテスト名(テストシナリオ)が同梱されています。テストシナリオはluaスクリプトで作成されていますluaスクリプト -sysbench⁠。

  • oltp_read_write …一般的なReadとWriteの組み合わせを実行
  • oltp_read_only …Read(SELECT)のみを実行
  • oltp_write_only …Write(INSERT, DELETE, UPDATE)のみを実行
  • oltp_insert …INSERTのみを実行
  • bulk_insert …INSERT INTO .. VALUES (?),(?),(?)のような BULK INSERTのみを実行
  • oltp_delete …PrimaryKeyの等価比較をWHERE条件に指定したDELETEのみを実行
DELETE FROM sbtest1 WHERE id=5032
  • oltp_point_select …PrimaryKeyの等価比較をWHERE条件に指定したSELECTのみを実行
SELECT c FROM sbtest1 WHERE id=4980
  • oltp_update_non_index …PrimaryKeyの等価比較をWHERE条件に指定したUPDATEのみを実行(更新するカラムにインデックスなし)
UPDATE sbtest1 SET c='xxx' WHERE id=5047
  • oltp_update_index …PrimaryKeyの等価比較をWHERE条件に指定したUPDATEのみを実行(更新するカラムにインデックスあり)
UPDATE sbtest1 SET k=k+1 WHERE id=5047
  • select_random_points …インデックス付きのカラムをIN句でWHERE条件に指定したSELECTのみ実行
SELECT id, k, c, pad FROM sbtest1
WHERE k IN (8326, 8347, 8337, 8580, 8330, 8470, 8349, 8337, 8580, 8337)
  • select_random_ranges …インデックス付きのカラムをBETWEEN句でWHERE条件に指定したSELECTのみ実行
SELECT count(k) FROM sbtest1 
WHERE k BETWEEN 5014 AND 5019 OR k BETWEEN 5004 AND 5009 OR k BETWEEN 4995 AND 5000

まとめ

今回はsysbench1.0で負荷テストする方法について紹介しました。sysbenchは簡単にインストールや実行ができて、さまざまテストシナリオも用意されているので、性能比較の際はぜひ使ってみてください。

おすすめ記事

記事・ニュース一覧