前回、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 の良いところが見えた。