tcmu と IO スケジューラ

前回、tcmu でブロックデバイスを作ってみたが、思ったより性能が出なかった。 IO completion が遅いのだと思ってスレッド化してみたが、もとより少々遅くなってしまった。

ところがふと、IO スケジューラを確認してみると、cfq スケジューラを使っていることがわかった。 これを deadline に変えてみると性能がかなり上がった。

手元の 4.13 では NBD はデフォルトで blk-mq スケジューラを利用している。 tcmu も blk-mq でベンチマークを取るのがフェアだと思ったので試してみた。

tcmu を提供する lio も scsi ドライバの一種なので、blk-mq を有効にするにはカーネルの起動パラメータに scsi_mod.use_blk_mq=1 をつける必要がある。

この状態で試すと、以下のようになった。

# of fio threads read write
2 270MB/s 270MB/s
4 276MB/s 276MB/s
8 242MB/s 242MB/s

一方、NBD は以下のようになった。

# of fio threads read write
2 282MB/s 282MB/s
4 237MB/s 237MB/s
8 194MB/s 194MB/s

ということでいい感じに性能が出るようになる上に、fio のスレッド数を増やしても割と性能が安定している。 雑なベンチマークではあるが、ようやく tcmu の良いところが見えた。