スマートスタイル TECH BLOG

MySQLのベンチマークツール: sysbench の紹介

MySQLのベンチマークツールはいくつかありますが、今回は弊社でもよく利用している sysbench について紹介したいと思います。

sysbench とは?

sysbench はよくデータベースのベンチマークとして使用されますが、ファイルシステムやCPU、メモリなどシステムのベンチマークを行うこともできます。
また、Luaスクリプトで独自のベンチマークシナリオを作成することも可能です。
(弊社記事: sysbench 1.0 でオリジナルのベンチマークシナリオを作成する

デフォルトのベンチマークシナリオでは比較的処理としてはシンプルなため、データベースの基本性能を測るために使用されることが多い印象です。

参考 : akopytov/sysbench: Scriptable database and system performance benchmark

インストール

インストールは下記の手順のみなので、比較的簡単に使い始めることができます。

基本的な使い方

sysbench は以下のようにオプションやテストシナリオ、コマンドを指定して実行します

実行例としては以下のようになります。

コマンド

MySQL のベンチマークを実行する場合は、以下のようなコマンドがあります。

コマンド名 説明
prepare テスト用テーブルを作成してテスト用データを作成
run ベンチマークシナリオを実行
cleanup テスト用テーブルを削除
help ベンチマークシナリオのヘルプを表示

ベンチマークシナリオ

デフォルトで使用できるベンチマークシナリオはいくつかありますが、よく使われるのは以下になります。


ベンチマークシナリオ名 説明
oltp_read_write 読み込み/書き込みの OLTP 処理
oltp_read_only 読み込みのみの OLTP 処理
oltp_write_only 書き込みのみの OLTP 処理

それ以外のベンチマークシナリオは以下のコードを参考にしてください。
sysbench/src/lua at master · akopytov/sysbench · GitHub

オプション

オプションについてはグローバルなオプションと、テストシナリオに紐づくオプションの2種類があります。
オプションは多岐にわたるため、ここではよく使われるオプションを紹介します。

グローバルオプション

オプション名 説明 デフォルト値
threads 同時実行するスレッド数。MySQLでは同時接続数 1
events 実行する合計イベント数 0(無制限)
time ベンチマークの実行時間。秒数で指定 10秒

MySQLのベンチマークの場合は上記オプションでは「mysql」を指定します。

上記はMySQLの接続設定のオプションです。
接続先設定はカンマ区切りで複数指定することができます。
ただし、書き込みはこのホスト、読み込みはこのホストというように接続先の振り分けができないので、通常のレプリケーション構成の場合、更新処理だけをマスターサーバーに向けて、参照処理をスレーブサーバーに向けるようなことができません。

「mysql-ignore-errors」については、ベンチマーク実行中に発生したエラーを無視する設定です。エラーコードもしくは”all”を指定します。、カンマ区切りで複数指定することも可能です。
デフォルトでは以下のエラーコードが設定されています

エラーコード 説明
1213 デッドロック
1020 表 ‘%s’ の最後の読み取り時点から、レコードが変化しました
1205 ロック待ちがタイムアウトしました。トランザクションを再試行してください

参考:
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.19.5 InnoDB のエラーコード
MySQL :: MySQL 5.6 リファレンスマニュアル :: B.3 サーバーのエラーコードおよびメッセージ

シナリオ(oltp_read_write)のオプション

各ベンチマークシナリオのオプションは下記のように「help」コマンドを実行することでオプションが表示されます。

よく使うオプションとしては下記の2つです

オプション名 説明 デフォルト値
tables テストテーブルの数を指定 1
table_size 1つのテストテーブルに挿入されるテストデータのレコード数 10000

それ以外にも以下のようなオプションを指定することで、作られるテストテーブルの設定が変わります。

--secondary=off (デフォルト)

idカラムをプライマリーキーとしてテストテーブルを作成します。

--secondary=on

id カラムをプライマリーキー指定せずにセカンダリインデックスとしてテストテーブルを作成します。

--create_secondary=off

セカンダリインテックスを作成しないでテストテーブルを作成します。

インデックスの有無による性能差や、プライマリインデックスとセカンダリインデックスの性能差を見るために使うと良いかと思います。

oltp_read_write ベンチマークシナリオで実行されるクエリ

MySQLの「long_query_time」を0秒に指定して、ベンチマーク実行中に発行されるクエリを取得してみました。
種別によるクエリの割合は以下の通りです。

種別 割合
SELECT 82%
UPDATE 12%
INSERT 6%

参照クエリーが全体の8割以上を占めています。

個別のクエリの実行回数と実行例です。シンプルなクエリのみで構成されています。

実行回数 クエリ
316450 SELECT c FROM sbtest3 WHERE id=5011
31645 SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN 5025 AND 5124 ORDER BY c
31645 SELECT c FROM sbtest4 WHERE id BETWEEN 4981 AND 5080 ORDER BY c
31645 SELECT c FROM sbtest3 WHERE id BETWEEN 4232 AND 4331
31645 UPDATE sbtest5 SET k=k+1 WHERE id=4996
31645 SELECT SUM(k) FROM sbtest4 WHERE id BETWEEN 4984 AND 5083
31645 UPDATE sbtest4 SET c=’33807164901-98674870960-30739544988-00494030323-58074804184-54497108430-96465631765-54975371777-86989435703-06577856858′ WHERE id=5023
31645 INSERT INTO sbtest5 (id, k, c, pad) VALUES (4498, 5023, ‘81672753779-75750369178-87933664834-21280372467-27872254074-27478851448-54563374845-76108710036-90957389581-17596638045’, ‘40711790231-95597061593-77660822141-56395044528-86019133058’)

まとめ

今回はMySQLのベンチマークとしてよく使われている sysbench について基本的な使い方から、実行されているクエリーについて紹介させていただきました。MySQLで使えるベンチマークツールはsysbench以外にもあるので機会があればそれらについても紹介させていただければと思います。


MySQL

 

Return Top