Intensive disk activity on Linux often explains sluggish shells, slow applications, or stalled services even when CPU graphs look normal. Observing disk Input/Output (I/O) in detail highlights which workloads saturate storage bandwidth or create long queues, making performance investigations more accurate than relying on CPU metrics alone.
The kernel maintains counters for block devices and processes, and tools such as iostat, iotop, and ioping convert those counters into readable statistics. iostat focuses on per-disk throughput and utilization, iotop attributes disk I/O to individual processes or threads in real time, and ioping probes latency by repeatedly issuing small read operations against a device or directory.
Choosing sensible sampling intervals and scopes keeps monitoring overhead low while still surfacing patterns such as sustained high iowait or sudden spikes in response times. Detailed per-process and per-device statistics typically require a user with sudo privileges, and running aggressive latency tests on production storage can add extra load if intervals are too short.
Related: How to check disk errors in Linux
Related: How to mount disks and partitions in Linux
Steps to monitor disk activity on Linux:
- Open a terminal on the Linux system using a user account that can run sudo.
- Install the sysstat package that provides the iostat command on Ubuntu and other Debian-based systems.
$ sudo apt update && sudo apt install --assume-yes sysstat
On RHEL, CentOS, and Fedora, install using sudo dnf install --assumeyes sysstat.
- Run iostat without options to display CPU usage and block device statistics since boot.
$ iostat Linux 6.14.0-37-generic (host.example.net) 01/10/2026 _aarch64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.76 0.02 1.07 0.02 0.00 97.14 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd loop0 0.00 0.00 0.00 0.00 17 0 0 loop1 0.00 0.02 0.00 0.00 1075 0 0 ##### snipped ##### loop14 0.05 1.12 3.41 11.28 65146 198128 655372 loop15 0.01 0.26 1.19 15.86 14844 69356 921612 sda 5.40 2398.81 42.38 938.73 139372426 2462513 54540808The avg-cpu section summarizes CPU time breakdown, and the Device table lists per-device throughput and request rates.
- Focus on a specific disk by passing the device path to iostat together with an interval in seconds for continuous monitoring.
$ iostat /dev/sda -y 1 3 Linux 6.14.0-37-generic (host.example.net) 01/10/2026 _aarch64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.75 0.00 0.88 0.00 0.00 97.37 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd sda 0.00 0.00 0.00 0.00 0 0 0 avg-cpu: %user %nice %system %iowait %steal %idle 3.99 0.00 1.74 0.00 0.00 94.27 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd sda 0.00 0.00 0.00 0.00 0 0 0 avg-cpu: %user %nice %system %iowait %steal %idle 0.38 0.00 0.25 0.00 0.00 99.38 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd sda 0.00 0.00 0.00 0.00 0 0 0Higher tps and write rates on a device indicate more active workloads using that disk.
- Install iotop to monitor per-process disk I/O usage on Ubuntu and other Debian-based systems.
$ sudo apt update && sudo apt install --assume-yes iotop
On RHEL, CentOS, and Fedora, install using sudo dnf install --assumeyes iotop.
- Run iotop with sudo to see real-time disk read and write activity for all running processes.
$ sudo iotop -b -n 1 Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init splash 2 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kthreadd] 3 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [pool_workqueue_release] ##### snipped #####The DISK READ and DISK WRITE columns show per-process throughput, and the IO column reflects time spent waiting on disk operations when the kernel exposes task statistics.
- Filter the view to only processes currently performing disk I/O by using the --only option with iotop.
$ sudo iotop -b -n 1 --only Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMANDOmit --only to display idle processes as well when the filtered view is empty.
- Install ioping to measure disk latency and responsiveness on Ubuntu and other Debian-based systems.
$ sudo apt update && sudo apt install --assume-yes ioping
On RHEL, CentOS, and Fedora, install using sudo dnf install --assumeyes ioping.
- Measure latency for a block device or directory by running ioping against the desired target.
$ sudo ioping -c 6 /dev/sda 4 KiB <<< /dev/sda (block device 64 GiB): request=1 time=1.17 ms (warmup) 4 KiB <<< /dev/sda (block device 64 GiB): request=2 time=678.2 us 4 KiB <<< /dev/sda (block device 64 GiB): request=3 time=484.6 us 4 KiB <<< /dev/sda (block device 64 GiB): request=4 time=747.2 us 4 KiB <<< /dev/sda (block device 64 GiB): request=5 time=308.7 us 4 KiB <<< /dev/sda (block device 64 GiB): request=6 time=2.07 ms --- /dev/sda (block device 64 GiB) ioping statistics --- 5 requests completed in 4.29 ms, 20 KiB read, 1.16 k iops, 4.55 MiB/s generated 6 requests in 5.00 s, 24 KiB, 1 iops, 4.80 KiB/s min/avg/max/mdev = 308.7 us / 858.4 us / 2.07 ms / 626.5 us
High-frequency latency tests on busy or fragile storage can increase load and may stress underlying disks if run for long periods.
- Verify monitoring by performing a disk-heavy operation, such as copying a large file, and confirming that throughput and latency values increase in iostat, iotop, and ioping while the operation is in progress.
Use simple commands such as cp largefile.img /tmp/ in another terminal to generate test disk activity when validating the monitoring setup.
Mohd Shakir Zakaria is a cloud architect with deep roots in software development and open-source advocacy. Certified in AWS, Red Hat, VMware, ITIL, and Linux, he specializes in designing and managing robust cloud and on-premises infrastructures.
