68
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

MySQLクライアント負荷エミュレーション mysqlslap を使う

mysqlslap

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.15 mysqlslap — クライアント負荷エミュレーション

mysqlslapはMySQLサーバのクライアント負荷をエミュレートし、各ステージのタイミングを報告する診断プログラムです。サーバにたいして複数のクライアントがアクセスしているかのように作動します。mysqlslapはMySQL 5.1.4.から提供されています。

MySQLのパフォーマンスを測定する場合に、mysqlslapはとても便利です。MySQLを使用するシステムが増えてきているのか、毎年 mysqlslap を使って測定している気がします。

インストール

MySQLがインストールされていれば、標準でインストールされます(MySQL 5.1.4以上)
MySQLサーバ上で実行する上では、特に問題ないでしょう。しかし、負荷テストを行う場合、APサーバ等リモートからも mysqlslap を実行したい場合があります。
その場合は、別途インストールしましょう。

sudo yum install -y mysql-bench

実行する

mysqlslap \
  --no-defaults \
  --concurrency=50 \
  --iterations=10 \
  --engine=innodb \
  --auto-generate-sql \
  --auto-generate-sql-add-autoincrement \
  --auto-generate-sql-load-type=mixed \
  --auto-generate-sql-write-number=1000 \
  --number-of-queries=100000 \
  --host=localhost \
  --port=3306 \
  --user=root
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 9.451 seconds
    Minimum number of seconds to run all queries: 9.288 seconds
    Maximum number of seconds to run all queries: 9.704 seconds
    Number of clients running queries: 50
    Average number of queries per client: 2000

オプション

ここでは、よく使うオプションのみ紹介します。
すべてのオプションは公式ページで確認してみてください。

オプション 説明
--no-defaults ディフォルト値を読み込まない
--concurrency SELECTステートメントを発行している際、シミュレートするクライアントの数
--iterations 実行するテストの回数
--number-int-cols 使用するINTカラムの数 --auto-generate-sqlが特定されている場合(50くらいが限界)
--number-char-cols 使用するVARCHARカラムの数 --auto-generate-sqlが特定されている場合(50くらいが限界)
--engine テーブル作成の際使用するストレージエンジン(innodb,myisam)
--auto-generate-sql ファイルやコマンドオプションを介して提供されていない場合、SQLステートメントを自動的に生成します
--auto-generate-sql-add-autoincrement auto_incrementのカラムを追加
--auto-generate-sql-load-type クエリのタイプ(mixed
--auto-generate-sql-write-number スレッド毎の INSERT 文の発行数。デフォルトは 100
--number-of-queries 各クライアントをこのクエリの数に限定します。このオプションはMySQL 5.1.5.で追加されました
--host 与えられたホスト上でMySQLサーバに接続します
--port コネクションに使用するTCP/IPポート番号です
--user サーバに接続する際使用するMySQLユーザ名です
--csv カンマによって分けられた値のフォーマットで出力を生成します。出力は名づけられたファイルか、ファイルが提供されていない場合標準出力に向かいます。このオプションはMySQL 5.1.5.で追加されました。
--create-schema テストを実行するスキーマ。このオプションはMySQL 5.1.5.で追加されました
--delimiter ファイルかコマンドオプションを介して提供されたSQLステートメントで使用するデリミタで
--only-print データベースに接続しないでください。mysqlslapは実行されるべきであったことだけプリントします。このオプションはMySQL 5.1.5.で追加されました
--password サーバに接続する際使用するパスワードです。ショートオプションフォーム(-p)を使用した場合、オプションとパスワードの間にスペースを置くことはできません。password値を --passwordあるいは-pオプションをコマンドライン上で省いた場合、ここで求められます
-–no-drop プログラムの終了時、作成したスキーマを削除しません

サンプル

50スレッド 1000行データ 1000クエリ read(テーブルスキャン)

mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=read 

50スレッド 1000行データ 1000クエリ write(テーブルへの挿入)

mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=write 

50スレッド 1000行データ 1000クエリ key(主キー読み取り)

mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=key 

50スレッド 1000行データ 1000クエリ mixed(挿入とテーブルスキャンを半々)

mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=mixed 

50スレッド 1000行データ 1000クエリ update(更新)

mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=update

まとめ

MySQL限定ですが、リード・ライトのベンチマークを測るのに十分使えますね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
68
Help us understand the problem. What are the problem?