Comparing disk speed of various disks and VMs in Azure

For an estimation and planned move of some resources to Azure, I had to do comparison of various VMs and disks. It’s not meant to be exhaustive with all possibilities. Just some numbers one can compare.

The move is considered mostly because the VMs can be placed closer to the customer compared to on-premise datacenter, in case you’d like to ask.

Setup

The measurement was done using CrystalDiskMark version 7.0.0 x64 running as an Administrator. Default profile was used with this test: 4 GiB (x5) [Interval: 5 sec] <DefaultAffinity=DISABLED> . CrystalDiskMark was selected because on-prem machines had it already installed.

I tested Standard D8s v3 (8 vcpus, 32 GiB memory), Standard L8s_v2 (8 vcpus, 64 GiB memory) and Standard L8s (8 vcpus, 64 GiB memory) all running Windows Server 2019 Datacenter from the default image in Azure with Premium SSDs (always fresh VM). P20 (D8sv3 only), P30, P40 (D8sv3 only), OS disk (because why not), Temp disk and NVMe disk (only available in L8sv2) were tested. No further VM modification was done except for attaching disks and turning on read caching where possible.

Read

Read (MB/s) Sequential 1MiB (Q=8, T=1) Sequential 1MiB (Q=1, T=1) Random 4KiB (Q=32, T=16) Random 4KiB (Q=1, T=1) L8s – P30 disk (no caching) 203.859 78.228 20.910 0.994 L8sv2 – P30 disk (no caching) 167.754 66.484 21.042 0.911 D8sv3 – P30 disk (R caching) 135.068 135.060 67.520 27.121 D8sv3 – P20 disk (R caching) 135.067 135.069 67.516 26.741 D8sv3 – P40 disk (R caching) 135.065 135.059 67.513 26.760 L8sv2 – NVMe disk 1837.758 1840.725 355.024 48.016 L8s – OS disk (RW caching) 417.126 417.154 169.536 52.680 L8sv2 – OS disk (RW caching) 89.965 89.961 17.703 17.702 D8sv3 – OS disk (RW caching) 140.113 140.090 68.338 27.494 L8s – Temp disk 412.129 412.084 168.776 17.344 L8sv2 – Temp disk 84.724 84.736 16.879 16.496 D8sv3 – Temp disk 135.059 135.073 67.519 16.566

Read (IOPS) Sequential 1MiB (Q=8, T=1) Sequential 1MiB (Q=1, T=1) Random 4KiB (Q=32, T=16) Random 4KiB (Q=1, T=1) L8s – P30 disk (no caching) 194.4 74.6 5105.0 242.7 L8sv2 – P30 disk (no caching) 160.0 63.4 5137.2 222.4 D8sv3 – P30 disk (R caching) 128.8 128.8 16484.4 6621.3 D8sv3 – P20 disk (R caching) 128.8 128.8 16483.4 6528.6 D8sv3 – P40 disk (R caching) 128.8 128.8 16482.7 6533.2 L8sv2 – NVMe disk 1752.6 1755.5 86675.8 11722.7 L8s – OS disk (RW caching) 397.8 397.8 41390.6 12861.3 L8sv2 – OS disk (RW caching) 85.8 85.8 4322.0 4321.8 D8sv3 – OS disk (RW caching) 133.6 133.6 16684.1 6712.4 L8s – Temp disk 393.0 393.0 41205.1 4234.4 L8sv2 – Temp disk 80.8 80.8 4120.8 4027.3 D8sv3 – Temp disk 128.8 128.8 16484.1 4044.4

Read (us) Sequential 1MiB (Q=8, T=1) Sequential 1MiB (Q=1, T=1) Random 4KiB (Q=32, T=16) Random 4KiB (Q=1, T=1) L8s – P30 disk (no caching) 40817.78 13385.39 98649.36 4115.48 L8sv2 – P30 disk (no caching) 49612.29 15723.51 98600.99 4477.90 D8sv3 – P30 disk (R caching) 61571.46 7712.98 30938.71 150.24 D8sv3 – P20 disk (R caching) 61626.01 7690.78 30897.07 152.44 D8sv3 – P40 disk (R caching) 61461.37 7719.54 30853.62 152.34 L8sv2 – NVMe disk 3990.00 569.32 3883.10 85.12 L8s – OS disk (RW caching) 20000.46 2498.25 12340.33 77.16 L8sv2 – OS disk (RW caching) 92281.99 11597.10 116845.03 230.29 D8sv3 – OS disk (RW caching) 59395.36 7428.99 30443.21 148.17 L8s – Temp disk 20200.87 2534.45 12374.76 235.33 L8sv2 – Temp disk 97826.63 12307.93 122198.56 247.96 D8sv3 – Temp disk 61528.75 7709.53 30871.49 246.41

As expected, the NVMe disk is a clear winner with impressive numbers. Disks P20, P30 and P40 have similar performance in D8sv3 no matter the sequential vs random IO or other parameters. I suppose it’s the limit of D8sv3 VM itself and hence bigger/faster disks do not make sense unless you also get bigger VM.

Write

Write (MB/s) Sequential 1MiB (Q=8, T=1) Sequential 1MiB (Q=1, T=1) Random 4KiB (Q=32, T=16) Random 4KiB (Q=1, T=1) L8s – P30 disk (no caching) 204.068 40.052 21.093 1.082 L8sv2 – P30 disk (no caching) 167.793 43.201 20.993 1.068 D8sv3 – P30 disk (R caching) 133.368 45.303 21.093 1.392 D8sv3 – P20 disk (R caching) 133.166 44.668 9.704 1.386 D8sv3 – P40 disk (R caching) 132.965 46.768 31.476 1.410 L8sv2 – NVMe disk 1300.216 1303.379 1206.941 202.007 L8s – OS disk (RW caching) 417.296 413.544 169.629 59.352 L8sv2 – OS disk (RW caching) 89.971 89.968 9.357 11.926 D8sv3 – OS disk (RW caching) 140.084 140.092 28.910 42.610 L8s – Temp disk 412.075 412.138 168.797 36.305 L8sv2 – Temp disk 84.729 84.730 16.878 16.772 D8sv3 – Temp disk 135.069 135.069 67.517 27.387

Write (IOPS) Sequential 1MiB (Q=8, T=1) Sequential 1MiB (Q=1, T=1) Random 4KiB (Q=32, T=16) Random 4KiB (Q=1, T=1) L8s – P30 disk (no caching) 194.6 38.2 5149.7 264.2 L8sv2 – P30 disk (no caching) 160.0 41.2 5125.2 260.7 D8sv3 – P30 disk (R caching) 127.2 43.2 5149.7 339.8 D8sv3 – P20 disk (R caching) 127.0 42.6 2369.1 338.4 D8sv3 – P40 disk (R caching) 126.8 44.6 7684.6 344.2 L8sv2 – NVMe disk 1240.0 1243.0 294663.3 49318.1 L8s – OS disk (RW caching) 398.0 394.4 41413.3 14490.2 L8sv2 – OS disk (RW caching) 85.8 85.8 2284.4 2911.6 D8sv3 – OS disk (RW caching) 133.6 133.6 7058.1 10402.8 L8s – Temp disk 393.0 393.0 41210.2 8863.5 L8sv2 – Temp disk 80.8 80.8 4120.6 4094.7 D8sv3 – Temp disk 128.8 128.8 16483.6 6686.3

Write (us) Sequential 1MiB (Q=8, T=1) Sequential 1MiB (Q=1, T=1) Random 4KiB (Q=32, T=16) Random 4KiB (Q=1, T=1) L8s – P30 disk (no caching) 40799.23 26029.26 98372.25 3777.46 L8sv2 – P30 disk (no caching) 49617.07 24181.19 98992.59 3829.51 D8sv3 – P30 disk (R caching) 62353.77 23019.10 98263.99 2936.44 D8sv3 – P20 disk (R caching) 62433.34 23427.75 204262.98 2949.40 D8sv3 – P40 disk (R caching) 62371.02 22387.84 66148.71 2900.10 L8sv2 – NVMe disk 5623.68 803.43 1577.99 20.11 L8s – OS disk (RW caching) 19946.69 2512.65 12277.98 68.47 L8sv2 – OS disk (RW caching) 91918.53 11602.18 116659.01 234.15 D8sv3 – OS disk (RW caching) 59136.99 7424.76 29183.79 95.48 L8s – Temp disk 20195.58 2532.72 12364.83 112.18 L8sv2 – Temp disk 97673.81 12279.27 122200.62 242.85 D8sv3 – Temp disk 61271.61 7692.77 30760.47 148.73

Same story, first place for NVMe. Who would have thought, right? 😃 Now at least for the Random 4KiB (Q=32, T=16) (which matches the best the workload the machines are doing now) workload the P20, P30 and P40 in D8sv3 show different performance and match the expectation of P20 < P30 < P40.

Summary

Different workloads have different needs, so measure yourself. Frankly switching between VMs isn’t that difficult, so you can change your mind later if needed. And if you relies on best IO subsystem possible, get the Lsv2 and use the NVMe disk available (and also make sure you understand it’s an ephemeral disk).