---
title: How to Measure IOPS Using fio
slug: install-10x/how-to-measure-iops-using-fio
docTags: 
createdAt: 2025-12-12T11:54:19.635Z
---

It is important that your Swimlane instance meets the minimum required IOPS, otherwise severe performance degradation can result. Also, you risk your instance being unsupported by Swimlane.

This article describes one way to measure IOPS using the *fio* tool.

Note: Because of file caching, the results of *fio* can vary depending on when you run the command. To reduce that variance, we recommend running *fio* several times a day over a couple of days and averaging the result.

Instal&#x6C;*&#x20;fio* if not already installed:

Fedora-based Linux (e.g. Red Hat, CentOS)

:::BlockQuote
$ sudo yum install fio
:::

Debian-based Linux (e.g. Ubuntu)

:::BlockQuote
$ sudo apt-get install fio
:::

Then run this command on each of your cluster nodes. It will run for a few minutes with output that updates in real time; when it's finished it, will have final output similar to this:

:::BlockQuote
$ fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --numjobs=1 --size=4g --iodepth=1 --runtime=60 --time\_based --end\_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=posixaio, iodepth=1
fio-3.7
Starting 1 process
random-write: Laying out IO file (1 file / 4096MiB)
Jobs: 1 (f=1): \[F(1)]\[100.0%]\[r=0KiB/s,w=0KiB/s]\[r=0,w=0 IOPS]\[eta 00m:00s]     &#x20;
random-write: (groupid=0, jobs=1): err= 0: pid=4168: Thu Aug 19 11:09:57 2021
&#x20; write: IOPS=3994, BW=15.6MiB/s (16.4MB/s)(2449MiB/156935msec)
&#x20;   slat (nsec): min=1681, max=105529k, avg=4310.96, stdev=142005.21
&#x20;   clat (nsec): min=820, max=228958k, avg=89450.02, stdev=1359359.52
&#x20;    lat (usec): min=11, max=228961, avg=93.76, stdev=1370.29
&#x20;   clat percentiles (usec):
&#x20;    \|  1.00th=\[   11],  5.00th=\[   12], 10.00th=\[   14], 20.00th=\[   16],
&#x20;    \| 30.00th=\[   19], 40.00th=\[   20], 50.00th=\[   20], 60.00th=\[   21],
&#x20;    \| 70.00th=\[   23], 80.00th=\[   29], 90.00th=\[   36], 95.00th=\[   48],
&#x20;    \| 99.00th=\[  130], 99.50th=\[  791], 99.90th=\[21103], 99.95th=\[28967],
&#x20;    \| 99.99th=\[50070]
&#x20;  bw (  KiB/s): min= 3787, max=227400, per=100.00%, avg=41644.82, stdev=54714.18, samples=120
&#x20;  iops        : min=  946, max=56850, avg=10411.00, stdev=13678.61, samples=120
&#x20; lat (nsec)   : 1000=0.01%
&#x20; lat (usec)   : 2=0.01%, 4=0.01%, 10=0.01%, 20=52.57%, 50=42.84%
&#x20; lat (usec)   : 100=3.25%, 250=0.65%, 500=0.13%, 750=0.05%, 1000=0.04%
&#x20; lat (msec)   : 2=0.08%, 4=0.05%, 10=0.09%, 20=0.13%, 50=0.10%
&#x20; lat (msec)   : 100=0.01%, 250=0.01%
&#x20; cpu          : usr=2.06%, sys=2.00%, ctx=627931, majf=0, minf=50
&#x20; IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
&#x20;    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
&#x20;    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
&#x20;    issued rwts: total=0,626892,0,1 short=0,0,0,0 dropped=0,0,0,0
&#x20;    latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
&#x20; WRITE: bw=15.6MiB/s (16.4MB/s), 15.6MiB/s-15.6MiB/s (16.4MB/s-16.4MB/s), io=2449MiB (2568MB), run=156935-156935msec

Disk stats (read/write):
&#x20;   dm-0: ios=453/462780, merge=0/0, ticks=1795/7586994, in\_queue=7615234, util=93.05%, aggrios=453/460952, aggrmerge=0/1823, aggrticks=1795/7571606, aggrin\_queue=7572764, aggrutil=92.87%
&#x20; sda: ios=453/460952, merge=0/1823, ticks=1795/7571606, in\_queue=7572764, util=92.87%
:::

Using this piece of the output:
”…
WRITE: bw=15.6MiB/s (**16.4**MB/s), 15.6MiB/s-15.6MiB/s (16.4MB/s-16.4MB/s)…
…”
convert the number in **bold** to IOPS using this formula: (**MBps Throughput** / 4) \* 1024.

In this example: IOPS = (**16.4**/4) \* 1024 = 4198.4.

If the **bold** number is less than 11.7 MB/s, then you do not meet the minimum required 3000 IOPS.
