読者です 読者をやめる 読者になる 読者になる

MySQL標準 負荷測定ツール mysqlslap

mysqlslapはMySQL専用の簡易な負荷測定ツールです。MySQL 5.1.4からは標準で提供されているため、これ以降のバージョンがインストールされていれば追加のソフトウェアをインストールすることなく実行できます。またmysqlslap自身はMySQLのクライアントとして動作するため、サーバーのバージョンが5.0以下でも動作します。

# mysqlslap --version
mysqlslap: unknown variable 'default-character-set=utf8'

そのままではunknown variable 'default-character-set=utf8'というエラーになったので、

# mysqlslap --no-defaults --version
mysqlslap  Ver 1.0 Distrib 5.5.8, for Linux (x86_64)

--no-defaultsオプションを付けて設定ファイルに書かれたデフォルトをスキップします。--no-defaultsオプションは先頭に書かないといけないようです。

# mysqlslap
      --no-defaults
      --concurrency=50
      --iterations=1
      --number-int-cols=2
      --number-char-cols=3
      --auto-generate-sql
      --engine=innodb
      --auto-generate-sql-add-autoincrement
      --auto-generate-sql-load-type=key
      --auto-generate-sql-write-number=100000
      --number-of-queries=300000
      --host=192.168.10.19
      --port=3306
      --user=root
      --password=foobar

それでは早速、mysqlslapコマンドを実行してみましょう。リモートホストに接続して、50クライアントから計30万回のSELECT文を実行するベンチマークです。検索するテーブルには事前に10万レコードを格納し、主キーで検索しています。

ここでは読みやすいように改行していますが、実行するときは一行で記述してください。それぞれのオプションの詳細は後ほど説明します。

mysqlslap: Cannot drop database 'mysqlslap' ERROR : Access denied for user 'test'@'%' to database 'mysqlslap'

mysqlslapコマンドを実行するとmysqlslapという名前のデータベースを作成します(すでに存在すれば、いったん削除してから作成します)。このとき、実行ユーザーに必要な権限がないとエラーになります。

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 33.248 seconds
	Minimum number of seconds to run all queries: 33.248 seconds
	Maximum number of seconds to run all queries: 33.248 seconds
	Number of clients running queries: 50
	Average number of queries per client: 6000

実行結果です。30万回のSELECT文÷33.248秒≒1秒あたり9023回のSELECT文を実行できることになります。

# mysqlslap
      ...(略)...
      --host=127.0.0.1
      ...(略)...
Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 31.827 seconds
	Minimum number of seconds to run all queries: 31.827 seconds
	Maximum number of seconds to run all queries: 31.827 seconds
	Number of clients running queries: 50
	Average number of queries per client: 6000

ローカルホストで同じベンチマークを実行してみましたが、実行時間はほとんど変わりませんでした。ローカルネットワークの通信速度はボトルネックではないようです。

# mysqlslap
      ...(略)...
      --auto-generate-sql-write-number=10000
      ...(略)...
Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 7.133 seconds
	Minimum number of seconds to run all queries: 7.133 seconds
	Maximum number of seconds to run all queries: 7.133 seconds
	Number of clients running queries: 50
	Average number of queries per client: 6000

事前に格納するレコードを10万件から1万件に減らすと、実行時間が大幅に短縮されました。