I/OスケジューラがMySQLにどの程度影響するのか確認してみる



## 前提

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


```mysqlslap1.sh
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に変更したのみ

```mysqlslap2.sh
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|