前提
AWSのm3.xlarge※を利用して、MySQLは5.6.27で計測を行ってみました。
※共有ハードウェアインスタンスのため厳密さはやや弱いです。
ボリュームタイプはプロビジョンドIOPSです。
計測対象のスケジューラは、cfq、noop、deadlineで、負荷の発生にはmysqlslapを利用しています。
設定はデフォルト値をそのまま利用しています。
ちなみに、上記の構成で構築した時のデフォルトとして利用されるI/Oスケジューラはnoopになっています。
$ cat /sys/block/xvda/queue/scheduler
[noop]
I/Oスケジューラの変更は以下のとおりです。
[]で囲まれているものが現在のスケジューラになります。
$ sudo sh -c "echo deadline > /sys/block/xvda/queue/scheduler"
$ cat /sys/block/xvda/queue/scheduler
noop [deadline]
ファイルシステムはデフォルトのext4を利用しています。
$ df -T
ファイルシス タイプ 1K-ブロック 使用 使用可 使用% マウント位置
/dev/xvda1 ext4 30830568 1718432 29011888 6% /
devtmpfs devtmpfs 7693020 56 7692964 1% /dev
tmpfs tmpfs 7702032 0 7702032 0% /dev/shm
構築(手抜き)
$ sudo yum install -y http://repo.mysql.com/mysql-community-release-el6.rpm
$ sudo yum install -y mysql mysql-devel mysql-server mysql-utilities perl-Data-Dumper
$ sudo service mysqld start
$ mysql --version
mysql Ver 14.14 Distrib 5.6.27, for Linux (x86_64) using EditLine wrapper
計測1(auto-generate-sql-load-type=write)
基本計測設定
並列度は10
実行回数は10
number-of-queriesは10000
クエリのタイプはwrite
time mysqlslap \
--no-defaults \
--host=localhost \
--port=3306 \
--user=root \
--engine=innodb \
--auto-generate-sql \
--auto-generate-sql-load-type=write \
--auto-generate-sql-add-autoincrement \
--number-char-cols=5 \
--number-int-cols=10 \
--number-of-queries=100000 \
--concurrency=10 \
--iterations=10
基本計測結果
計測結果は以下のとおりになりました。
Number of clients running queries: 10
Average number of queries per client: 1000
cfq | noop | deadline | |
---|---|---|---|
Average | 4.426 sec | 4.340 sec | 4.347 sec |
Minimum | 4.011 sec | 4.230 sec | 3.872 sec |
Maximum | 4.574 sec | 4.624 sec | 4.582 sec |
real | 0m46.638s | 0m45.382s | 0m46.070s |
user | 0m0.696s | 0m0.564s | 0m0.588s |
sys | 0m1.168s | 0m1.192s | 0m1.168s |
並列度・number-of-queries変更
number-of-queriesを5倍、並列度を5倍にした場合の結果は以下のとおり。
Number of clients running queries: 50
Average number of queries per client: 1000
cfq | noop | deadline | |
---|---|---|---|
Average | 5.948 sec | 5.980 sec | 5.869 sec |
Minimum | 5.506 sec | 5.286 sec | 5.450 sec |
Maximum | 6.193 sec | 6.201 sec | 6.033 sec |
real | 1m2.732s | 1m2.405s | 1m1.961s |
user | 0m2.596s | 0m2.792s | 0m2.572s |
sys | 0m5.360s | 0m5.112s | 0m5.124s |
engine変更
上記の並列度・number-of-queriesに加えて、engineをmyisamした結果は以下のとおり。
Number of clients running queries: 50
Average number of queries per client: 1000
cfq | noop | deadline | |
---|---|---|---|
Average | 2.541 sec | 2.532 sec | 2.533 sec |
Minimum | 2.491 sec | 2.503 sec | 2.504 sec |
Maximum | 2.558 sec | 2.547 sec | 2.551 sec |
real | 0m25.602s | 0m25.510s | 0m25.525s |
user | 0m3.732s | 0m3.708 | 0m3.992s |
sys | 0m10.384s | 0m0.308s | 0m0.306s |
計測2(auto-generate-sql-load-type=mixed)
基本計測設定
設定の変更はクエリのタイプをmixedに変更したのみ
time mysqlslap \
--no-defaults \
--host=localhost \
--port=3306 \
--user=root \
--engine=innodb \
--auto-generate-sql \
--auto-generate-sql-load-type=mixed \
--auto-generate-sql-add-autoincrement \
--number-char-cols=5 \
--number-int-cols=10 \
--number-of-queries=10000 \
--concurrency=10 \
--iterations=10
基本計測結果
計測結果は以下のとおりになりました。
Number of clients running queries: 10
Average number of queries per client: 1000
cfq | noop | deadline | |
---|---|---|---|
Average | 2.472 sec | 2.505 sec | 2.404 sec |
Minimum | 2.115 sec | 2.091 sec | 2.030 sec |
Maximum | 2.622 sec | 2.736 sec | 2.550 sec |
real | 0m27.417s | 0m27.771s | 0m26.355s |
user | 0m1.616s | 0m1.636s | 0m1.620s |
sys | 0m1.020s | 0m1.040s | 0m1.036s |
並列度・number-of-queries変更
number-of-queriesを5倍、並列度を5倍にした場合の結果は以下のとおり。
Number of clients running queries: 50
Average number of queries per client: 1000
cfq | noop | deadline | |
---|---|---|---|
Average | 3.883 sec | 3.781 sec | 3.815 sec |
Minimum | 3.645 sec | 3.509 sec | 3.299 sec |
Maximum | 4.034 sec | 3.932 sec | 4.157 sec |
real | 0m41.684s | 0m41.348s | 0m40.553s |
user | 0m6.180s | 0m6.084s | 0m6.304s |
sys | 0m5.472s | 0m5.436s | 0m5.452s |
engine変更
上記の並列度・number-of-queriesに加えて、engineをmyisamした結果は以下のとおり。
Number of clients running queries: 50
Average number of queries per client: 1000
cfq | noop | deadline | |
---|---|---|---|
Average | 2.293 sec | 2.292 sec | 2.296 sec |
Minimum | 2.281 sec | 2.269 sec | 2.287 sec |
Maximum | 2.307 sec | 2.311 sec | 2.310 sec |
real | 0m23.100s | 0m23.088s | 0m23.123s |
user | 0m7.472s | 0m7.556s | 0m7.644s |
sys | 0m6.644s | 0m6.504s | 0m6.500s |
考察
innodbでauto-generate-sql-load-type=writeでは、ややdeadlineの方が性能が良いように見えるがそれほど大きな違いは無い。
おまけ
deadlineでMySQL5.7とMySQL5.6の比較をしてみる。
MySQLのバージョンは以下のとおり。
$ mysql --version
mysql Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using EditLine wrapper
上記の計測と同様のnumber-of-queriesを5倍、並列度を5倍にした場合で計測しています。
auto-generate-sql-load-type=write
Number of clients running queries: 50
Average number of queries per client: 1000
MySQL5.6.27 | MySQL5.7.9 | |
---|---|---|
Average | 5.869 sec | 5.914 sec |
Minimum | 5.450 sec | 5.572 sec |
Maximum | 6.033 sec | 6.075 sec |
real | 1m1.961s | 1m2.686s |
user | 0m2.572s | 0m3.300s |
sys | 0m5.124s | 0m5.708s |
auto-generate-sql-load-type=mixed
Number of clients running queries: 50
Average number of queries per client: 1000
MySQL5.6.27 | MySQL5.7.9 | |
---|---|---|
Average | 3.815 sec | 4.100 sec |
Minimum | 3.299 sec | 3.845 sec |
Maximum | 4.157 sec | 4.208 sec |
real | 0m40.553s | 0m44.659s |
user | 0m6.304s | 0m6.096s |
sys | 0m5.452s | 0m6.024s |