IOPING(1)
π ioping(1) β the manual, but make it make sense π
okay bestie, welcome to IOPING, a User Commands classic, and honestly? she's iconic. she generates every I/O pattern you could want and lets you watch your disk's speed and latency in real time like it's a livestream. no cap. π«Ά
β¨ NAME β¨
ioping β simple disk I/O latency monitoring tool
πΈ SYNOPSYS πΈ
ioping [-ABCDJLNRWGYykq] [-a count] [-b count] [-c count] [-e seed]
[-i interval] [-l speed] [-r rate] [-t time] [-T time] [-s size]
[-S wsize] [-o offset] [-w deadline] [-p period] [-P period]
[-I [format]] directory|file|device
ioping -h | -v
π¦ DESCRIPTION π¦
so like, this tool generates a whole bunch of different I/O patterns and lets you monitor I/O speed and latency in real time. it's giving observability. it's giving main character energy for your disk. β¨
π OPTIONS π
-a,-warmup countβ skips the firstcountrequests when it's doing statistics, default is1. why? bc that very first request is usually way slower than the rest (power-saving features waking up and being dramatic π). so we just... ignore her.-b,-burst countβ fires off a series ofcountrequests with no delay between them, default0. bc aggressive power-saving features can still slow requests down even after a short lil delay. annoying fr.-c,-count countβ stop aftercountrequests. default0, which means infinite. she'll go forever, bestie. π-e,-entropy seedβ set the seed for the random number generator. default0, which means actually random.-i,-interval timeβ set the time between requests, default1s.-l,-speed-limit sizeβ set a speed limit in size per second. it increases the interval torequest-size / speed.-r,-rate-limit countβ set a rate limit in count per second. it increases the interval to1 / rate.-t,-min-time timeβ the minimal valid request time, default0us. requests that are too fast get ignored in the statistics. bye girl.-T,-max-time timeβ the maximum valid request time. requests that are too slow also get ignored in the statistics. sorry babe.-s,-size sizeβ request size, default4k.-S,-work-size sizeβ working set size. default is1mfor a directory, and the whole size for a file or device.-o,-work-offset sizeβ starting offset in the file/device, default0.-w,-work-time timeβ stop aftertimehas passed, default0(infinite). she's immortal by default, periodt.-p,-print-count countβ print raw statistics for everycountrequests (see the format below, bestie π).-P,-print-interval timeβ print raw statistics everytime.-A,-asyncβ use asynchronous I/O (io_setup(2),io_submit(2)etc syscalls). fancy.-B,-batchβ batch mode. be quiet and print the final statistics in raw format. lowkey introvert mode.-C,-cachedβ use cached I/O. this suppresses cache invalidation viaposix_fadvise(2)before read andfdatasync(2)after each write.-D,-directβ use direct I/O (seeO_DIRECTinopen(2)).-I,-time [format]β print the current time for each request. the optional argument defines the time format instrftime(3)notation, and the default is"%b %d %T"(so likeJan 01 00:00:00).-J,-jsonβ print output in JSON format. for the girlies who pipe things intojqπ-L,-linearβ use sequential operations instead of random ones. this also sets the default request size to256k(as in-size 256k).-N,-nowaitβ setRWF_NOWAITon I/O, which tells the kernel "do not wait if the request cannot be executed immediately" (seeRWF_NOWAITinpreadv2(2)). she's impatient and honestly? valid.-R,-rapidβ disk seek rate test, or a bandwidth test if you use it together with-linear.
this option suppresses human-readable output for each request (like -quiet does), sets the default interval to zero (-interval 0), stops measurement after 3 seconds (-work-time 3) and increases the default working set size to 64m (-work-size 64m). also: the working set (-work-size) should be increased accordingly if the disk has a huge hardware cache. keep that in mind bestie.
-W,-writeβ use writes rather than reads. safe for a temporary file in a directory target. write I/O gives more reliable results for systems where non-cached reads aren't supported or are cached at some level.
β οΈ this might be DANGEROUS for a file/device: it will shred your data. in this case it should be repeated three times (-WWW). i am not kidding. she will eat your data. π
-G,-read-writeβ alternate read and write requests. she can't pick a lane and that's fine.-Y,-syncβ use sync I/O (seeO_SYNCinopen(2)).-y,-dsyncβ use data sync I/O (seeO_DSYNCinopen(2)).-k,-keepβ keep and reuse the temporary working file"ioping.tmp"(only for a directory target). she's a keeper, literally.-q,-quietβ suppress the periodical human-readable output.-h,-helpβ display the help message and exit.-v,-versionβ display the version and exit.
π Argument suffixes π
for options that expect a time argument (-interval, -print-interval and -work-time), the default is seconds, unless you specify one of these suffixes (and they're case-insensitive, we're not gatekeeping):
ns,nsecβ nanoseconds (a billionth of a second, 1 / 1 000 000 000)us,usecβ microseconds (a millionth of a second, 1 / 1 000 000)ms,msecβ milliseconds (a thousandth of a second, 1 / 1 000)s,secβ secondsm,minβ minutesh,hourβ hours
for options that expect a "size" argument (-size, -speed-limit, -work-size and -work-offset), the default is bytes, unless you specify one of these suffixes (also case-insensitive bestie):
sectorβ disk sectors (a sector is always 512).KiB,k,kbβ kilobytes (1 024 bytes)pageβ memory pages (a page is always 4KiB).MiB,m,mbβ megabytes (1 048 576 bytes)GiB,g,gbβ gigabytes (1 073 741 824 bytes)TiB,t,tbβ terabytes (1 099 511 627 776 bytes)
and for options that expect a "number" argument (-count and -print-count) you can optionally specify one of these suffixes (case-insensitive, ofc):
kβ kilo (thousands, 1 000)mβ mega (millions, 1 000 000)gβ giga (billions, 1 000 000 000)tβ tera (trillions, 1 000 000 000 000)
π₯ EXIT STATUS π₯
returns 0 upon success. and the following error codes are defined, so you know exactly what went wrong:
- invalid usage (error in arguments). skill issue tbh.
- error during the preparation stage.
- error during runtime.
π RAW STATISTICS π
ioping -print-count 100 -count 200 -interval 0 -quiet .
99 10970974 9024 36961531 90437 110818 358872 30756 100 12516420
100 9573265 10446 42785821 86849 95733 154609 10548 100 10649035
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
and here's what each lil number is, bestie:
- (1) count of requests in statistics
- (2) running time (nanoseconds)
- (3) requests per second (iops)
- (4) transfer speed (bytes per second)
- (5) minimal request time (nanoseconds)
- (6) average request time (nanoseconds)
- (7) maximum request time (nanoseconds)
- (8) request time standard deviation (nanoseconds)
- (9) total requests (including warmup, too slow or too fast ones)
- (10) total running time (nanoseconds)
π JSON OUTPUT π
with option -J|--json, ioping prints a json array of objects, like so:
[
...
{
// timestamps
"timestamp": (unix time in seconds as float),
"localtime": (local time ISO 8601),
// io target
"target": {
"path": (target path),
"fstype": (filesystem name),
"device": (device name),
"device_size": (device size in bytes)
},
// io request
"io": {
"request": (request index),
"operation": (request type: "read" | "write"),
"size": (request size in bytes),
"time": (io time in ns),
"ignored": (ignored in statistics: true | false)
},
// statistics
"stat": {
"count": (nr reqeusts),
"size": (total io size in bytes),
"time": (total io time in ns),
"iops": (avg iops),
"bps": (avg rate),
"min": (min io time in ns),
"avg": (avg io time in ns),
"max": (max io time in ns),
"mdev": (standard deviation in ns)
},
// load statistics
"load": {
"count": (nr requests),
"size": (total io size in bytes),
"time": (total real time in ns),
"iops": (avg iops),
"bps": (avg rate)
},
},
...
]
π EXAMPLES π
ioping .β show disk I/O latency using the default values and the current directory, until you interrupt it. this command prepares a temporary (unlinked/hidden) working file and reads random chunks from it using non-cached read requests. she's sneaky but productive.ioping -c 10 -s 1M /tmpβ measure latency on/tmpusing 10 requests of 1 megabyte each. quick lil vibe check.ioping -R /dev/sdaβ measure disk seek rate.ioping -RL /dev/sdaβ measure disk sequential speed.ioping -RLB . | awk '{print $4}'β get disk sequential speed in bytes per second. piping queen πioping -J . | jq -r --stream 'fromstream(1|truncate_stream(inputs)) | [.localtime, .io.time/1000000] | @tsv'β selectlocaltimeand io time in milliseconds from the json outout.
π«Ά SEE ALSO π«Ά
iostat(1), dd(1), fio(1), stress(1), stress-ng(1), dbench(1), sysbench(1), fsstress, xfstests, hdparm(8), badblocks(8)
π HOMEPAGE π
https://github.com/koct9i/ioping/
π AUTHORS π
this program was written by Konstantin Khlebnikov koct9i@gmail.com. the man-page was written by Kir Kolyshkin kir@openvz.org.
and that's the whole thing bestie, tysm for reading π₯Ήπ this page is from IOPING(1), dated Oct 2014, and it's part of the User Commands section β go forth and measure your I/O latency, you absolute icon. slay β¨π π¦
π¦ where this page comes from
- alpine 3.24: ioping-doc 1.3-r0 Β· GPL-3.0-or-later
- arch rolling: ioping 1.3-2 Β· GPL3
- debian bookworm: ioping 1.3-1 Β· GPL-3.0-or-later
- debian trixie: ioping 1.3-1 Β· GPL-3.0-or-later
- epel 10: ioping 1.3-9.el10_2 Β· GPL-3.0-or-later
- epel 9: ioping 1.3-1.el9 Β· GPLv3+
- fedora 43: ioping 1.3-9.fc43 Β· GPL-3.0-or-later
- fedora 44: ioping 1.3-10.fc44 Β· GPL-3.0-or-later
- nixpkgs unstable: ioping 1.3
- opensuse-leap 16.0: ioping 1.3-bp160.1.12 Β· GPL-3.0-or-later
- opensuse-leap 16.0: ioping 1.3-bp160.1.12 Β· GPL-3.0-or-later
- opensuse-leap 16.0: ioping 1.3-bp160.1.12 Β· GPL-3.0-or-later
- opensuse-leap 16.0: ioping 1.3-bp160.1.12 Β· GPL-3.0-or-later
- ubuntu noble: ioping 1.3-1 Β· GPL-3.0-or-later
- ubuntu questing: ioping 1.3-1
- ubuntu resolute: ioping 1.3-1build1 Β· GPL-3.0-or-later
- ubuntu stonking: ioping 1.3-1build1 Β· GPL-3.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms