2016年7月24日日曜日

IOスケジューラの変更でどのくらいパフォーマンス変わるの?

SSDならCFQよりdeadline schedulerのほうが速いらしい。が、どのくらい効くんだ?

切り替える方法は簡単。

# echo (cfq|deadline|noop) > /sys/block/sda/queue/scheduler

というわけで試してみた。

環境は以下の通り
  • Core i5-6200U
  • Memory 8GB
  • SSD MZHPV256HDGL(PCI-Express AHCI 256GB)
    • ……有り体に言えばVAIO S11である。
  • Arch Linux
  • Kernel 4.6.4(CPU FamilyをCore2に、HZを1000にしてある)
  • ファイルシステムはBtrfs(rw,relatime,compress=lzo,ssd,discard,space_cache)
邪魔が入らないようランレベル2で起動し、fioを用いてCFQ/Deadline/noopそれぞれに対して同じ項目を試すことにする。とはいっても1つのSSDからOSを起動し、fioを呼び出し、fioのテストを読み書きしているので理想的な状態でのベンチマークとは言えない。

fioのテスト設定は以下の通り。
[seqread]
rw=read
size=1G
ioengine=libaio
directory=~/Documents/fio/
loops=10

[seqwrite]
rw=write
size=1G
ioengine=libaio
directory=~/Documents/fio/
loops=10

[randread]
rw=randread
size=1G
ioengine=libaio
directory=~/Documents/fio/
loops=10

[randwrite]
rw=randwrite
size=1G
ioengine=libaio
directory=~/Documents/fio/
loops=10

[randrw]
rw=randrw
size=1G
ioengine=libaio
directory=~/Documents/fio/
loops=10
5種類。誤差を減らすためそれぞれ10回テストを行うようにしておいた。

結果は以下の通り。

bandwidth(KB/s) cfq deadline noop
seqread 1181286.4 982917 913314
seqwrite 215654 244150 201921
randread 33419 35230 33987
randwrite 118196 129548 112805
randrw_read 21428 23193 21803
randrw_write 21379 23139 21753

iops cfq deadline noop
seqread 295396 245729 228328
seqwrite 53913 61037 50480
randread 8354 8807 8496
randwrite 29549 32387 28201
randrw_read 5357 5798 5450
randrw_write 5344 5784 5438

シーケンシャルリードがあまりにも速く、そのままグラフ化すると他の項目が潰れるのでシーケンシャルとランダムで分割してグラフにしてある。


本環境では
  • シーケンシャルリードに限ってはCFQが最も速い
  • それ以外のテスト項目についてはDeadlineがCFQより1割ほど速い
といえそうである。
他の環境での検証が待たれる。