IOTOP(8)

✨ NAME ✨

iotop(8) β€” simple top-like I/O monitor. Okay so bestie, this is the manual page for <rainbow>iotop</rainbow>: the top-like monitor that watches your I/O. It's giving system observability, no cap. πŸ’…

🌸 SYNOPSIS 🌸

iotop [OPTIONS]

Yep, that's the whole summoning spell. You pass options. Slay. 🫢

πŸ’– DESCRIPTION πŸ’–

iotop watches I/O usage information available in the Linux kernel (requires 2.6.20 or later) and displays a table of current I/O usage by processes or threads on the system. πŸ¦‹ For this to even work, at least the CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING, CONFIG_TASKSTATS and CONFIG_VM_EVENT_COUNTERS options need to be enabled in your Linux kernel build configuration. No config, no data, periodt.

Running iotop as non-root user is possible by adding the NET_ADMIN capability. This can be done by e.g.:

$ sudo setcap 'cap_net_admin+eip' <path-to>/iotop
⚠️ Be warned that this will also allow other users to run it and get access to information that normally should not be available to them. This is not a cute little permission sprinkle β€” it's a whole access pass, so be careful.

iotop displays columns for the I/O bandwidth read and written by each process/thread during the sampling period. It also displays the percentage of time the thread/process spent while swapping in and while waiting on I/O. For each process, its I/O priority (class/level) is shown. πŸ‘‘

In addition, the total I/O bandwidth read and written during the sampling period are displayed at the top of the interface. Total DISK READ and Total DISK WRITE values represent total read and write bandwidth between processes and kernel threads on one side and kernel block device subsystem on the other. While Current DISK READ and Current DISK WRITE values represent corresponding bandwidths for current disk I/O between the kernel block device subsystem and the underlying hardware (HDD, SSD, etc.). Thus Total and Current values may not be equal at any given moment of time due to data caching and I/O operations reordering that take place inside the Linux kernel. ✨

Now the keyboard lore, bestie. Use the left and right arrows to select the sort column, r or space to reverse the sorting order, o to toggle the --only option (this uses the visible values from the GRAPH column or the IO column in case the GRAPH column is hidden), p to toggle the --processes option, a to cycle between the --accumulated, --accum-bw and normal operation, i to change the priority of a thread or a process's thread, f to change filtering by UID/PID (--user and --pid options), 1-9 to toggle the visibility of the respective column, v to toggle the visibility of the VFS READ and VFS WRITE columns, 0 to show all columns, up/down arrows, page-up/page-down/home/end keys to scroll and q to quit. Any unrecognized key will be ignored. πŸ’€

All processes or threads that have exited are displayed grayed for as long as their data is visible in the GRAPH column, or for two refresh cycles when it is hidden. The invalid data points in the GRAPH column are displayed inverse or with letter x (see option --dead-x and x shortcut). When using Unicode characters each position contains two datapoints and only the positions with two invalid data points are reversed. 🌈

It is possible for threads of a process to have different priority from their main process. This is shown with ! in the PRIO column of the main process as e.g. !be/4. 😭

With -P the values of a process include all its threads. When showing threads, the row of the main process shows only the values of the main thread.

When showing threads, they appear below their main process, unless they are listed alone with --flat. The processes are sorted by the values of the whole process and the threads of each process by their own values.

There are two ways to change the IO priority of a process or thread β€” press i and use arrows to select the process or thread from the visible ones on screen, or press i and type its TID (PID and TID have the same value for the main process). Then use tab and arrows to change the priority value and confirm with enter. Shortcuts esc or q will cancel this mode.

To change the UID and PID filters, press f and use tab to select the UID or PID field, then type the numerical id or n to remove the filter and confirm with enter. Filtering is always done by TID because it is unique. Note that for the main process PID is the same as TID. Shortcuts esc or q will cancel this mode.

Starting with Linux kernel 5.14.x task_delayacct is configurable at runtime and set to off by default. This setting can be changed in interactive mode by the Ctrl-T shortcut. In batch mode a warning is printed when the setting is OFF. From the command line this can be enabled by:

$ sudo sysctl kernel.task_delayacct=1

and disabled again by:

$ sudo sysctl kernel.task_delayacct=0

It is advisable to keep this option off when not using this or another monitoring program because when enabled it has some effect on system performance. 🌸

✨ OPTIONS ✨

okay bestie, this is the big one β€” every single flag iotop has, no skips, no shortcuts. buckle up πŸ’–

  • -v, --version β€” prints the version number and dips out. that's it, that's the whole job πŸ’…
  • -h, --help β€” shows you the usage info and exits. when you're lost, this is your girl 🫢
  • -H, --help-type=TYPE β€” picks which flavor of interactive help you get. accepted values for TYPE: none, win, and inline. choose your own adventure ✨
  • -o, --only β€” only shows processes or threads that are actually doing I/O, instead of every single process or thread. you can flip this on and off live by smashing o πŸ”₯
  • --no-only β€” shows all processes or threads. the "everyone's invited" mode πŸŽ€
  • -b, --batch β€” turns on non-interactive mode. absolutely iconic for logging I/O usage over time. the columns of non-interactive mode are fixed so the output can be parsed, meaning: the options that hide or show columns (including ones from the config file) apply only to the interactive view β€” with one exception, the VFS READ and VFS WRITE columns πŸ‘‘
  • -n NUM, --iter=NUM β€” sets the number of iterations before quitting (by default it never quits, fr fr). this is mostly useful in non-interactive mode.
  • -d SEC, --delay=SEC β€” sets the delay between iterations in seconds (1 second by default). it accepts non-integer values, so go wild with like 1.1 seconds ⏱️
  • -p PID, --pid=PID β€” a process/thread id to monitor (all by default). in non-interactive mode, only the tasks of its process are read, which is much faster on systems with many tasks β€” but heads up, the Total DISK READ and Total DISK WRITE then cover only that process πŸ’€
  • -u USER, --user=USER β€” a user id to monitor (all by default). it gets matched against the real user id of the tasks, which is what the USER column shows. the value will always be resolved first, unless it's prefixed by +, in which case it's treated as numeric only. values that don't resolve but look numeric get used as numeric. no cap 🧠
  • -P, --processes β€” only shows processes. normally iotop shows processes and all threads, so this is the "just the mains" setting.
  • --threads β€” shows processes and all threads. the full ensemble cast 🌈
  • --flat β€” lists the threads alone, sorted by their own values, instead of grouping them below their process. has no effect when only processes are shown, and no effect in batch mode β€” which always lists the threads alone anyway.
  • --no-flat β€” lists the threads grouped below their process. nesting energy πŸͺ†
  • -a, --accumulated β€” shows accumulated I/O instead of bandwidth. in this mode iotop shows the amount of I/O processes have done since they started, or (with --no-lifetime) since iotop first saw them. ⚠️ note that this option and --accum-bw are exclusive β€” they will turn each other off.
  • --no-accumulated β€” shows bandwidth. useful when you're changing the config file with --write.
  • -A, --accum-bw β€” shows accumulated I/O as bandwidth for the whole sampling period. in this mode iotop shows the amount of I/O per second for the whole period since the process started, or (with --no-lifetime) since iotop first saw it. ⚠️ note that this option and --accumulated are exclusive β€” they will turn each other off.
  • --no-accum-bw β€” shows bandwidth. useful when you're changing the config file with --write.
  • --lifetime β€” accumulates the I/O of each process or thread since it started. this is the default. important nuance bestie: the kernel counts the I/O of each thread, so a process's total includes its threads that iotop saw, but not the threads that exited before. with --accum-bw the average is over the time since the process or thread started 🧚
  • --no-lifetime β€” accumulates the I/O of each process or thread since iotop first saw it.
  • -k, --kilobytes β€” use kilobytes instead of a human friendly unit. this mode is a lifesaver when scripting the batch mode of iotop β€” instead of picking the most appropriate unit, iotop will display all sizes in kilobytes πŸ“
  • --no-kilobytes β€” use human friendly units. back to the vibes 🌸
  • -t, --time, --timestamp β€” adds a timestamp on each line (this implies --batch). every line gets prefixed by the current time πŸ•
  • -c, --fullcmdline β€” shows processes' full file path and parameters. the whole receipts.
  • --no-fullcmdline β€” shows processes' names only.
  • -1, --hide-pid β€” hides the PID/TID column.
  • --show-pid β€” shows the PID/TID column.
  • -2, --hide-prio β€” hides the PRIO column.
  • --show-prio β€” shows the PRIO column.
  • -3, --hide-user β€” hides the USER column.
  • --show-user β€” shows the USER column.
  • -4, --hide-read β€” hides the DISK READ column.
  • --show-read β€” shows the DISK READ column.
  • --show-vfs-read β€” shows the VFS READ column.
  • --hide-vfs-read β€” hides the VFS READ column.
  • -5, --hide-write β€” hides the DISK WRITE column.
  • --show-write β€” shows the DISK WRITE column.
  • --show-vfs-write β€” shows the VFS WRITE column.
  • --hide-vfs-write β€” hides the VFS WRITE column.
  • --show-vfs β€” shows the VFS READ and VFS WRITE columns. two for one πŸŽ€
  • --hide-vfs β€” hides the VFS READ and VFS WRITE columns.
  • -6, --hide-swapin β€” hides the SWAPIN column.
  • --show-swapin β€” shows the SWAPIN column.
  • -7, --hide-io β€” hides the IO column.
  • --show-io β€” shows the IO column.
  • -8, --hide-graph β€” hides the GRAPH column.
  • --show-graph β€” shows the GRAPH column.
  • -9, --hide-command β€” hides the COMMAND column.
  • --show-command β€” shows the COMMAND column.
  • -g TYPE, --grtype=TYPE β€” sets the GRAPH column data source. accepted values for TYPE: io, r, w, rw, and sw. pick your plot ✨
  • -R, --reverse-graph β€” reverses the GRAPH direction β€” shows the most recent values on the right side.
  • --no-reverse-graph β€” doesn't reverse the GRAPH direction β€” shows the most recent values on the left side.
  • -q, --quiet β€” suppresses headers before each run (this implies --batch). you can specify this up to three times to suppress different header lines:
    • -q β€” column names are only printed on the first iteration
    • -qq β€” column names are never printed
    • -qqq β€” the I/O summary is never printed
  • -x, --dead-x β€” shows exited processes/threads with the letter x instead of inverse background πŸ’€
  • --no-dead-x β€” shows exited processes/threads with inverse background.
  • -e, --hide-exited β€” hides exited processes. they're gone, let them rest πŸ™ˆ
  • --show-exited β€” shows exited processes.
  • -l, --no-color β€” do not colorize values. monochrome moment.
  • --color β€” colorize values. this will override the effect of the environment variable NO_COLOR when it's explicitly specified on the command line 🌈
  • -T, --hide-time β€” do not show the time clock in the upper right corner.
  • --show-time β€” shows the time clock in the upper right corner.
  • --si β€” use SI units of 1000 when printing values. the default is non-SI 1024.
  • --no-si β€” use non-SI units of 1024 when printing values.
  • --threshold=1..10 β€” sets the threshold to switch to the next unit. the default value is 2.
  • --ascii β€” disables using Unicode. plain and simple.
  • --unicode β€” uses Unicode drawing chars. the pretty lines πŸŽ€
  • -N, --inverse β€” uses the inverse interface (black on white).
  • --no-inverse β€” uses the normal interface. useful when you're changing the config file with --write.
  • --filter=REGEX β€” filters processes by TID and COMMAND. this will only show processes where the TID or COMMAND match the REGEX πŸ”
  • --uid2name=MODE β€” sets the UID-to-user-name resolution mode for the USER column. here's the tea: the USER column shows the real user id of a task, as the kernel reports it in taskstats β€” so a set-user-ID program shows the user that started it. accepted values for MODE:
    • always β€” always resolve UID to username using getpwuid(3)
    • none β€” do not resolve UID, show the numeric UID instead
    • cyclic β€” cache resolved usernames internally for each refresh cycle to avoid repetitive getpwuid(3) lookups
    • static β€” cache resolved usernames permanently across all refresh cycles, and this is the default. pro tip: Ctrl+L clears the cache 🧠
  • -W, --write β€” merges the preceding options into the current config, saves the config, and exits. ⚠️ note that all options after this one will be ignored.
  • --debug-write β€” like -W (--write), but writes the config (with the preceding options) to standard output instead of saving it, and exits. ⚠️ note that all options after this one will be ignored. and for real, do not use this in normal operation β€” this option is for debugging and testing only πŸ› οΈ

⌨️ KEYBOARD SHORTCUTS ⌨️

Before you @ me β€” yes, there are a LOT of these. But bestie, each one is a little gift. Learn three of them and you're already out here looking like the main character of your own terminal. πŸ’…

  • q, Q β€” Exit. Bye bestie, slay, go touch grass. πŸ¦‹
  • W β€” Save your current settings to a config file, in a spot that respects the XDG Base Directory Specification. The path gets created for you if it's not there yet. And if something goes wrong creating or accessing that config file? You get a warning with the reason, and the config just… does not get saved. No silent failure shenanigans here. πŸ™ˆ
    • $XDG_CONFIG_HOME/iotop/iotoprc β€” this one if the XDG_CONFIG_HOME environment variable is set and not empty.
    • $HOME/.config/iotop/iotoprc β€” this one if XDG_CONFIG_HOME is not set or is empty, but HOME is set and not empty.
    • And if neither of them is set and not empty? There is no configuration file. Periodt.
  • D β€” Reset every setting back to its default values. Factory reset energy. ✨
  • <space>, r β€” Toggle the sort order. Flip it, reverse it, iconic.
  • <home> β€” Scroll to the top of the list. ⬆️
  • <end> β€” Scroll to the bottom of the list. ⬇️
  • <page-up> β€” Scroll one whole screen up.
  • <page-down> β€” Scroll one whole screen down.
  • <up> β€” Scroll up by a single line, delicate.
  • <down> β€” Scroll down by a single line, also delicate.
  • <right> β€” Sort by the next column.
  • <left> β€” Sort by the previous column.
  • <esc> β€” Cancel ionice, filter or search. But if it's only the help window that's open, then it just closes that. Context matters, iykyk.
  • o, O β€” Toggle showing only processes that actually have IO activity. Quiet ones stay hidden.
  • p, P β€” Toggle between showing processes vs threads.
  • Ctrl-F β€” Toggle grouping threads underneath their process. So cozy, so organized. πŸŽ€
  • a, A β€” Cycle between showing accumulated / accum-bw / current values.
  • Ctrl-A β€” Toggle whether it accumulates since the processes started, or since iotop first saw them.
  • ? β€” Toggle the inline help. Right there in the middle of your screen. πŸ‘‘
  • h, H β€” Toggle showing the window help.
  • <, > β€” Scroll the help window up and down for when it does not fit on the screen. (It often does not.)
  • c, C β€” Toggle showing the full command line.
  • 1, 2, 3, 4, 5, 6, 7, 8, 9 β€” Toggle showing that column β€” the column number lines up with the shortcut number you pressed. Cute and logical.
  • 0 β€” Show all the columns at once. All of them. The whole buffet. 🌈
  • g, G β€” Cycle the GRAPH source (IO=IO, R=DISK READ, W=DISK WRITE, R+W=DISK READ+DISK WRITE, SW=SWAPIN). Lowercase g cycles forward and capital G cycles backward.
  • R β€” Toggle reverse GRAPH direction.
  • i, I β€” IOnice a process/thread β€” which one you get depends on your process/thread display mode.
  • f, F β€” Change the UID and PID filters.
  • u, U β€” Toggle using Unicode vs ASCII characters for the pseudo graph. Unicode is pretty, ASCII is safe. πŸ’œ
  • l, L β€” Toggle colorizing values.
  • n, N β€” Toggle inverse interface, aka black on white. Chaotic but valid.
  • x, X β€” Toggle how exited processes/threads are displayed: either the letter x or an inverse background.
  • e, E β€” Toggle the display of exited processes.
  • T β€” Toggle the display of the time clock in the upper right corner. πŸ•
  • s, S β€” Toggle freezing data collection. Pause time, bestie.
  • Ctrl-B, b β€” Toggle SI units.
  • Ctrl-R, t β€” Cycle the unit threshold.
  • Ctrl-T β€” Toggle the task_delayacct kernel sysctl.
  • Ctrl-L β€” Redraw the screen and clear the UID cache.
  • / β€” Change the search regular expression. While you're editing it, there's an indicator right next to it showing whether the expression is valid. Confirm the search with <enter> or cancel it with <esc>.

πŸ” shortcuts in the search editor πŸ”

You are, lowkey, in a whole tiny editor now. Here's the cheat sheet:

  • <esc> β€” Cancel editing and remove the regular expression filter entirely.
  • <enter> β€” Confirm the current regular expression and exit edit mode. And if that regular expression is empty or invalid? It'll match everything. Chill of it honestly.
  • Alt/Meta-<backspace>, Ctrl-W β€” Delete one word from the cursor to the left.
  • Alt/Meta-D β€” Delete one word from the cursor to the right.
  • Alt/Meta-B, Ctrl-<left> β€” Move the cursor to the beginning of the word on the left.
  • Alt/Meta-F, Ctrl-<right> β€” Move the cursor to just after the end of the word on the right.
  • Ctrl-A, <home> β€” Move the cursor to the leftmost position.
  • Ctrl-E, <end> β€” Move the cursor to just after the last character.
  • Ctrl-B, <left> β€” Move the cursor left.
  • Ctrl-F, <right> β€” Move the cursor right.
  • Ctrl-H, <backspace> β€” Delete the character left of the cursor.
  • Ctrl-D, <del> β€” Delete the character sitting under the cursor.
  • Ctrl-K β€” Delete from the character under the cursor all the way to the end of the line.
  • Ctrl-U β€” Delete everything. Wipe it. πŸ’€
  • [anything-else] β€” Non-printable characters get ignored. Normal characters get inserted before the character under the cursor. UTF-8 sequences are parsed and treated as a single character. And Unicode combining characters get appended to the character under the cursor. Fancy, multilingual, we love to see it. 🌸

🌱 ENVIRONMENT 🌱

  • NO_COLOR β€” As per the recommendation of https://www.no-color.org/, iotop honors the contents of the environment variable NO_COLOR, and when it's set to a non-empty string, all color output is suppressed. Also, heads up: the config file keeps the colors only when they differ from what it gives, so --write and W do not save it as a setting.
  • HOME, XDG_CONFIG_HOME β€” Used to figure out the config file path. See the W shortcut above for the details.
  • IOTOP_NO_RENICE β€” Disable the i shortcut. That means the user will not be able to change processes' nice values. (Watch out for your unprivileged friends with this one.)

πŸ‘€ SEE ALSO πŸ‘€

ionice(1), top(1), vmstat(1), atop(1), htop(1), getpwuid(3)

Are they your competition or your besties? Por qué no los dos. 🫢


πŸ’– AUTHOR πŸ’–

The original Python iotop implementation was written by Guillaume Chazarain. This rewrite in C was started in 2014 by Vyacheslav Trushkin, and was reworked to include all the missing features from the original Python code plus several new ones since 2020 by Boian Bonev.

This manual page was started by Paul Wise for the Debian project and is placed in the public domain. Giving it away for free, so generous, so iconic. ✨


And that's a wrap on the whole page bestie!! 🌟 This lovely thing is version October 19, 2026 and it lives in section IOTOP(8). Go monitor them processes, you absolute legend. q to exit, drink some water, ily. πŸŽ€πŸ’œ

πŸ“¦ where this page comes from