SSDのIOスケジューラに対するちょっとした誤解

IO傾向によるスケジューラのとの相性

SSDのIOスケジューラは常にnoopにすべきか?

  • 実施ハードウェア
[comicsong@comicsong fio]$ sudo /usr/sbin/smartctl -i /dev/sda | grep "Device Model:"
Device Model:     M4-CT256M4SSD2
[comicsong@comicsong fio]$ grep "model name" /proc/cpuinfo | uniq -c
      4 model name      : Intel(R) Core(TM) i3-2100T CPU @ 2.50GHz
[comicsong@comicsong fio]$ sudo dmidecode -s baseboard-product-name
H77M-ITX
[comicsong@comicsong fio]$ free -mw  --si
              total        used        free      shared     buffers       cache   available
Mem:           3580         189        2982           8           1         407        3171
Swap:           524         209         314
[comicsong@comicsong fio]$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[comicsong@comicsong ~]$ mount | grep sda
/dev/sda1 on /mnt/mint type ext4 (rw,noatime,discard,data=ordered)
[comicsong@comicsong fio]$ pwd
/mnt/mint/var/tmp/fio
[comicsong@comicsong fio]$ rpm -q fio
fio-2.2.8-2.el7.x86_64
  • fio jobファイル
[global]
directory=/mnt/mint/var/tmp/fio/tmp/
size=500m
numjobs=8
iodepth=4
time_based
runtime=10
overwrite=1
ioengine=libaio
bs=4k
group_reporting

[test]
  • テストコマンド
for SCHEDULER in cfq deadline noop
  do for TEST in read write randread randwrite rw
    do sudo fio iotest.ini -rw ${TEST} -ioscheduler ${SCHEDULER} -description ${SCHEDULER}_${TEST}  | grep -A1 "Description "
  done
  sudo cat /sys/block/sda/queue/scheduler
  echo "---------------"
done
  • 結果
  Description  : [cfq_read]
  read : io=2456.1MB, bw=251261KB/s, iops=62815, runt= 10013msec
  Description  : [cfq_write]
  write: io=2599.8MB, bw=265632KB/s, iops=66407, runt= 10022msec
  Description  : [cfq_randread]
  read : io=1260.4MB, bw=128234KB/s, iops=32058, runt= 10064msec
  Description  : [cfq_randwrite]
  write: io=1831.7MB, bw=186167KB/s, iops=46541, runt= 10075msec
  Description  : [cfq_rw]
  read : io=983836KB, bw=98040KB/s, iops=24510, runt= 10035msec
noop deadline [cfq]
---------------
  Description  : [deadline_read]
  read : io=2303.1MB, bw=235548KB/s, iops=58886, runt= 10016msec
  Description  : [deadline_write]
  write: io=2605.6MB, bw=266193KB/s, iops=66548, runt= 10023msec
  Description  : [deadline_randread]
  read : io=1127.9MB, bw=115482KB/s, iops=28870, runt= 10001msec
  Description  : [deadline_randwrite]
  write: io=1891.4MB, bw=192926KB/s, iops=48231, runt= 10039msec
  Description  : [deadline_rw]
  read : io=837996KB, bw=83424KB/s, iops=20856, runt= 10045msec
noop [deadline] cfq
---------------
  Description  : [noop_read]
  read : io=2261.4MB, bw=231239KB/s, iops=57809, runt= 10014msec
  Description  : [noop_write]
  write: io=2604.3MB, bw=266090KB/s, iops=66522, runt= 10022msec
  Description  : [noop_randread]
  read : io=1124.7MB, bw=115147KB/s, iops=28786, runt= 10001msec
  Description  : [noop_randwrite]
  write: io=1889.5MB, bw=192629KB/s, iops=48157, runt= 10042msec
  Description  : [noop_rw]
  read : io=764948KB, bw=74433KB/s, iops=18608, runt= 10277msec
[noop] deadline cfq
---------------
  • まとめ
    • ベンチマークの実行時間、試行回数が少ないなど確度は低いから値は参考程度に
      • 「この環境の M4-CT256M4SSD2 でこんなテスト条件の場合」ということを忘れない
    • noopはwrite系は早いがreadでは劣り、またwriteもシーケンシャルならほぼ差はない
    • 特にシーケンシャルのioミックスは全スケジューラ中最もIOPS値が低かった

SSD=noop」のような紐付けはしない。IO傾向を把握し最適なスケジューラを選択すべき