MySQL道普請便り

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

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

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は簡単にインストールや実行ができて,さまざまテストシナリオも用意されているので,性能比較の際はぜひ使ってみてください。

著者プロフィール

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

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

Twitter:@keny_lala