KVM ゲストの Windows ディスク性能がホストの Linux のファイルシステムの違いで変わるかテストしてみた

新しい PC を買ったのでファイルシステム毎のIO性能の測定を軽くやってみました。KVM ホストの環境は以下の通り。

KVM Host: Ubuntu 20.04 (Linux 5.4.0-60-generic)
KVM Guest: Windows 10 OS Build 19042.685
CPU: AMD Ryzen 5 3600 6-core
Memory: 128 GB
SSD: WD_BLACK SN850 2TB

EXT4, XFS, ZFS でフォーマットしたディスクを /test にマウントしてそこに qcow2 のイメージをコピーして CrystalDiskMark で簡単に性能を比較してみた。

フォーマットのパラメーターはすべてデフォルト。CrystalDiskMark は 1 GB を一度計測したのみ。

```
------------------------------------------------------------------------------
CrystalDiskMark 8.0.0 x64 (C) 2007-2020 hiyohiyo
                                  Crystal Dew World: https://crystalmark.info/
------------------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes
```

EXT4:

```
[Read]
  SEQ    1MiB (Q=  8, T= 1):   897.182 MB/s [    855.6 IOPS] <  9310.23 us>
  SEQ    1MiB (Q=  1, T= 1):   882.161 MB/s [    841.3 IOPS] <  1183.96 us>
  RND    4KiB (Q= 32, T= 1):    36.359 MB/s [   8876.7 IOPS] <  3472.53 us>
  RND    4KiB (Q=  1, T= 1):    33.073 MB/s [   8074.5 IOPS] <   120.00 us>

[Write]
  SEQ    1MiB (Q=  8, T= 1):   835.608 MB/s [    796.9 IOPS] <  9726.00 us>
  SEQ    1MiB (Q=  1, T= 1):   872.855 MB/s [    832.4 IOPS] <  1196.97 us>
  RND    4KiB (Q= 32, T= 1):    36.836 MB/s [   8993.2 IOPS] <  3518.83 us>
  RND    4KiB (Q=  1, T= 1):    33.367 MB/s [   8146.2 IOPS] <   119.12 us>
```

XFS:

```
[Read]
  SEQ    1MiB (Q=  8, T= 1):   995.806 MB/s [    949.7 IOPS] <  8381.42 us>
  SEQ    1MiB (Q=  1, T= 1):   889.653 MB/s [    848.4 IOPS] <  1174.34 us>
  RND    4KiB (Q= 32, T= 1):    34.602 MB/s [   8447.8 IOPS] <  3659.19 us>
  RND    4KiB (Q=  1, T= 1):    33.413 MB/s [   8157.5 IOPS] <   118.95 us>

[Write]
  SEQ    1MiB (Q=  8, T= 1):   803.229 MB/s [    766.0 IOPS] < 10384.00 us>
  SEQ    1MiB (Q=  1, T= 1):   830.395 MB/s [    791.9 IOPS] <  1258.21 us>
  RND    4KiB (Q= 32, T= 1):    34.978 MB/s [   8539.6 IOPS] <  3620.99 us>
  RND    4KiB (Q=  1, T= 1):    31.885 MB/s [   7784.4 IOPS] <   124.74 us>
```

ZFS:

```
[Read]
  SEQ    1MiB (Q=  8, T= 1):   860.625 MB/s [    820.8 IOPS] <  9697.54 us>
  SEQ    1MiB (Q=  1, T= 1):   611.799 MB/s [    583.5 IOPS] <  1707.94 us>
  RND    4KiB (Q= 32, T= 1):    33.500 MB/s [   8178.7 IOPS] <  3812.68 us>
  RND    4KiB (Q=  1, T= 1):    33.310 MB/s [   8132.3 IOPS] <   119.36 us>

[Write]
  SEQ    1MiB (Q=  8, T= 1):   587.469 MB/s [    560.3 IOPS] < 14216.82 us>
  SEQ    1MiB (Q=  1, T= 1):   533.718 MB/s [    509.0 IOPS] <  1959.07 us>
  RND    4KiB (Q= 32, T= 1):    32.717 MB/s [   7987.5 IOPS] <  3937.58 us>
  RND    4KiB (Q=  1, T= 1):    28.359 MB/s [   6923.6 IOPS] <   140.57 us>
```

シーケンシャル I/O は ZFS が一段落ちる。ランダム I/O は EXT4 が意外と健闘してる。

ついでに以下は KVM ゲストが Ubuntu 20.04 の場合の dd でのテスト結果。/ のファイルシステムは ext4。

4k write: dd if=/dev/zero of=test1 bs=4k count=262144 oflag=direct
1M write: dd if=/dev/zero of=test3 bs=1024k count=1024 oflag=direct

| dd | EXT4 | XFS | ZFS |
|---|---|---|---|
| 4k write | 97.7 MB/s | 106 MB/s | 74.9 MB/s |
| 1M write | 1.7 GB/s | 2.3 GB/s | 1.4 GB/s |

1MBはXFSが速いが実用上は4kの性能の方が重要かもしれない。

ついでに KVM ホストでの性能を fio と dd で比較してみた。fio のパラメーターは以下を参考にさせて頂いた。

[EXT4 vs XFS vs Btrfs vs ZFSをfioでベンチマークを取ってみました。](https://qiita.com/sion_cojp/items/bef955bba3dbf9d603f8)

```
bs=4k
$ fio -rw=write -bs=4k -size=100m -numjobs=40 -runtime=60 -direct=1 -invalidate=1 -ioengine=libaio -iodepth=32 -iodepth_batch=32 -group_reporting -name=seqwrite
$ fio -rw=randwrite -bs=4k -size=100m -numjobs=40 -runtime=60 -direct=1 -invalidate=1 -ioengine=libaio -iodepth=32 -iodepth_batch=32 -group_reporting -name=randwrite
```

```
bs=16k:
$ fio -rw=write -bs=16k -size=100m -numjobs=40 -runtime=60 -direct=1 -invalidate=1 -ioengine=libaio -iodepth=32 -iodepth_batch=32 -group_reporting -name=seqwrite
$ fio -rw=randwrite -bs=16k -size=100m -numjobs=40 -runtime=60 -direct=1 -invalidate=1 -ioengine=libaio -iodepth=32 -iodepth_batch=32 -group_reporting -name=randwrite
```

結果はこちら。

| fio | EXT4 | XFS | ZFS |
|---|---|---|---|
| 4k seq-write | 2987MB/s | 3066MB/s | 2393MB/s |
| 4k rand-write | 2883MB/s | 2675MB/s | 176MB/s |
| 16k seq-write | 2873MB/s | 2907MB/s | 3785MB/s |
| 16k rand-write | 2826MB/s | 2834MB/s | 612MB/s |

ついでにddも計測してみた。

4k write: dd if=/dev/zero of=test1 bs=4k count=262144 oflag=direct
1M write: dd if=/dev/zero of=test3 bs=1024k count=1024 oflag=direct

| dd | EXT4 | XFS | ZFS |
|---|---|---|---|
| 4k write | 304 MB/s | 264 MB/s | 720 MB/s |
| 16k write | 949 MB/s | 832 MB/s | 1.6 GB/s |
| 1M write | 4.0 GB/s | 4.1 GB/s | 2.5 GB/s |

fio は 40 同時 I/O をしているはずなので実際の動作により近いかも。XFS がやや速い。fio の ZFS のランダムI/O性能は2回測定してみたが同じような値だった。ZFS は dd だと 4k/16k が凄く速いのでこれは不思議。

I/O 性能と言いながら KVM ホストでは write しか測ってないのは read だとキャッシュに乗っているらしくメチャクチャな値が出たため。まあ普通はキャッシュが有効になっているはずなので参考程度ということで。

やはり XFS で使おうかな。。