kastenhq/kubestr

Specify multiple fio tests to be run sequentially

AlexisDucastel opened this issue · 6 comments

Hi there,

First of all, thanks for you work on this tool. I've written my own script for benchmarking storage on Kubernetes : ksb.

My results are very differents from kubestr, so I tried to search where was the diff between our tests.

With kubestr cli, i've got between 734 and 849 IOPS in 3 differents run, here is the raw result of the best one :

> ./kubestr fio -s rook-ceph-block
PVC created kubestr-fio-pvc-g8gwx
Pod created kubestr-fio-pod-7tspk
Running FIO test (default-fio) on StorageClass (rook-ceph-block) with a PVC of Size (100Gi)
Elapsed time- 1m23.539474031s
FIO test results:

FIO version - fio-3.20
Global options - ioengine=libaio verify=0 direct=1 gtod_reduce=1

JobName: read_iops
  blocksize=4K filesize=2G iodepth=64 rw=randread
read:
  IOPS=849.953735 BW(KiB/s)=3416
  iops: min=600 max=1053 avg=854.266663
  bw(KiB/s): min=2400 max=4215 avg=3418.100098

As we can see in kubestr output, it used fio-3.20 with parameters :

  • ioengine=libaio
  • verify=0
  • direct=1
  • gtod_reduce=1
  • blocksize=4K
  • filesize=2G
  • iodepth=64
  • rw=randread

My Read IOPS benchmark is using exactly same parameters, but adding --time_based --ramp_time=2s --runtime=15s parameters. Results of 3 differents runs are between 10.6k IOPS and 12.9k IOPS. Here is the raw result of one run:

read_iops: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
read_iops: Laying out IO file (1 file / 2048MiB)
Jobs: 1 (f=0): [f(1)][100.0%][r=33.2MiB/s][r=8486 IOPS][eta 00m:00s]
read_iops: (groupid=0, jobs=1): err= 0: pid=29: Wed Apr 21 10:46:22 2021
  read: IOPS=12.9k, BW=50.4MiB/s (52.9MB/s)(757MiB/15012msec)
   bw (  KiB/s): min=21904, max=98400, per=100.00%, avg=52198.45, stdev=19676.11, samples=29
   iops        : min= 5476, max=24600, avg=13049.48, stdev=4919.07, samples=29
  cpu          : usr=2.58%, sys=6.54%, ctx=203273, majf=0, minf=58
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=193816,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=50.4MiB/s (52.9MB/s), 50.4MiB/s-50.4MiB/s (52.9MB/s-52.9MB/s), io=757MiB (794MB), run=15012-15012msec

Disk stats (read/write):
  rbd6: ios=212839/23, merge=0/3, ticks=769574/599, in_queue=567176, util=96.57%

Both docker images are based on alpine (ghcr.io/kastenhq/kubestr:latest and infrabuilder/iobench). So it does not comes from base OS difference. Anyway, my image is shipped with fio-3.25, and yours contains fio-3.20. To eliminate the image difference hyptohesis, I started a pod mounting a PVC from the exact same storageClass mounted on /root, using your image (ghcr.io/kastenhq/kubestr:latest) and overriding entrypoint with /bin/sh to let me do exec command in it. Here is the result of a manually launched fio command :

# fio --randrepeat=0 --verify=0 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=read_iops --filename=/root/fiotest --bs=4K --iodepth=64 --size=2G  --readwrite=randread
read_iops: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.20
Starting 1 process
read_iops: Laying out IO file (1 file / 2048MiB)
Jobs: 1 (f=1): [r(1)][100.0%][r=60.2MiB/s][r=15.4k IOPS][eta 00m:00s]
read_iops: (groupid=0, jobs=1): err= 0: pid=35: Wed Apr 21 10:25:15 2021
  read: IOPS=10.8k, BW=42.4MiB/s (44.4MB/s)(2048MiB/48355msec)
   bw (  KiB/s): min=12665, max=99328, per=99.89%, avg=43319.69, stdev=21317.01, samples=96
   iops        : min= 3166, max=24832, avg=10829.68, stdev=5329.23, samples=96
  cpu          : usr=1.70%, sys=5.80%, ctx=555542, majf=0, minf=71
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=524288,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=42.4MiB/s (44.4MB/s), 42.4MiB/s-42.4MiB/s (44.4MB/s-44.4MB/s), io=2048MiB (2147MB), run=48355-48355msec

Disk stats (read/write):
  rbd5: ios=519717/145, merge=0/27, ticks=2344134/3451, in_queue=1808204, util=95.04%

Here the result is very similar to the one I got on my benchmark : 10,8k IOPS (I've run it multiple times, results are between 9729 and 10.8k IOPS)

So to sum up :

  • kubestr default : 734 to 849 IOPS (stddev unknown)
  • ksb default : 10,6k to 12.9k IOPS (stddev 4919)
  • kubestr image with manual fio command : 9729 to 10.8k IOPS (stddev 5329)

If my benchmark and in your image with manual command, the stddev is very high (about 5k) due to the fact that it is a used cluster and not a lab isolated dedicated to the bench, but even wih this deviation there is still a large gap between kubestr results and fio results. I may test in isolated lab, as I do for CNI benchmark, but for now I lack of time :)

Can you explain why kubestr and fio commands results differs so much, even with same image ?

Thanks.

Sometimes the results differ based on the size of the volume being used.
By default, kubestr creates a PV of size 100Gi and runs i/o from the pod to the PV.

Are you running fio against the Persistent Volume or against local storage?

Hi @bathina2, Thanks for replying 😄

I just ran both benchmarks tools on a lab-dedicated cluster to eliminate any side-workload pollution, using same size PVC (100GB).

There is a difference between kubestr results, and fio cli results with same parameters.

test ksb kubestr
random_read_iops mean ~37k iops ~7k iops
random_write_iops mean 7 728 iops 2 965 iops
sequential_read_bw mean 2 395 MB/s 893 MB/s
sequential_write_bw mean 1 252 MB/s 372 MB/s

Table data source in "3 runs summary" section right under

Maybe it comes from #21 ? Is the GO fio lib using same default parameters as fio cli ? Is there a bottleneck due to go implementation ? (I'm not a GO dev, so I can't investigate this way).

3 runs summary

Here is the summary of 3 differents run of boths :

== ksb ====

  # RUN 1
  Random Read/Write IOPS: 40.1k/7725. BW: 1549MiB/s/ 761MiB/s
  Average Latency (usec) Read/Write: 297.39/5849.94
  Sequential Read/Write: 2301MiB/s / 1263MiB/s 
  Mixed Random Read/Write IOPS: 16.3k/5423

  # RUN 2
  Random Read/Write IOPS: 36.9k/7723. BW: 1598MiB/s/ 753MiB/s
  Average Latency (usec) Read/Write: 304.13/5728.55
  Sequential Read/Write: 2492MiB/s / 1264MiB/s
  Mixed Random Read/Write IOPS: 16.3k/5428

  # RUN 3
  Random Read/Write IOPS: 34.0k/7737. BW: 1601MiB/s/ 750MiB/s
  Average Latency (usec) Read/Write: 297.36/5898.81
  Sequential Read/Write: 2393MiB/s / 1231MiB/s
  Mixed Random Read/Write IOPS: 16.2k/5438

== kubestr ====

  # RUN 1
  read_iops : IOPS=7262.390137 BW(KiB/s)=29066
  write_iops : IOPS=3011.251709 BW(KiB/s)=12061
  read_bw : IOPS=6880.636719 BW(KiB/s)=881258
  write_bw : IOPS=2900.812744 BW(KiB/s)=371841

  # RUN 2
  read_iops : IOPS=6978.349121 BW(KiB/s)=27930
  write_iops : IOPS=2889.495361 BW(KiB/s)=11574
  read_bw : IOPS=6923.855957 BW(KiB/s)=886790
  write_bw : IOPS=2860.881836 BW(KiB/s)=366729

  # RUN 3
  read_iops : IOPS=7422.167480 BW(KiB/s)=29705
  write_iops : IOPS=2996.003906 BW(KiB/s)=12000
  read_bw : IOPS=7122.394531 BW(KiB/s)=912203
  write_bw : IOPS=2956.779541 BW(KiB/s)=379004

Details

Benchmark setup :

  • Cluster: 3 nodes k8s cluster on k3s 1.20.6, Calico
  • Nodes (each) : dual AMD EPYC 7262, 128Go RAM , 2*1To NVME Samsung PRO 980 PRO, NIC Intel XL710 40Gbit/s
  • OS : Ubuntu 20.04 with HWE kernel (5.8.0-50-generic)
  • Network : Dedicated Supermicro 40Gbit/s switch, nodes connected via passive copper QSFP+ DAC length < 1m
  • Rook 1.6 ceph v15.2.10-20210318, replicapool replicated RF3 nvme only, storage class RWO rook-ceph-block

Here is detailed raw result with ksb (PVC 100Gi) :

root@a11:/home/ubuntu# SIZE=100G ./ksb.sh rook-ceph-block
Working dir: /root

Testing Read IOPS...
read_iops: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
read_iops: Laying out IO file (1 file / 2048MiB)
Jobs: 1 (f=1): [r(1)][100.0%][r=147MiB/s][r=37.7k IOPS][eta 00m:00s]
read_iops: (groupid=0, jobs=1): err= 0: pid=46: Tue Apr 27 10:46:00 2021
  read: IOPS=38.2k, BW=149MiB/s (157MB/s)(2240MiB/15003msec)
   bw (  KiB/s): min=122328, max=172168, per=100.00%, avg=152990.97, stdev=11808.14, samples=30
   iops        : min=30582, max=43042, avg=38247.67, stdev=2951.99, samples=30
  cpu          : usr=6.82%, sys=23.66%, ctx=312142, majf=0, minf=162
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=573456,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=149MiB/s (157MB/s), 149MiB/s-149MiB/s (157MB/s-157MB/s), io=2240MiB (2349MB), run=15003-15003msec

Disk stats (read/write):
  rbd0: ios=645294/141, merge=0/6, ticks=792122/597, in_queue=792718, util=99.51%


Testing Write IOPS...
write_iops: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
Jobs: 1 (f=1): [w(1)][100.0%][w=30.4MiB/s][w=7782 IOPS][eta 00m:00s]
write_iops: (groupid=0, jobs=1): err= 0: pid=86: Tue Apr 27 10:46:18 2021
  write: IOPS=7208, BW=28.2MiB/s (29.5MB/s)(423MiB/15015msec); 0 zone resets
   bw (  KiB/s): min=26328, max=31863, per=100.00%, avg=28867.60, stdev=1705.24, samples=30
   iops        : min= 6582, max= 7965, avg=7216.73, stdev=426.28, samples=30
  cpu          : usr=2.35%, sys=7.70%, ctx=89241, majf=0, minf=153
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=0,108240,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
  WRITE: bw=28.2MiB/s (29.5MB/s), 28.2MiB/s-28.2MiB/s (29.5MB/s-29.5MB/s), io=423MiB (444MB), run=15015-15015msec

Disk stats (read/write):
  rbd0: ios=0/123851, merge=0/25, ticks=0/1033589, in_queue=1033588, util=99.46%


Testing Read Bandwidth...
read_bw: (g=0): rw=randread, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
Jobs: 1 (f=1): [r(1)][100.0%][r=1605MiB/s][r=12.8k IOPS][eta 00m:00s]
read_bw: (groupid=0, jobs=1): err= 0: pid=126: Tue Apr 27 10:46:35 2021
  read: IOPS=12.9k, BW=1619MiB/s (1698MB/s)(23.7GiB/15008msec)
   bw (  MiB/s): min= 1504, max= 1744, per=100.00%, avg=1620.75, stdev=58.17, samples=30
   iops        : min=12038, max=13959, avg=12965.77, stdev=465.34, samples=30
  cpu          : usr=3.60%, sys=20.02%, ctx=172811, majf=0, minf=4175
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=194346,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=1619MiB/s (1698MB/s), 1619MiB/s-1619MiB/s (1698MB/s-1698MB/s), io=23.7GiB (25.5GB), run=15008-15008msec

Disk stats (read/write):
  rbd0: ios=221157/144, merge=0/8, ticks=979852/1116, in_queue=980967, util=99.54%


Testing Write Bandwidth...
write_bw: (g=0): rw=randwrite, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
Jobs: 1 (f=1): [w(1)][100.0%][w=768MiB/s][w=6146 IOPS][eta 00m:00s]
write_bw: (groupid=0, jobs=1): err= 0: pid=166: Tue Apr 27 10:46:53 2021
  write: IOPS=6054, BW=757MiB/s (794MB/s)(11.1GiB/15016msec); 0 zone resets
   bw (  KiB/s): min=702976, max=813568, per=100.00%, avg=776050.23, stdev=23294.38, samples=30
   iops        : min= 5492, max= 6356, avg=6062.70, stdev=182.05, samples=30
  cpu          : usr=4.98%, sys=9.30%, ctx=54072, majf=0, minf=2221
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=0,90918,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
  WRITE: bw=757MiB/s (794MB/s), 757MiB/s-757MiB/s (794MB/s-794MB/s), io=11.1GiB (11.9GB), run=15016-15016msec

Disk stats (read/write):
  rbd0: ios=0/102094, merge=0/8, ticks=0/1021047, in_queue=1021048, util=99.49%


Testing Read Latency...
read_latency: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=4
fio-3.25
Starting 1 process
Jobs: 1 (f=1): [r(1)][100.0%][r=50.9MiB/s][r=13.0k IOPS][eta 00m:00s]
read_latency: (groupid=0, jobs=1): err= 0: pid=206: Tue Apr 27 10:47:11 2021
  read: IOPS=12.9k, BW=50.5MiB/s (53.0MB/s)(758MiB/15001msec)
    slat (nsec): min=1780, max=324313, avg=8248.55, stdev=9018.16
    clat (usec): min=73, max=12560, avg=299.40, stdev=121.16
     lat (usec): min=182, max=12567, avg=307.81, stdev=120.98
    clat percentiles (usec):
     |  1.00th=[  210],  5.00th=[  233], 10.00th=[  245], 20.00th=[  260],
     | 30.00th=[  269], 40.00th=[  281], 50.00th=[  289], 60.00th=[  302],
     | 70.00th=[  314], 80.00th=[  330], 90.00th=[  355], 95.00th=[  383],
     | 99.00th=[  469], 99.50th=[  586], 99.90th=[ 1012], 99.95th=[ 1270],
     | 99.99th=[ 5735]
   bw (  KiB/s): min=48745, max=53555, per=99.90%, avg=51709.52, stdev=1168.71, samples=29
   iops        : min=12186, max=13388, avg=12927.31, stdev=292.16, samples=29
  lat (usec)   : 100=0.01%, 250=13.68%, 500=85.58%, 750=0.35%, 1000=0.27%
  lat (msec)   : 2=0.08%, 4=0.02%, 10=0.01%, 20=0.01%
  cpu          : usr=3.82%, sys=13.11%, ctx=168210, majf=0, minf=113
  IO depths    : 1=0.0%, 2=0.0%, 4=100.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=194119,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=4

Run status group 0 (all jobs):
   READ: bw=50.5MiB/s (53.0MB/s), 50.5MiB/s-50.5MiB/s (53.0MB/s-53.0MB/s), io=758MiB (795MB), run=15001-15001msec

Disk stats (read/write):
  rbd0: ios=220153/146, merge=0/7, ticks=65215/533, in_queue=65748, util=99.51%


Testing Write Latency...
write_latency: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=4
fio-3.25
Starting 1 process
Jobs: 1 (f=1): [w(1)][100.0%][w=2790KiB/s][w=697 IOPS][eta 00m:00s]
write_latency: (groupid=0, jobs=1): err= 0: pid=246: Tue Apr 27 10:47:28 2021
  write: IOPS=661, BW=2648KiB/s (2712kB/s)(38.8MiB/15006msec); 0 zone resets
    slat (nsec): min=1920, max=3907.7k, avg=36237.70, stdev=63117.02
    clat (usec): min=4316, max=17046, avg=6003.29, stdev=975.97
     lat (usec): min=4334, max=17054, avg=6039.90, stdev=977.57
    clat percentiles (usec):
     |  1.00th=[ 4752],  5.00th=[ 5276], 10.00th=[ 5407], 20.00th=[ 5473],
     | 30.00th=[ 5538], 40.00th=[ 5604], 50.00th=[ 5669], 60.00th=[ 5735],
     | 70.00th=[ 5866], 80.00th=[ 6390], 90.00th=[ 7308], 95.00th=[ 8455],
     | 99.00th=[ 9503], 99.50th=[ 9896], 99.90th=[12125], 99.95th=[12911],
     | 99.99th=[17171]
   bw (  KiB/s): min= 2512, max= 2845, per=100.00%, avg=2649.33, stdev=112.86, samples=30
   iops        : min=  628, max=  711, avg=662.27, stdev=28.22, samples=30
  lat (msec)   : 10=99.58%, 20=0.45%
  cpu          : usr=0.37%, sys=1.35%, ctx=11898, majf=0, minf=58
  IO depths    : 1=0.0%, 2=0.0%, 4=100.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=0,9931,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=4

Run status group 0 (all jobs):
  WRITE: bw=2648KiB/s (2712kB/s), 2648KiB/s-2648KiB/s (2712kB/s-2712kB/s), io=38.8MiB (40.7MB), run=15006-15006msec

Disk stats (read/write):
  rbd0: ios=0/11361, merge=0/6, ticks=0/67718, in_queue=67717, util=99.49%


Testing Read Sequential Speed...
read_seq: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=16
...
fio-3.25
Starting 4 threads
read_seq: Laying out IO file (1 file / 3548MiB)
Jobs: 4 (f=4): [R(4)][100.0%][r=2035MiB/s][r=2035 IOPS][eta 00m:00s]
read_seq: (groupid=0, jobs=1): err= 0: pid=286: Tue Apr 27 10:47:51 2021
  read: IOPS=575, BW=576MiB/s (604MB/s)(8689MiB/15085msec)
   bw (  KiB/s): min=382976, max=808960, per=24.95%, avg=590270.97, stdev=106351.44, samples=30
   iops        : min=  374, max=  790, avg=576.30, stdev=103.81, samples=30
  cpu          : usr=0.22%, sys=3.79%, ctx=8762, majf=0, minf=4101
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=8674,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16
read_seq: (groupid=0, jobs=1): err= 0: pid=287: Tue Apr 27 10:47:51 2021
  read: IOPS=579, BW=581MiB/s (609MB/s)(8769MiB/15101msec)
   bw (  KiB/s): min=362496, max=776192, per=25.12%, avg=594193.93, stdev=111274.39, samples=30
   iops        : min=  354, max=  758, avg=580.07, stdev=108.68, samples=30
  cpu          : usr=0.19%, sys=3.72%, ctx=8817, majf=0, minf=4103
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=8754,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16
read_seq: (groupid=0, jobs=1): err= 0: pid=288: Tue Apr 27 10:47:51 2021
  read: IOPS=581, BW=582MiB/s (611MB/s)(8798MiB/15104msec)
   bw (  KiB/s): min=411648, max=897277, per=25.24%, avg=596932.17, stdev=117668.12, samples=30
   iops        : min=  402, max=  876, avg=582.93, stdev=114.89, samples=30
  cpu          : usr=0.21%, sys=3.85%, ctx=8898, majf=0, minf=4106
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=8783,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16
read_seq: (groupid=0, jobs=1): err= 0: pid=289: Tue Apr 27 10:47:51 2021
  read: IOPS=573, BW=574MiB/s (602MB/s)(8633MiB/15036msec)
   bw (  KiB/s): min=389120, max=743424, per=24.87%, avg=588279.20, stdev=92137.85, samples=30
   iops        : min=  380, max=  726, avg=574.30, stdev=90.00, samples=30
  cpu          : usr=0.26%, sys=3.63%, ctx=8998, majf=0, minf=4101
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=8618,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16

Run status group 0 (all jobs):
   READ: bw=2310MiB/s (2422MB/s), 574MiB/s-582MiB/s (602MB/s-611MB/s), io=34.1GiB (36.6GB), run=15036-15104msec

Disk stats (read/write):
  rbd0: ios=37598/2, merge=0/1, ticks=1039918/95, in_queue=1040013, util=95.50%


Testing Write Sequential Speed...
write_seq: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=16
...
fio-3.25
Starting 4 threads
Jobs: 4 (f=4): [W(4)][100.0%][w=1188MiB/s][w=1188 IOPS][eta 00m:00s]
write_seq: (groupid=0, jobs=1): err= 0: pid=329: Tue Apr 27 10:48:09 2021
  write: IOPS=289, BW=291MiB/s (305MB/s)(4432MiB/15249msec); 0 zone resets
   bw (  KiB/s): min=133386, max=385024, per=25.58%, avg=298442.87, stdev=61328.54, samples=30
   iops        : min=  130, max=  376, avg=291.33, stdev=59.93, samples=30
  cpu          : usr=1.97%, sys=1.99%, ctx=3453, majf=0, minf=0
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,4417,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16
write_seq: (groupid=0, jobs=1): err= 0: pid=330: Tue Apr 27 10:48:09 2021
  write: IOPS=286, BW=287MiB/s (301MB/s)(4374MiB/15231msec); 0 zone resets
   bw (  KiB/s): min=104448, max=376832, per=25.25%, avg=294606.67, stdev=66400.06, samples=30
   iops        : min=  102, max=  368, avg=287.60, stdev=64.80, samples=30
  cpu          : usr=2.02%, sys=1.90%, ctx=3238, majf=0, minf=0
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,4359,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16
write_seq: (groupid=0, jobs=1): err= 0: pid=331: Tue Apr 27 10:48:09 2021
  write: IOPS=281, BW=282MiB/s (296MB/s)(4297MiB/15234msec); 0 zone resets
   bw (  KiB/s): min=116736, max=366592, per=24.91%, avg=290595.97, stdev=59872.16, samples=30
   iops        : min=  114, max=  358, avg=283.70, stdev=58.52, samples=30
  cpu          : usr=1.84%, sys=2.07%, ctx=3097, majf=0, minf=0
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,4282,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16
write_seq: (groupid=0, jobs=1): err= 0: pid=332: Tue Apr 27 10:48:09 2021
  write: IOPS=279, BW=281MiB/s (294MB/s)(4269MiB/15218msec); 0 zone resets
   bw (  KiB/s): min=106496, max=357066, per=24.69%, avg=288026.73, stdev=57796.18, samples=30
   iops        : min=  104, max=  348, avg=281.20, stdev=56.42, samples=30
  cpu          : usr=1.85%, sys=1.95%, ctx=3080, majf=0, minf=0
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,4254,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16

Run status group 0 (all jobs):
  WRITE: bw=1139MiB/s (1195MB/s), 281MiB/s-291MiB/s (294MB/s-305MB/s), io=16.0GiB (18.2GB), run=15218-15249msec

Disk stats (read/write):
  rbd0: ios=0/19434, merge=0/3, ticks=0/968627, in_queue=968627, util=96.12%


Testing Read/Write Mixed...
rw_mix: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.25
Starting 1 process
Jobs: 1 (f=1): [m(1)][100.0%][r=60.1MiB/s,w=20.1MiB/s][r=15.4k,w=5142 IOPS][eta 00m:00s]
rw_mix: (groupid=0, jobs=1): err= 0: pid=372: Tue Apr 27 10:48:26 2021
  read: IOPS=16.5k, BW=64.3MiB/s (67.5MB/s)(966MiB/15009msec)
   bw (  KiB/s): min=61098, max=70044, per=100.00%, avg=65950.90, stdev=2498.48, samples=30
   iops        : min=15274, max=17511, avg=16487.70, stdev=624.55, samples=30
  write: IOPS=5520, BW=21.6MiB/s (22.6MB/s)(324MiB/15009msec); 0 zone resets
   bw (  KiB/s): min=20576, max=23270, per=100.00%, avg=22109.20, stdev=737.84, samples=30
   iops        : min= 5144, max= 5817, avg=5527.13, stdev=184.48, samples=30
  cpu          : usr=5.64%, sys=17.62%, ctx=223689, majf=0, minf=158
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=247198,82860,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=64.3MiB/s (67.5MB/s), 64.3MiB/s-64.3MiB/s (67.5MB/s-67.5MB/s), io=966MiB (1013MB), run=15009-15009msec
  WRITE: bw=21.6MiB/s (22.6MB/s), 21.6MiB/s-21.6MiB/s (22.6MB/s-22.6MB/s), io=324MiB (340MB), run=15009-15009msec

Disk stats (read/write):
  rbd0: ios=281213/94227, merge=0/3, ticks=271927/781055, in_queue=1052982, util=99.50%


All tests complete.

==================
= Dbench Summary =
==================
Random Read/Write IOPS: 38.2k/7208. BW: 1619MiB/s/ 757MiB/s
Average Latency (usec) Read/Write: 307.81/6039.90
Sequential Read/Write: 2310MiB/s / 1139MiB/s
Mixed Random Read/Write IOPS: 16.5k/5520

And a detailed run of kubestr on the very same cluster :

root@a11:/home/ubuntu# ./kubestr fio -s rook-ceph-block
PVC created kubestr-fio-pvc-6g57t
Pod created kubestr-fio-pod-8vg7d
Running FIO test (default-fio) on StorageClass (rook-ceph-block) with a PVC of Size (100Gi)
Elapsed time- 23.788700232s
FIO test results:

FIO version - fio-3.20
Global options - ioengine=libaio verify=0 direct=1 gtod_reduce=1

JobName: read_iops
  blocksize=4K filesize=2G iodepth=64 rw=randread
read:
  IOPS=7593.140137 BW(KiB/s)=30389
  iops: min=5487 max=8832 avg=7575.275879
  bw(KiB/s): min=21948 max=35328 avg=30301.517578

JobName: write_iops
  blocksize=4K filesize=2G iodepth=64 rw=randwrite
write:
  IOPS=3047.327393 BW(KiB/s)=12206
  iops: min=2748 max=3367 avg=3042.758545
  bw(KiB/s): min=10992 max=13469 avg=12171.517578

JobName: read_bw
  blocksize=128K filesize=2G iodepth=64 rw=randread
read:
  IOPS=7096.563477 BW(KiB/s)=908897
  iops: min=6133 max=7996 avg=7098.965332
  bw(KiB/s): min=785117 max=1023488 avg=908686.375000

JobName: write_bw
  blocksize=128k filesize=2G iodepth=64 rw=randwrite
write:
  IOPS=2983.352295 BW(KiB/s)=382406
  iops: min=2626 max=3291 avg=2976.689697
  bw(KiB/s): min=336223 max=421301 avg=381031.781250

Disk stats (read/write):
  rbd0: ios=250119/102559 merge=0/1067 ticks=2022985/1744046 in_queue=3767031, util=99.583794%
  -  OK

@AlexisDucastel I ran kubestr using your image using ./kubestr fio -i infrabuilder/iobench -s do-block-storage and got the same results. So you are right, it has nothing to do with the image.

I do suspect it depends on how the fio command is being invoked. In your script you are calling the fio command multiple times with different configurations. However, Kubestr is calling it using an FIO file with multiple jobs-
[global] randrepeat=0 verify=0 ioengine=libaio direct=1 gtod_reduce=1 [job1] name=read_iops bs=4K iodepth=64 size=2G readwrite=randread time_based ramp_time=2s runtime=15s [job2] name=write_iops bs=4K iodepth=64 size=2G readwrite=randwrite time_based ramp_time=2s runtime=15s [job3] name=read_bw bs=128K iodepth=64 size=2G readwrite=randread time_based ramp_time=2s runtime=15s [job4] name=write_bw bs=128k iodepth=64 size=2G readwrite=randwrite time_based ramp_time=2s runtime=15s

I may have assumed these jobs are serialized. Can you try with this fio file and see if you have similar results.

@AlexisDucastel Yep that was it. I ran it with a single job ./kubestr fio -s do-block-storage -f /tmp/fiojob where /tmp/fiojob is [global] randrepeat=0 verify=0 ioengine=libaio direct=1 gtod_reduce=1 [job1] name=read_iops bs=4K iodepth=64 size=2G readwrite=randread time_based ramp_time=2s runtime=15s and I see the results you are seeing.

This may be a low priority fix. It can be done already with the given cli. However if this was to be supported we need to find a way to better collect the results.

Adding wait_for_previous to your fio [job] definition is an option too
https://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-stonewall