今回はsysbench 1.
第26回 SysBenchを使ってMySQLの負荷テストをする で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/
# sysbench --version sysbench 1.0.20
sysbenchの構文
sysbenchの一般的なコマンドライン構文は次のとおりです。
sysbench [オプション]... [テスト名] [コマンド]
- オプション…接続先のMySQLの情報やスレッド数などオプションを指定
- テスト名…同梱されたテストシナリオ、
または自作したテストシナリオを指定 - コマンド…アクションを指定
- prepare …テーブル作成やデータ投入などテスト前の準備を実行
- run …指定したテスト名に基づくテストを実際に実行
- cleanup …一時データを作成するテストでのテスト実行後に一時データを削除
- help …指定したテスト名も基づくhelp情報を表示
sysbenchを実行する前の準備
sysbenchを実行する前に、
mysqlコマンドラインクライアントでログインして、
mysql> CREATE DATABASE sbtest; Query OK, 1 row affected (0.00 sec)
続けて、
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だけなので、
続いて、oltp_
、prepare
を指定して実行することで、
今回は3つのテーブルを作成し、
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_
…作成する1テーブルあたりの行数を指定size (デフォルト 10000)
sysbenchを実行する
オプションと一般的なReadとWriteを実行するテスト名oltp_
、run
を指定して実行することで、
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_
…テストする1テーブルあたりの行数を指定size (デフォルト 10000) --threads
…同時実行するスレッド数を指定(デフォルト 1) --time
…テストを実行する秒数を指定(デフォルト 10)
テスト名について
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.