MySQL道普請便り

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

この記事を読むのに必要な時間:およそ 3.5 分

今回は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 sbtest@127.0.0.1 IDENTIFIED BY 'Password1!';
mysql> GRANT ALL PRIVILEGES ON sbtest.* TO sbtest@127.0.0.1 ;
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)

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala