summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--measurements/fio_results.csv5
-rw-r--r--measurements/loop_fio_randread_4k_compressed_direct.log30
-rw-r--r--measurements/loop_fio_randread_4k_uncompressed_direct.log29
-rw-r--r--measurements/loop_fio_randread_512_compressed_direct.log31
-rw-r--r--measurements/loop_fio_randread_512_uncompressed_direct.log30
-rw-r--r--measurements/loop_fio_read_4k_compressed_direct.log30
-rw-r--r--measurements/loop_fio_read_4k_uncompressed_direct.log29
-rw-r--r--measurements/loop_fio_read_512_compressed_direct.log31
-rw-r--r--measurements/loop_fio_read_512_uncompressed_direct.log29
-rw-r--r--measurements/measurements.txt23
-rw-r--r--measurements/nbd_fio_randread_4k_compressed_direct.log30
-rw-r--r--measurements/nbd_fio_randread_4k_uncompressed_direct.log29
-rw-r--r--measurements/nbd_fio_randread_512_compressed_direct.log31
-rw-r--r--measurements/nbd_fio_randread_512_uncompressed_direct.log29
-rw-r--r--measurements/nbd_fio_read_4k_compressed_direct.log30
-rw-r--r--measurements/nbd_fio_read_4k_uncompressed_direct.log29
-rw-r--r--measurements/nbd_fio_read_512_compressed_direct.log30
-rw-r--r--measurements/nbd_fio_read_512_uncompressed_direct.log29
-rw-r--r--presentation/images/file_fmt_subsystem_integration.tex32
-rw-r--r--presentation/images/linux_storage_stack.tex64
-rw-r--r--presentation/images/qcow2_addressing.tex63
-rw-r--r--presentation/images/qcow2_performance.tex36
-rw-r--r--presentation/images/qcow2_reading.tex55
-rw-r--r--presentation/images/qcow2_structure.tex21
-rw-r--r--presentation/presentation.pdfbin0 -> 111258 bytes
-rw-r--r--presentation/presentation.tex229
26 files changed, 1004 insertions, 0 deletions
diff --git a/measurements/fio_results.csv b/measurements/fio_results.csv
new file mode 100644
index 0000000..2596d16
--- /dev/null
+++ b/measurements/fio_results.csv
@@ -0,0 +1,5 @@
+Type;Factor_512;Factor_4096
+Sequential read\\\footnotesize(uncompressed QCOW2);3.7984496124031;3.8241308793456
+Random read\\\footnotesize(uncompressed QCOW2);3.75409836065574;3.67903930131004
+Sequential read\\\footnotesize(compressed QCOW2);1.86533793279673;2.01401050788091
+Random read\\\footnotesize(compressed QCOW2);1.90188679245283;1.904
diff --git a/measurements/loop_fio_randread_4k_compressed_direct.log b/measurements/loop_fio_randread_4k_compressed_direct.log
new file mode 100644
index 0000000..07af4cd
--- /dev/null
+++ b/measurements/loop_fio_randread_4k_compressed_direct.log
@@ -0,0 +1,30 @@
+loop_fio_randread_4k_compressed_direct: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_randread_4k_compressed_direct: (groupid=0, jobs=1): err= 0: pid=1694: Fri Aug 30 10:29:05 2019
+ read: IOPS=24.4k, BW=95.2MiB/s (99.8MB/s)(622MiB/6537msec)
+ clat (usec): min=8, max=642, avg=39.56, stdev=79.68
+ lat (usec): min=8, max=643, avg=39.69, stdev=79.68
+ clat percentiles (usec):
+ | 1.00th=[ 10], 5.00th=[ 11], 10.00th=[ 11], 20.00th=[ 13],
+ | 30.00th=[ 14], 40.00th=[ 15], 50.00th=[ 15], 60.00th=[ 16],
+ | 70.00th=[ 17], 80.00th=[ 18], 90.00th=[ 22], 95.00th=[ 281],
+ | 99.00th=[ 314], 99.50th=[ 351], 99.90th=[ 437], 99.95th=[ 457],
+ | 99.99th=[ 537]
+ bw ( KiB/s): min=93528, max=100064, per=99.85%, avg=97286.08, stdev=2021.76, samples=13
+ iops : min=23382, max=25016, avg=24321.46, stdev=505.41, samples=13
+ lat (usec) : 10=1.95%, 20=87.18%, 50=1.68%, 100=0.02%, 250=0.39%
+ lat (usec) : 500=8.76%, 750=0.02%
+ cpu : usr=6.04%, sys=17.82%, ctx=318466, majf=0, minf=11
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=95.2MiB/s (99.8MB/s), 95.2MiB/s-95.2MiB/s (99.8MB/s-99.8MB/s), io=622MiB (652MB), run=6537-6537msec
+
+Disk stats (read/write):
+ loop1: ios=154400/0, merge=0/0, ticks=5273/0, in_queue=0, util=98.52%
diff --git a/measurements/loop_fio_randread_4k_uncompressed_direct.log b/measurements/loop_fio_randread_4k_uncompressed_direct.log
new file mode 100644
index 0000000..c8d8972
--- /dev/null
+++ b/measurements/loop_fio_randread_4k_uncompressed_direct.log
@@ -0,0 +1,29 @@
+loop_fio_randread_4k_uncompressed_direct: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_randread_4k_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=1669: Fri Aug 30 10:28:12 2019
+ read: IOPS=82.2k, BW=321MiB/s (337MB/s)(622MiB/1937msec)
+ clat (usec): min=8, max=105, avg=11.22, stdev= 2.95
+ lat (usec): min=8, max=105, avg=11.32, stdev= 2.98
+ clat percentiles (nsec):
+ | 1.00th=[ 8640], 5.00th=[ 9280], 10.00th=[ 9280], 20.00th=[ 9408],
+ | 30.00th=[ 9408], 40.00th=[ 9408], 50.00th=[ 9536], 60.00th=[ 9792],
+ | 70.00th=[11712], 80.00th=[13888], 90.00th=[15424], 95.00th=[16064],
+ | 99.00th=[20352], 99.50th=[22400], 99.90th=[32128], 99.95th=[33024],
+ | 99.99th=[43776]
+ bw ( KiB/s): min=286816, max=334880, per=96.71%, avg=318010.67, stdev=27045.30, samples=3
+ iops : min=71704, max=83720, avg=79502.67, stdev=6761.33, samples=3
+ lat (usec) : 10=62.53%, 20=36.21%, 50=1.25%, 100=0.01%, 250=0.01%
+ cpu : usr=15.13%, sys=38.64%, ctx=318453, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=321MiB/s (337MB/s), 321MiB/s-321MiB/s (337MB/s-337MB/s), io=622MiB (652MB), run=1937-1937msec
+
+Disk stats (read/write):
+ loop0: ios=154447/0, merge=0/0, ticks=1192/0, in_queue=0, util=95.18%
diff --git a/measurements/loop_fio_randread_512_compressed_direct.log b/measurements/loop_fio_randread_512_compressed_direct.log
new file mode 100644
index 0000000..a8191cb
--- /dev/null
+++ b/measurements/loop_fio_randread_512_compressed_direct.log
@@ -0,0 +1,31 @@
+loop_fio_randread_512_compressed_direct: (g=0): rw=randread, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_randread_512_compressed_direct: (groupid=0, jobs=1): err= 0: pid=1619: Fri Aug 30 10:26:52 2019
+ read: IOPS=24.6k, BW=12.0MiB/s (12.6MB/s)(622MiB/51781msec)
+ clat (usec): min=8, max=1576, avg=39.18, stdev=80.15
+ lat (usec): min=8, max=1576, avg=39.31, stdev=80.16
+ clat percentiles (usec):
+ | 1.00th=[ 10], 5.00th=[ 11], 10.00th=[ 11], 20.00th=[ 13],
+ | 30.00th=[ 14], 40.00th=[ 14], 50.00th=[ 15], 60.00th=[ 15],
+ | 70.00th=[ 16], 80.00th=[ 17], 90.00th=[ 22], 95.00th=[ 281],
+ | 99.00th=[ 314], 99.50th=[ 359], 99.90th=[ 441], 99.95th=[ 461],
+ | 99.99th=[ 523]
+ bw ( KiB/s): min=11701, max=13010, per=99.90%, avg=12287.41, stdev=272.21, samples=103
+ iops : min=23402, max=26020, avg=24574.83, stdev=544.44, samples=103
+ lat (usec) : 10=4.90%, 20=84.56%, 50=1.35%, 100=0.02%, 250=0.39%
+ lat (usec) : 500=8.77%, 750=0.02%
+ lat (msec) : 2=0.01%
+ cpu : usr=6.77%, sys=17.11%, ctx=2547672, majf=0, minf=13
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=12.0MiB/s (12.6MB/s), 12.0MiB/s-12.0MiB/s (12.6MB/s-12.6MB/s), io=622MiB (652MB), run=51781-51781msec
+
+Disk stats (read/write):
+ loop1: ios=1269795/0, merge=0/0, ticks=42624/0, in_queue=0, util=99.85%
diff --git a/measurements/loop_fio_randread_512_uncompressed_direct.log b/measurements/loop_fio_randread_512_uncompressed_direct.log
new file mode 100644
index 0000000..364cb1d
--- /dev/null
+++ b/measurements/loop_fio_randread_512_uncompressed_direct.log
@@ -0,0 +1,30 @@
+loop_fio_randread_512_uncompressed_direct: (g=0): rw=randread, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_randread_512_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=1637: Fri Aug 30 10:27:37 2019
+ read: IOPS=89.5k, BW=43.7MiB/s (45.8MB/s)(622MiB/14232msec)
+ clat (usec): min=8, max=661, avg=10.30, stdev= 2.48
+ lat (usec): min=8, max=661, avg=10.39, stdev= 2.50
+ clat percentiles (nsec):
+ | 1.00th=[ 8512], 5.00th=[ 8896], 10.00th=[ 9024], 20.00th=[ 9024],
+ | 30.00th=[ 9024], 40.00th=[ 9152], 50.00th=[ 9152], 60.00th=[ 9152],
+ | 70.00th=[ 9280], 80.00th=[12480], 90.00th=[14912], 95.00th=[15552],
+ | 99.00th=[16768], 99.50th=[18304], 99.90th=[21632], 99.95th=[23680],
+ | 99.99th=[42240]
+ bw ( KiB/s): min=32332, max=50232, per=99.95%, avg=44729.79, stdev=4749.15, samples=28
+ iops : min=64664, max=100464, avg=89459.64, stdev=9498.30, samples=28
+ lat (usec) : 10=77.42%, 20=22.37%, 50=0.20%, 100=0.01%, 250=0.01%
+ lat (usec) : 750=0.01%
+ cpu : usr=14.19%, sys=39.85%, ctx=2547683, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=43.7MiB/s (45.8MB/s), 43.7MiB/s-43.7MiB/s (45.8MB/s-45.8MB/s), io=622MiB (652MB), run=14232-14232msec
+
+Disk stats (read/write):
+ loop0: ios=1264491/0, merge=0/0, ticks=9047/0, in_queue=0, util=99.35%
diff --git a/measurements/loop_fio_read_4k_compressed_direct.log b/measurements/loop_fio_read_4k_compressed_direct.log
new file mode 100644
index 0000000..0c4bb98
--- /dev/null
+++ b/measurements/loop_fio_read_4k_compressed_direct.log
@@ -0,0 +1,30 @@
+loop_fio_read_4k_compressed_direct: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_read_4k_compressed_direct: (groupid=0, jobs=1): err= 0: pid=3170: Thu Aug 29 22:29:34 2019
+ read: IOPS=28.0k, BW=110MiB/s (115MB/s)(622MiB/5680msec)
+ clat (usec): min=8, max=564, avg=34.78, stdev=74.98
+ lat (usec): min=8, max=564, avg=34.89, stdev=75.00
+ clat percentiles (usec):
+ | 1.00th=[ 9], 5.00th=[ 10], 10.00th=[ 10], 20.00th=[ 10],
+ | 30.00th=[ 10], 40.00th=[ 10], 50.00th=[ 10], 60.00th=[ 13],
+ | 70.00th=[ 14], 80.00th=[ 16], 90.00th=[ 18], 95.00th=[ 260],
+ | 99.00th=[ 293], 99.50th=[ 343], 99.90th=[ 404], 99.95th=[ 412],
+ | 99.99th=[ 457]
+ bw ( KiB/s): min=43424, max=201032, per=100.00%, avg=115161.45, stdev=60769.32, samples=11
+ iops : min=10856, max=50258, avg=28790.36, stdev=15192.33, samples=11
+ lat (usec) : 10=55.13%, 20=35.40%, 50=0.28%, 100=0.01%, 250=0.46%
+ lat (usec) : 500=8.71%, 750=0.01%
+ cpu : usr=6.15%, sys=13.35%, ctx=318457, majf=0, minf=14
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=110MiB/s (115MB/s), 110MiB/s-110MiB/s (115MB/s-115MB/s), io=622MiB (652MB), run=5680-5680msec
+
+Disk stats (read/write):
+ loop1: ios=158769/0, merge=0/0, ticks=4868/0, in_queue=0, util=98.34%
diff --git a/measurements/loop_fio_read_4k_uncompressed_direct.log b/measurements/loop_fio_read_4k_uncompressed_direct.log
new file mode 100644
index 0000000..22df680
--- /dev/null
+++ b/measurements/loop_fio_read_4k_uncompressed_direct.log
@@ -0,0 +1,29 @@
+loop_fio_read_4k_uncompressed_direct: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_read_4k_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=3307: Thu Aug 29 22:32:23 2019
+ read: IOPS=91.4k, BW=357MiB/s (374MB/s)(622MiB/1743msec)
+ clat (usec): min=8, max=127, avg=10.20, stdev= 2.32
+ lat (usec): min=8, max=127, avg=10.29, stdev= 2.34
+ clat percentiles (nsec):
+ | 1.00th=[ 8512], 5.00th=[ 9024], 10.00th=[ 9024], 20.00th=[ 9152],
+ | 30.00th=[ 9152], 40.00th=[ 9152], 50.00th=[ 9152], 60.00th=[ 9280],
+ | 70.00th=[ 9280], 80.00th=[10304], 90.00th=[14272], 95.00th=[15296],
+ | 99.00th=[16192], 99.50th=[18304], 99.90th=[24448], 99.95th=[24704],
+ | 99.99th=[40192]
+ bw ( KiB/s): min=328376, max=400408, per=98.63%, avg=360418.67, stdev=36667.62, samples=3
+ iops : min=82094, max=100102, avg=90104.67, stdev=9166.91, samples=3
+ lat (usec) : 10=79.72%, 20=19.94%, 50=0.33%, 100=0.01%, 250=0.01%
+ cpu : usr=12.97%, sys=39.95%, ctx=318460, majf=0, minf=13
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=357MiB/s (374MB/s), 357MiB/s-357MiB/s (374MB/s-374MB/s), io=622MiB (652MB), run=1743-1743msec
+
+Disk stats (read/write):
+ loop0: ios=146764/0, merge=0/0, ticks=1052/0, in_queue=0, util=94.42%
diff --git a/measurements/loop_fio_read_512_compressed_direct.log b/measurements/loop_fio_read_512_compressed_direct.log
new file mode 100644
index 0000000..3903990
--- /dev/null
+++ b/measurements/loop_fio_read_512_compressed_direct.log
@@ -0,0 +1,31 @@
+loop_fio_read_512_compressed_direct: (g=0): rw=read, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_read_512_compressed_direct: (groupid=0, jobs=1): err= 0: pid=3349: Thu Aug 29 22:36:11 2019
+ read: IOPS=28.5k, BW=13.9MiB/s (14.6MB/s)(622MiB/44664msec)
+ clat (usec): min=7, max=1503, avg=34.20, stdev=74.00
+ lat (usec): min=7, max=1504, avg=34.31, stdev=74.01
+ clat percentiles (usec):
+ | 1.00th=[ 9], 5.00th=[ 9], 10.00th=[ 9], 20.00th=[ 9],
+ | 30.00th=[ 10], 40.00th=[ 10], 50.00th=[ 10], 60.00th=[ 13],
+ | 70.00th=[ 15], 80.00th=[ 16], 90.00th=[ 18], 95.00th=[ 258],
+ | 99.00th=[ 285], 99.50th=[ 326], 99.90th=[ 396], 99.95th=[ 408],
+ | 99.99th=[ 441]
+ bw ( KiB/s): min= 1484, max=48864, per=100.00%, avg=14282.22, stdev=13477.34, samples=89
+ iops : min= 2968, max=97728, avg=28564.49, stdev=26954.72, samples=89
+ lat (usec) : 10=57.40%, 20=33.18%, 50=0.24%, 100=0.01%, 250=0.52%
+ lat (usec) : 500=8.64%, 750=0.01%
+ lat (msec) : 2=0.01%
+ cpu : usr=5.04%, sys=14.72%, ctx=2547661, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=13.9MiB/s (14.6MB/s), 13.9MiB/s-13.9MiB/s (14.6MB/s-14.6MB/s), io=622MiB (652MB), run=44664-44664msec
+
+Disk stats (read/write):
+ loop1: ios=1271772/0, merge=0/0, ticks=38576/0, in_queue=0, util=99.82%
diff --git a/measurements/loop_fio_read_512_uncompressed_direct.log b/measurements/loop_fio_read_512_uncompressed_direct.log
new file mode 100644
index 0000000..2f15916
--- /dev/null
+++ b/measurements/loop_fio_read_512_uncompressed_direct.log
@@ -0,0 +1,29 @@
+loop_fio_read_512_uncompressed_direct: (g=0): rw=read, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+loop_fio_read_512_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=3324: Thu Aug 29 22:33:23 2019
+ read: IOPS=97.6k, BW=47.6MiB/s (49.0MB/s)(622MiB/13056msec)
+ clat (usec): min=7, max=113, avg= 9.54, stdev= 1.95
+ lat (usec): min=7, max=113, avg= 9.63, stdev= 1.97
+ clat percentiles (nsec):
+ | 1.00th=[ 8384], 5.00th=[ 8768], 10.00th=[ 8768], 20.00th=[ 8768],
+ | 30.00th=[ 8768], 40.00th=[ 8896], 50.00th=[ 8896], 60.00th=[ 8896],
+ | 70.00th=[ 8896], 80.00th=[ 9024], 90.00th=[12608], 95.00th=[14912],
+ | 99.00th=[15680], 99.50th=[16064], 99.90th=[20096], 99.95th=[22656],
+ | 99.99th=[32640]
+ bw ( KiB/s): min=33813, max=53904, per=100.00%, avg=48838.54, stdev=5723.32, samples=26
+ iops : min=67626, max=107808, avg=97677.12, stdev=11446.68, samples=26
+ lat (usec) : 10=86.74%, 20=13.16%, 50=0.10%, 100=0.01%, 250=0.01%
+ cpu : usr=13.12%, sys=40.99%, ctx=2547692, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=47.6MiB/s (49.0MB/s), 47.6MiB/s-47.6MiB/s (49.0MB/s-49.0MB/s), io=622MiB (652MB), run=13056-13056msec
+
+Disk stats (read/write):
+ loop0: ios=1260831/0, merge=0/0, ticks=8274/0, in_queue=0, util=99.27%
diff --git a/measurements/measurements.txt b/measurements/measurements.txt
new file mode 100644
index 0000000..aca84d3
--- /dev/null
+++ b/measurements/measurements.txt
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+# measurements.txt - describe details of measuring the QCOW2 performance
+#------------------------------------------------------------------------------
+# author : Manuel Bentele
+# date : Aug 31, 2019
+# copyright: (c) 2019 Manuel Bentele
+#------------------------------------------------------------------------------
+
+Measurements have been done to check the read performance of the QCOW2
+implementation and compare them to qemu-nbd.
+
+All measurements were carried out on the following test environment:
+
+ - CPU: Intel(R) Core(TM) i3-3225 CPU @ 3.30 GHz
+ - HDD: Samsung SSD 840 PRO Series
+ - RAM: 8GB RAM
+ - OS : Linux kernel 5.3.0-rc5
+ - FS: ext4
+ - QCOW2: 650 MB QCOW2 file with 64KB cluster size
+ - Block device benchmark: fio-3.15
+
+The log files of the measurements are stored in this folder and have the suffix
+*.log.
diff --git a/measurements/nbd_fio_randread_4k_compressed_direct.log b/measurements/nbd_fio_randread_4k_compressed_direct.log
new file mode 100644
index 0000000..cb6c4dd
--- /dev/null
+++ b/measurements/nbd_fio_randread_4k_compressed_direct.log
@@ -0,0 +1,30 @@
+nbd_fio_randread_4k_compressed_direct: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_randread_4k_compressed_direct: (groupid=0, jobs=1): err= 0: pid=1834: Fri Aug 30 10:31:30 2019
+ read: IOPS=12.2k, BW=47.7MiB/s (50.0MB/s)(622MiB/13035msec)
+ clat (usec): min=27, max=805, avg=80.02, stdev=93.43
+ lat (usec): min=27, max=805, avg=80.19, stdev=93.44
+ clat percentiles (usec):
+ | 1.00th=[ 35], 5.00th=[ 41], 10.00th=[ 43], 20.00th=[ 45],
+ | 30.00th=[ 46], 40.00th=[ 48], 50.00th=[ 50], 60.00th=[ 53],
+ | 70.00th=[ 56], 80.00th=[ 60], 90.00th=[ 93], 95.00th=[ 351],
+ | 99.00th=[ 433], 99.50th=[ 474], 99.90th=[ 537], 99.95th=[ 570],
+ | 99.99th=[ 644]
+ bw ( KiB/s): min=43864, max=55664, per=99.99%, avg=48858.46, stdev=2347.57, samples=26
+ iops : min=10966, max=13916, avg=12214.62, stdev=586.89, samples=26
+ lat (usec) : 50=49.83%, 100=40.53%, 250=0.53%, 500=8.86%, 750=0.24%
+ lat (usec) : 1000=0.01%
+ cpu : usr=4.21%, sys=9.24%, ctx=276099, majf=0, minf=11
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=47.7MiB/s (50.0MB/s), 47.7MiB/s-47.7MiB/s (50.0MB/s-50.0MB/s), io=622MiB (652MB), run=13035-13035msec
+
+Disk stats (read/write):
+ nbd1: ios=157246/0, merge=0/0, ticks=11644/0, in_queue=0, util=99.28%
diff --git a/measurements/nbd_fio_randread_4k_uncompressed_direct.log b/measurements/nbd_fio_randread_4k_uncompressed_direct.log
new file mode 100644
index 0000000..d25c314
--- /dev/null
+++ b/measurements/nbd_fio_randread_4k_uncompressed_direct.log
@@ -0,0 +1,29 @@
+nbd_fio_randread_4k_uncompressed_direct: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_randread_4k_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=1896: Fri Aug 30 10:35:54 2019
+ read: IOPS=22.4k, BW=87.4MiB/s (91.6MB/s)(622MiB/7118msec)
+ clat (usec): min=25, max=328, avg=43.13, stdev= 5.70
+ lat (usec): min=25, max=329, avg=43.27, stdev= 5.70
+ clat percentiles (usec):
+ | 1.00th=[ 30], 5.00th=[ 38], 10.00th=[ 38], 20.00th=[ 40],
+ | 30.00th=[ 41], 40.00th=[ 42], 50.00th=[ 43], 60.00th=[ 44],
+ | 70.00th=[ 45], 80.00th=[ 46], 90.00th=[ 50], 95.00th=[ 52],
+ | 99.00th=[ 59], 99.50th=[ 66], 99.90th=[ 96], 99.95th=[ 100],
+ | 99.99th=[ 139]
+ bw ( KiB/s): min=85944, max=93860, per=100.00%, avg=89514.57, stdev=2115.75, samples=14
+ iops : min=21486, max=23465, avg=22378.64, stdev=528.94, samples=14
+ lat (usec) : 50=89.74%, 100=10.21%, 250=0.05%, 500=0.01%
+ cpu : usr=6.74%, sys=14.02%, ctx=296527, majf=0, minf=10
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=87.4MiB/s (91.6MB/s), 87.4MiB/s-87.4MiB/s (91.6MB/s-91.6MB/s), io=622MiB (652MB), run=7118-7118msec
+
+Disk stats (read/write):
+ nbd0: ios=154281/0, merge=0/0, ticks=5859/0, in_queue=0, util=98.61%
diff --git a/measurements/nbd_fio_randread_512_compressed_direct.log b/measurements/nbd_fio_randread_512_compressed_direct.log
new file mode 100644
index 0000000..d536f71
--- /dev/null
+++ b/measurements/nbd_fio_randread_512_compressed_direct.log
@@ -0,0 +1,31 @@
+nbd_fio_randread_512_compressed_direct: (g=0): rw=randread, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_randread_512_compressed_direct: (groupid=0, jobs=1): err= 0: pid=1933: Fri Aug 30 10:41:54 2019
+ read: IOPS=12.9k, BW=6470KiB/s (6625kB/s)(622MiB/98449msec)
+ clat (usec): min=21, max=1801, avg=75.34, stdev=92.39
+ lat (usec): min=21, max=1801, avg=75.52, stdev=92.39
+ clat percentiles (usec):
+ | 1.00th=[ 31], 5.00th=[ 37], 10.00th=[ 39], 20.00th=[ 40],
+ | 30.00th=[ 41], 40.00th=[ 43], 50.00th=[ 46], 60.00th=[ 49],
+ | 70.00th=[ 51], 80.00th=[ 56], 90.00th=[ 90], 95.00th=[ 347],
+ | 99.00th=[ 420], 99.50th=[ 457], 99.90th=[ 529], 99.95th=[ 562],
+ | 99.99th=[ 635]
+ bw ( KiB/s): min= 5576, max= 7294, per=99.96%, avg=6466.22, stdev=372.79, samples=196
+ iops : min=11152, max=14588, avg=12932.45, stdev=745.58, samples=196
+ lat (usec) : 50=66.44%, 100=24.13%, 250=0.37%, 500=8.87%, 750=0.20%
+ lat (usec) : 1000=0.01%
+ lat (msec) : 2=0.01%
+ cpu : usr=4.62%, sys=9.95%, ctx=2199257, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=6470KiB/s (6625kB/s), 6470KiB/s-6470KiB/s (6625kB/s-6625kB/s), io=622MiB (652MB), run=98449-98449msec
+
+Disk stats (read/write):
+ nbd1: ios=1272891/0, merge=0/0, ticks=88018/0, in_queue=0, util=99.94%
diff --git a/measurements/nbd_fio_randread_512_uncompressed_direct.log b/measurements/nbd_fio_randread_512_uncompressed_direct.log
new file mode 100644
index 0000000..9a337e9
--- /dev/null
+++ b/measurements/nbd_fio_randread_512_uncompressed_direct.log
@@ -0,0 +1,29 @@
+nbd_fio_randread_512_uncompressed_direct: (g=0): rw=randread, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_randread_512_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=1914: Fri Aug 30 10:38:00 2019
+ read: IOPS=25.1k, BW=12.2MiB/s (12.8MB/s)(622MiB/50843msec)
+ clat (usec): min=22, max=786, avg=38.39, stdev= 4.84
+ lat (usec): min=22, max=787, avg=38.54, stdev= 4.86
+ clat percentiles (usec):
+ | 1.00th=[ 28], 5.00th=[ 35], 10.00th=[ 36], 20.00th=[ 36],
+ | 30.00th=[ 37], 40.00th=[ 37], 50.00th=[ 38], 60.00th=[ 38],
+ | 70.00th=[ 40], 80.00th=[ 41], 90.00th=[ 44], 95.00th=[ 48],
+ | 99.00th=[ 53], 99.50th=[ 58], 99.90th=[ 74], 99.95th=[ 83],
+ | 99.99th=[ 117]
+ bw ( KiB/s): min=10042, max=13427, per=100.00%, avg=12536.40, stdev=518.91, samples=101
+ iops : min=20084, max=26854, avg=25072.79, stdev=1037.81, samples=101
+ lat (usec) : 50=98.28%, 100=1.70%, 250=0.02%, 500=0.01%, 1000=0.01%
+ cpu : usr=7.12%, sys=15.80%, ctx=2338709, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=12.2MiB/s (12.8MB/s), 12.2MiB/s-12.2MiB/s (12.8MB/s-12.8MB/s), io=622MiB (652MB), run=50843-50843msec
+
+Disk stats (read/write):
+ nbd0: ios=1269140/0, merge=0/0, ticks=42248/0, in_queue=0, util=99.84%
diff --git a/measurements/nbd_fio_read_4k_compressed_direct.log b/measurements/nbd_fio_read_4k_compressed_direct.log
new file mode 100644
index 0000000..cdcfcf5
--- /dev/null
+++ b/measurements/nbd_fio_read_4k_compressed_direct.log
@@ -0,0 +1,30 @@
+nbd_fio_read_4k_compressed_direct: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_read_4k_compressed_direct: (groupid=0, jobs=1): err= 0: pid=3014: Thu Aug 29 22:25:40 2019
+ read: IOPS=13.9k, BW=54.5MiB/s (57.1MB/s)(622MiB/11416msec)
+ clat (usec): min=24, max=805, avg=70.43, stdev=86.69
+ lat (usec): min=24, max=806, avg=70.58, stdev=86.70
+ clat percentiles (usec):
+ | 1.00th=[ 27], 5.00th=[ 38], 10.00th=[ 39], 20.00th=[ 40],
+ | 30.00th=[ 40], 40.00th=[ 41], 50.00th=[ 43], 60.00th=[ 45],
+ | 70.00th=[ 46], 80.00th=[ 51], 90.00th=[ 78], 95.00th=[ 310],
+ | 99.00th=[ 416], 99.50th=[ 457], 99.90th=[ 553], 99.95th=[ 603],
+ | 99.99th=[ 652]
+ bw ( KiB/s): min=22880, max=93416, per=100.00%, avg=56302.55, stdev=22475.41, samples=22
+ iops : min= 5720, max=23354, avg=14075.64, stdev=5618.85, samples=22
+ lat (usec) : 50=79.15%, 100=11.54%, 250=0.41%, 500=8.66%, 750=0.23%
+ lat (usec) : 1000=0.01%
+ cpu : usr=3.52%, sys=9.36%, ctx=284373, majf=0, minf=13
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=54.5MiB/s (57.1MB/s), 54.5MiB/s-54.5MiB/s (57.1MB/s-57.1MB/s), io=622MiB (652MB), run=11416-11416msec
+
+Disk stats (read/write):
+ nbd1: ios=158958/0, merge=0/0, ticks=10360/0, in_queue=0, util=99.17%
diff --git a/measurements/nbd_fio_read_4k_uncompressed_direct.log b/measurements/nbd_fio_read_4k_uncompressed_direct.log
new file mode 100644
index 0000000..cdf5256
--- /dev/null
+++ b/measurements/nbd_fio_read_4k_uncompressed_direct.log
@@ -0,0 +1,29 @@
+nbd_fio_read_4k_uncompressed_direct: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_read_4k_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=2997: Thu Aug 29 22:25:03 2019
+ read: IOPS=23.9k, BW=93.2MiB/s (97.8MB/s)(622MiB/6671msec)
+ clat (usec): min=25, max=262, avg=40.72, stdev= 4.68
+ lat (usec): min=25, max=263, avg=40.85, stdev= 4.69
+ clat percentiles (usec):
+ | 1.00th=[ 29], 5.00th=[ 38], 10.00th=[ 38], 20.00th=[ 39],
+ | 30.00th=[ 40], 40.00th=[ 40], 50.00th=[ 40], 60.00th=[ 41],
+ | 70.00th=[ 41], 80.00th=[ 43], 90.00th=[ 46], 95.00th=[ 50],
+ | 99.00th=[ 55], 99.50th=[ 59], 99.90th=[ 82], 99.95th=[ 88],
+ | 99.99th=[ 139]
+ bw ( KiB/s): min=89608, max=103536, per=100.00%, avg=95633.23, stdev=3540.57, samples=13
+ iops : min=22402, max=25884, avg=23908.31, stdev=885.14, samples=13
+ lat (usec) : 50=95.91%, 100=4.06%, 250=0.03%, 500=0.01%
+ cpu : usr=5.46%, sys=14.50%, ctx=309289, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=159232,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=93.2MiB/s (97.8MB/s), 93.2MiB/s-93.2MiB/s (97.8MB/s-97.8MB/s), io=622MiB (652MB), run=6671-6671msec
+
+Disk stats (read/write):
+ nbd0: ios=158528/0, merge=0/0, ticks=5730/0, in_queue=0, util=98.63%
diff --git a/measurements/nbd_fio_read_512_compressed_direct.log b/measurements/nbd_fio_read_512_compressed_direct.log
new file mode 100644
index 0000000..6a39cef
--- /dev/null
+++ b/measurements/nbd_fio_read_512_compressed_direct.log
@@ -0,0 +1,30 @@
+nbd_fio_read_512_compressed_direct: (g=0): rw=read, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_read_512_compressed_direct: (groupid=0, jobs=1): err= 0: pid=2876: Thu Aug 29 22:21:41 2019
+ read: IOPS=15.3k, BW=7643KiB/s (7827kB/s)(622MiB/83334msec)
+ clat (usec): min=21, max=867, avg=64.15, stdev=81.25
+ lat (usec): min=21, max=867, avg=64.30, stdev=81.26
+ clat percentiles (usec):
+ | 1.00th=[ 27], 5.00th=[ 34], 10.00th=[ 36], 20.00th=[ 37],
+ | 30.00th=[ 37], 40.00th=[ 38], 50.00th=[ 38], 60.00th=[ 40],
+ | 70.00th=[ 41], 80.00th=[ 45], 90.00th=[ 60], 95.00th=[ 297],
+ | 99.00th=[ 375], 99.50th=[ 416], 99.90th=[ 494], 99.95th=[ 529],
+ | 99.99th=[ 611]
+ bw ( KiB/s): min= 1398, max=18193, per=100.00%, avg=7655.06, stdev=4078.26, samples=166
+ iops : min= 2796, max=36386, avg=15310.13, stdev=8156.53, samples=166
+ lat (usec) : 50=88.12%, 100=2.68%, 250=0.34%, 500=8.77%, 750=0.09%
+ lat (usec) : 1000=0.01%
+ cpu : usr=3.97%, sys=9.80%, ctx=2274090, majf=0, minf=13
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=7643KiB/s (7827kB/s), 7643KiB/s-7643KiB/s (7827kB/s-7827kB/s), io=622MiB (652MB), run=83334-83334msec
+
+Disk stats (read/write):
+ nbd1: ios=1271533/0, merge=0/0, ticks=74998/0, in_queue=0, util=99.91%
diff --git a/measurements/nbd_fio_read_512_uncompressed_direct.log b/measurements/nbd_fio_read_512_uncompressed_direct.log
new file mode 100644
index 0000000..6c65560
--- /dev/null
+++ b/measurements/nbd_fio_read_512_uncompressed_direct.log
@@ -0,0 +1,29 @@
+nbd_fio_read_512_uncompressed_direct: (g=0): rw=read, bs=(R) 512B-512B, (W) 512B-512B, (T) 512B-512B, ioengine=psync, iodepth=1
+fio-3.15
+Starting 1 process
+
+nbd_fio_read_512_uncompressed_direct: (groupid=0, jobs=1): err= 0: pid=2887: Thu Aug 29 22:22:50 2019
+ read: IOPS=25.2k, BW=12.3MiB/s (12.9MB/s)(622MiB/50486msec)
+ clat (usec): min=20, max=848, avg=38.40, stdev= 4.66
+ lat (usec): min=20, max=848, avg=38.55, stdev= 4.67
+ clat percentiles (usec):
+ | 1.00th=[ 27], 5.00th=[ 35], 10.00th=[ 36], 20.00th=[ 37],
+ | 30.00th=[ 37], 40.00th=[ 37], 50.00th=[ 38], 60.00th=[ 39],
+ | 70.00th=[ 40], 80.00th=[ 41], 90.00th=[ 43], 95.00th=[ 48],
+ | 99.00th=[ 52], 99.50th=[ 56], 99.90th=[ 73], 99.95th=[ 81],
+ | 99.99th=[ 116]
+ bw ( KiB/s): min=11122, max=18188, per=99.97%, avg=12610.66, stdev=840.58, samples=100
+ iops : min=22244, max=36376, avg=25221.32, stdev=1681.16, samples=100
+ lat (usec) : 50=98.57%, 100=1.41%, 250=0.02%, 500=0.01%, 1000=0.01%
+ cpu : usr=6.36%, sys=15.47%, ctx=2300012, majf=0, minf=12
+ IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
+ submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
+ issued rwts: total=1273856,0,0,0 short=0,0,0,0 dropped=0,0,0,0
+ latency : target=0, window=0, percentile=100.00%, depth=1
+
+Run status group 0 (all jobs):
+ READ: bw=12.3MiB/s (12.9MB/s), 12.3MiB/s-12.3MiB/s (12.9MB/s-12.9MB/s), io=622MiB (652MB), run=50486-50486msec
+
+Disk stats (read/write):
+ nbd0: ios=1270881/0, merge=0/0, ticks=42620/0, in_queue=0, util=99.84%
diff --git a/presentation/images/file_fmt_subsystem_integration.tex b/presentation/images/file_fmt_subsystem_integration.tex
new file mode 100644
index 0000000..a18be3f
--- /dev/null
+++ b/presentation/images/file_fmt_subsystem_integration.tex
@@ -0,0 +1,32 @@
+%-------------------------------------------------------------------------------
+% file_fmt_subsystem_integration.tex - subsystem integration as image
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 29, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\begin{tikzpicture}[
+ box/.style = {rectangle, draw, minimum height = 0.15\textheight},
+ bwidth/.style = {minimum width = 0.35\textwidth},
+ old/.style = {dashed, fill = gray!10},
+ arrow/.style = {-triangle 45},
+ desc/.style = {font = \small}
+ ]
+ \node[box, old, minimum height = 0.08\textheight, bwidth] (blk) {Block layer};
+ \node[box, old, below = 0.6 of blk, bwidth] (loop) {Loop device module};
+ \node[box, old, minimum height = 0.1\textheight,
+ xshift = -0.1\textheight, yshift = -0.01\textheight] (lodevs)
+ at (loop.south east) {Loop devices};
+ \node[box, fill = hdr, right = 2 of loop] (subsys) {File format subsystem};
+ \node[box, fill = dat, minimum height = 0.1\textheight,
+ xshift = -0.1\textheight, yshift = -0.01\textheight] (drvs)
+ at (subsys.south east) {File format drivers};
+ \node[box, right = 2 of subsys, old] (file) {Backing files};
+
+ \draw[arrow] (blk) -- node[right, desc] {Requests} (loop);
+ \draw[arrow] (loop) -- node[above, desc] {Requests} (subsys);
+ \draw[arrow] (subsys) --
+ node[anchor = west, rotate = 90, align = left, desc]
+ {read\\write\\\ \ \vdots} (file);
+\end{tikzpicture} \ No newline at end of file
diff --git a/presentation/images/linux_storage_stack.tex b/presentation/images/linux_storage_stack.tex
new file mode 100644
index 0000000..3fb9eb2
--- /dev/null
+++ b/presentation/images/linux_storage_stack.tex
@@ -0,0 +1,64 @@
+%-------------------------------------------------------------------------------
+% linux_storage_stack.tex - renders the storage stack of the Linux kernel
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 29, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\begin{tikzpicture}[
+ box/.style = {rectangle, draw, minimum height = 0.75cm, align = center},
+ largeb/.style = {minimum width = 0.7\textwidth},
+ smallb/.style = {minimum width = 0.225\textwidth},
+ arrow/.style = {-triangle 45},
+ desc/.style = {font = \footnotesize},
+ node distance = 0.06\textwidth
+ ]
+
+ \node[box, largeb, fill = hdr] (apps) {Applications};
+ \node[box, largeb, fill = ret, below = of apps] (vfs)
+ {Virtual file system (VFS)};
+ \node[box, smallb, fill = gray!15, left = of vfs] (dio) {Direct IO};
+ \node[box, smallb, fill = gray!15, right = of vfs] (pgc) {Page cache};
+
+ \draw[arrow] ([xshift=-0.3\textwidth]apps.south) -- node[right,desc] {read}
+ ([xshift=-0.3\textwidth]vfs.north);
+ \draw[arrow] ([xshift=-0.1\textwidth]apps.south) -- node[right,desc] {write}
+ ([xshift=-0.1\textwidth]vfs.north);
+ \draw[arrow] ([xshift=0.1\textwidth]apps.south) -- node[right,desc] {open}
+ ([xshift=0.1\textwidth]vfs.north);
+ \draw[arrow] ([xshift=0.3\textwidth]apps.south) -- node[right,desc] {\dots}
+ ([xshift=0.3\textwidth]vfs.north);
+
+ \draw[line width = 2pt] (vfs) -- (dio);
+ \draw[line width = 2pt] (vfs) -- (pgc);
+ \draw[arrow] (apps) -| node[above, align = center, desc]
+ {mmap\\malloc} (pgc);
+
+ \node[box, largeb, below = of vfs, fill = dat] (dmp)
+ {Device mapper (optional)};
+ \node[box, largeb, below = of dmp, fill = l2t] (blk)
+ {Block layer\\\scriptsize (maps BIOs to requests)};
+
+ \draw[arrow] (pgc) |- node[desc, below] {BIOs (block IOs)} (dmp);
+ \draw[arrow] (dio) |- node[desc, below] {BIOs (block IOs)} (dmp);
+ \draw[arrow] (dmp) -- node[desc, left] {BIOs} (blk);
+ \draw[arrow] ([xshift=-0.05\textwidth]dmp.north) --
+ node[desc, left, pos = 1.0] {stackable} ++(0, 0.03\textwidth) --
+ ++(0.1\textwidth, 0) -- ++(0, -0.03\textwidth);
+
+ \node[box, largeb, fill = reb, below = of blk] (drvrq)
+ {Block drivers\\\scriptsize (request based)};
+ \node[box, smallb, fill = reb, right = of drvrq] (drvbio)
+ {Block drivers\\\scriptsize (BIO based)};
+
+ \draw[arrow] (blk) -- node[desc, right] {Requests} (drvrq);
+ \draw[arrow] (dmp.south)++(0, -0.03\textwidth) -|
+ node[desc, right, pos=0.725] {BIOs} (drvbio);
+
+ \node[box, fill = gray!15, below = of drvrq.south west, anchor = north west,
+ minimum width = 0.9865\textwidth] (hw) {Physical or virtual devices};
+
+ \draw[arrow] (drvrq) -- (drvrq |- hw.north);
+ \draw[arrow] (drvbio) -- (drvbio |- hw.north);
+\end{tikzpicture} \ No newline at end of file
diff --git a/presentation/images/qcow2_addressing.tex b/presentation/images/qcow2_addressing.tex
new file mode 100644
index 0000000..f052248
--- /dev/null
+++ b/presentation/images/qcow2_addressing.tex
@@ -0,0 +1,63 @@
+%-------------------------------------------------------------------------------
+% qcow2_addressing.tex - addressing of QCOW2 data clusters as image
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 29, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\begin{tikzpicture}[
+ arrow/.style = {-triangle 45},
+ datacluster/.style = {rectangle, draw, fill = dat,
+ minimum width = 0.1\textwidth, minimum height = 0.1\textheight},
+ heading/.style = {font = \Large}
+ ]
+ \node[inner sep = 0, anchor = north] (l1table) at (0, 0) {
+ \begin{tabular}{|p{0.25\textwidth}|} \hline
+ \cellcolor{dat} \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \\ \hline
+ \end{tabular}
+ };
+
+ \node[inner sep = 0, anchor = north] (l2table1) at (0.5\textwidth, 0) {
+ \begin{tabular}{|p{0.25\textwidth}|} \hline
+ \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \end{tabular}
+ };
+
+ \node[inner sep = 0, below = 0.75 of l2table1] (l2table2) {
+ \begin{tabular}{|p{0.25\textwidth}|} \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \cellcolor{dat} \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \end{tabular}
+ };
+
+ \node[inner sep = 0, anchor = north, datacluster] (data1) at (0.9\textwidth, 0) {};
+ \node[inner sep = 0, below = 0.5 of data1, datacluster] (data2) {};
+ \node[inner sep = 0, below = 0.5 of data2, datacluster] (data3) {};
+ \node[inner sep = 0, below = 0.5 of data3, datacluster] (data4) {};
+ \node[inner sep = 0, below = 0.5 of data4, datacluster] (data5) {};
+
+ \node[above = 0.5 of l1table, heading] {L1~table};
+ \node[above = 0.5 of l2table1, heading] {L2~tables};
+ \node[above = 0.5 of data1, heading] {Data clusters};
+
+
+ \draw[arrow] ($(l1table.north east)!0.125!(l1table.south east)$) -- ($(l2table1.north west)!0.1!(l2table1.south west)$);
+ \draw[arrow] ($(l1table.north east)!0.625!(l1table.south east)$) -- ($(l2table2.north west)!0.1!(l2table2.south west)$);
+
+ \draw[arrow] ($(l2table1.north east)!0.5!(l2table1.south east)$) -- (data1.west);
+ \draw[arrow] ($(l2table1.north east)!0.9!(l2table1.south east)$) -- (data2.west);
+ \draw[arrow] ($(l2table2.north east)!0.3!(l2table2.south east)$) -- (data3.west);
+ \draw[arrow] ($(l2table2.north east)!0.5!(l2table2.south east)$) -- (data4.west);
+ \draw[arrow] ($(l2table2.north east)!0.9!(l2table2.south east)$) -- (data5.west);
+\end{tikzpicture} \ No newline at end of file
diff --git a/presentation/images/qcow2_performance.tex b/presentation/images/qcow2_performance.tex
new file mode 100644
index 0000000..e5849e9
--- /dev/null
+++ b/presentation/images/qcow2_performance.tex
@@ -0,0 +1,36 @@
+%-------------------------------------------------------------------------------
+% qcow2_performance.tex - shows how QCOW2 performs compared to qemu-nbd
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 31, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\begin{tikzpicture}
+ \pgfplotstableread[
+ col sep = semicolon
+ ]{../measurements/fio_results.csv}\resultdata
+ \begin{axis}[
+ height = 5cm,
+ width = 0.95\textwidth,
+ ybar,
+ ymin = 0.75,
+ ymax = 4.25,
+ ylabel = {Throughput gain factor},
+ legend cell align = {left},
+ ymajorgrids,
+ x tick label style = {rotate = 30, anchor = north east,
+ align = right},
+ xticklabels from table={\resultdata}{Type},
+ xtick = data,
+ axis lines = left,
+ enlarge x limits = 0.1,
+ ]
+
+ \addplot table[y = {Factor_512}, x expr=\coordindex]{\resultdata};
+ \addlegendentry{512~byte operation};
+
+ \addplot table[y = {Factor_4096}, x expr=\coordindex]{\resultdata};
+ \addlegendentry{4096~byte operation};
+ \end{axis}
+\end{tikzpicture} \ No newline at end of file
diff --git a/presentation/images/qcow2_reading.tex b/presentation/images/qcow2_reading.tex
new file mode 100644
index 0000000..ed11d93
--- /dev/null
+++ b/presentation/images/qcow2_reading.tex
@@ -0,0 +1,55 @@
+%-------------------------------------------------------------------------------
+% qcow2_reading.tex - shows how QCOW2 clusters are mapped for reading
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 29, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\begin{tikzpicture}[
+ arrow/.style = {-triangle 45}
+ ]
+ \node[inner sep = 0, anchor = north] (blkdev) at (0, 0) {
+ \renewcommand*{\arraystretch}{1.3}
+ \begin{tabular}{|c|} \hline
+ \\ \hline
+ \\ \hline
+ \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \cellcolor{dat} \\ \hline
+ \\ \hline
+ \cellcolor{dat} \\ \hline
+ \end{tabular}
+ };
+
+ \node[inner sep = 0, anchor = north, right = of blkdev] (qcow2) {
+ \renewcommand*{\arraystretch}{1.3}
+ \hspace*{-0.25cm}
+ \begin{tabular}{|c|} \hline
+ \cellcolor{hdr}Header \\ \hline
+ \cellcolor{ret}Refcount table \\ \hline
+ \cellcolor{reb}Refcount block \\ \hline
+ \cellcolor{l1t}L1~table \\ \hline
+ \cellcolor{l2t}L2~table \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \cellcolor{l2t}L2~table \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \end{tabular}
+ };
+
+ \draw[triangle 45-triangle 45] ($(blkdev.north west)!0!(blkdev.south west)$) -- node[left] {$O$} ($(blkdev.north west)!0.6!(blkdev.south west)$);
+ \draw[triangle 45-triangle 45] ($(blkdev.north west)!0.6!(blkdev.south west)$) -- node[left] {$S$} ($(blkdev.north west)!0.8!(blkdev.south west)$);
+
+ \node[above = 0.5 of blkdev, align = center] {Block\\device};
+ \node[above = 0.5 of qcow2, align = center] {QCOW2\\file format};
+
+ \draw[arrow] ($(blkdev.north east)!0.45!(blkdev.south east)$) -- ($(qcow2.north west)!0.75!(qcow2.south west)$);
+ \draw[arrow] ($(blkdev.north east)!0.65!(blkdev.south east)$) -- ($(qcow2.north west)!0.55!(qcow2.south west)$);
+ \draw[arrow] ($(blkdev.north east)!0.75!(blkdev.south east)$) -- ($(qcow2.north west)!0.85!(qcow2.south west)$);
+ \draw[arrow] ($(blkdev.north east)!0.95!(blkdev.south east)$) -- ($(qcow2.north west)!0.95!(qcow2.south west)$);
+\end{tikzpicture} \ No newline at end of file
diff --git a/presentation/images/qcow2_structure.tex b/presentation/images/qcow2_structure.tex
new file mode 100644
index 0000000..861527b
--- /dev/null
+++ b/presentation/images/qcow2_structure.tex
@@ -0,0 +1,21 @@
+%-------------------------------------------------------------------------------
+% qcow2_structure.tex - structure of the QCOW2 disk image file format as image
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 29, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\renewcommand*{\arraystretch}{1.3}
+\begin{tabular}{|c|} \hline
+ \cellcolor{hdr}Header \\ \hline
+ \cellcolor{ret}Refcount table \\ \hline
+ \cellcolor{reb}Refcount block \\ \hline
+ \cellcolor{l1t}L1~table \\ \hline
+ \cellcolor{l2t}L2~table \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \cellcolor{l2t}L2~table \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \cellcolor{dat}Data cluster \\ \hline
+ \vdots
+\end{tabular} \ No newline at end of file
diff --git a/presentation/presentation.pdf b/presentation/presentation.pdf
new file mode 100644
index 0000000..64fd944
--- /dev/null
+++ b/presentation/presentation.pdf
Binary files differ
diff --git a/presentation/presentation.tex b/presentation/presentation.tex
new file mode 100644
index 0000000..b86129c
--- /dev/null
+++ b/presentation/presentation.tex
@@ -0,0 +1,229 @@
+%-------------------------------------------------------------------------------
+% presentation.tex - presentation of the QCOW2 in-kernel project
+%-------------------------------------------------------------------------------
+% author : Manuel Bentele
+% date : Aug 26, 2019
+% copyright: (c) 2019 Manuel Bentele
+%-------------------------------------------------------------------------------
+
+\documentclass[english]{beamer}
+
+%-------------------------------------------------------------------------------
+% Presentation theme settings
+%-------------------------------------------------------------------------------
+\usetheme{Malmoe}
+\usecolortheme{beaver}
+\useinnertheme{rounded}
+
+%-------------------------------------------------------------------------------
+% Used packages
+%-------------------------------------------------------------------------------
+\usepackage{colortbl}
+\usepackage{xcolor}
+\usepackage{hyperref}
+\usepackage{tikz}
+\usetikzlibrary{positioning, calc, arrows}
+\usepackage{pgfplots}
+\usepackage{pgfplotstable}
+\pgfplotsset{compat = newest}
+\usepackage{pifont}
+
+%-------------------------------------------------------------------------------
+% Custom macros and definitions
+%-------------------------------------------------------------------------------
+\makeatletter\let\frametextheight\beamer@frametextheight\makeatother
+
+\newcommand{\cmark}{\ding{51}}
+\newcommand{\xmark}{\ding{55}}
+
+\colorlet{hdr}{green!15}
+\colorlet{ret}{yellow!15}
+\colorlet{reb}{orange!15}
+\colorlet{l1t}{red!15}
+\colorlet{l2t}{violet!15}
+\colorlet{dat}{cyan!15}
+
+%-------------------------------------------------------------------------------
+% General definitions
+%-------------------------------------------------------------------------------
+\title{QCOW2 in the Linux kernel}
+\author[M. Bentele]{Manuel Bentele}
+\institute{University of Freiburg}
+\date{September 2, 2019}
+
+\begin{document}
+
+\begin{frame}
+ \maketitle
+\end{frame}
+
+\section{Analysis}
+\subsection{Requirements}
+\begin{frame}{What has to be done?}
+ \begin{block}{Implement the QCOW (QEMU Copy On Write) disk file format version~2 in the Linux kernel such that \dots}
+ \vspace*{0.5cm}
+ \begin{itemize}
+ \item reading of the normal QCOW2 disk file format is possible
+ \item compressed \& sparse QCOW2 disk files are supported as well
+ \item the disk file format is exposed as block device
+ \item the implementation compiles \& runs under Linux kernel 5 later
+ \item the performance is better than using qemu-nbd
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\subsection{Linux storage stack}
+\begin{frame}{How does the Linux storage stack looks like?}
+ \begin{center}
+ \resizebox{!}{0.775\textheight}{
+ \input{images/linux_storage_stack}
+ }
+ \end{center}
+\end{frame}
+
+\subsection{Implementation approaches}
+\begin{frame}{How can the implementation be achieved?}
+ \begin{block}{\xmark\ FUSE (Filesystem in Userspace) driver}
+ \begin{itemize}
+ \item implement reading of QCOW2 file format as user space driver
+ \end{itemize}
+ \end{block}
+ \begin{block}{\xmark\ Device mapper target}
+ \begin{itemize}
+ \item implement reading of QCOW2 file format as mapped target
+ \end{itemize}
+ \end{block}
+ \begin{block}{\xmark\ Custom block driver}
+ \begin{itemize}
+ \item create block driver \& configuration utility for reading QCOW2
+ \end{itemize}
+ \end{block}
+ \begin{block}{\cmark\ Loop device module extension}
+ \begin{itemize}
+ \item extend the loop device module \& configuration utility by a file format subsystem to implement QCOW2 as additional file format driver
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\section{Implementation}
+\subsection{Loop device module extension}
+\begin{frame}{How is the file format subsystem integrated?}
+ \resizebox{\textwidth}{!}{%
+ \input{images/file_fmt_subsystem_integration}
+ }
+ \vfill
+ \begin{itemize}
+ \item file format subsystem abstracts the direct access to backing files to implement various file formats
+ \item file formats are implemented as file format drivers
+ \item drivers are registered at the subsystem
+ \item subsystem supports (asynchronous) reads, (asynchronous) writes, flushes and virtual disk sizes
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile, shrink=35]{How does a file format driver look like?}
+\begin{verbatim}
+#include "loop_file_fmt.h"
+
+static int drv_file_fmt_read(struct loop_file_fmt *lo_fmt,
+ struct request *rq) {
+ /* TODO: implement reading of file format */
+ return -EIO;
+}
+
+static struct loop_file_fmt_ops drv_file_fmt_ops = {
+ .read = drv_file_fmt_read
+};
+
+static struct loop_file_fmt_driver drv_file_fmt = {
+ .name = "DRV",
+ .file_fmt_type = LO_FILE_FMT_RAW,
+ .ops = &drv_file_fmt_ops,
+ .owner = THIS_MODULE
+};
+
+// register driver with loop_file_fmt_register_driver(&drv_file_fmt)
+// unregister driver with loop_file_fmt_unregister_driver(&drv_file_fmt)
+\end{verbatim}
+\end{frame}
+
+\subsection{QCOW2 file format driver}
+\begin{frame}{How is the QCOW2 disk file format structured?}
+ \begin{columns}
+ \begin{column}[c]{0.25\textwidth}
+ \resizebox{\textwidth}{!}{%
+ \input{images/qcow2_structure}
+ }
+ \end{column}
+ \begin{column}[c]{0.75\textwidth}
+ \begin{itemize}
+ \item data is saved in data clusters of equal size (512\,B -- 2\,MB)
+ \item header provides offsets to 1st level tables
+ \item two-level lookup of data clusters (L1 \& L2~tables)
+ \item two-level reference count for copy on write (Refcount \& Refcount block tables)
+ \item numbers are stored in big-endian order
+ \item data clusters can be compressed or encrypted
+ \item support of embedded snapshots by use of internal copy on write
+ \end{itemize}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{frame}{How does QCOW2 addresses data clusters?}
+ \begin{itemize}
+ \item QCOW2 header stores an offset in the file to the L1~table
+ \item L1~table stores offsets in the file to L2 tables
+ \item L2~tables stores offsets in the file to the data clusters
+ \end{itemize}
+ \begin{center}
+ \resizebox{!}{0.55\textheight}{%
+ \input{images/qcow2_addressing}
+ }
+ \end{center}
+\end{frame}
+
+\begin{frame}{How does the QCOW2 driver read data?}
+ \begin{columns}
+ \begin{column}[c]{0.4\textwidth}
+ \resizebox{\textwidth}{!}{%
+ \input{images/qcow2_reading}
+ }
+ \end{column}
+ \begin{column}[c]{0.6\textwidth}
+ Given a Linux IO read request with size $S$ and block device offset $O$:
+ \begin{enumerate}
+ \item calculate cluster $C$ and position $P$ for $O$ using cached L1 \& L2~tables
+ \item decompress the data of $C$ if $C$ is compressed
+ \item read data from $P$ into IO read request until $S$ bytes or the end of $C$ is reached
+ \item repeat steps 1 -- 3 until IO read request is filled with $S$ bytes
+ \end{enumerate}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\subsection{Performance of the driver}
+\begin{frame}{How does the implementation perform compared to qemu-nbd?}
+ \resizebox{\textwidth}{!}{
+ \input{images/qcow2_performance}
+ }
+\end{frame}
+
+\section{Outlook}
+\subsection{Further work}
+\begin{frame}{What can be done in the future?}
+ \begin{block}{File format subsystem}
+ \begin{itemize}
+ \item implement other file formats, e.g. VDI, VMDK, \dots
+ \item extend the API to support snapshots \& encryption
+ \end{itemize}
+ \end{block}
+ \begin{block}{QCOW2 file format driver}
+ \begin{itemize}
+ \item implement write operations
+ \item implement encryption \& snapshot support
+ \item improve performance by hardware aligned cache allocation
+ \item add a QCOW2 L2 cache clean interval
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\end{document}