Monitor disk input/output

Author: Ivan Voras IvanVoras FreeBSD

Reviewer: name contact BSD flavour

Reviewer: name contact BSD flavour


A system's disk input/output can have a dramatic impact on performance(((performance))). Know how to use the utilities available on BSD systems to monitor disk I/O and interpret their results.


Monitoring disk I/O can be crucial for troubleshooting a machine. There are a few common symptoms that may indicate an overtasked disk I/O systems: slow or delayed starting of applications and shells, slow remote logins, or slowness in the specific main task the machine is doing (e.g. e-mail server, database server, etc.). Thus it's important to reliably monitor access rates and throughput.


There are several ways this can be done, but the most common one is iostat(8). When started without arguments it will display one or more header lines listing devices and a single statistics line that represents the current I/O performance of those devices. This single snapshot is often not a reliable indicator of true I/O performance and it's more useful to specify the -w N argument to iostat which tells it to display statistics in a loop, every N seconds. On a big machine, there may be more devices than fit the screen so iostat will by default display only 5 devices. The portable way to override this, usable on all BSD's is to specify device names on the command line, but FreeBSD has extended iostat with -n N argument whichtells it to display at most N devices.


The vmstat utility displays low-level information from the kernel. When started without arguments it will display a snapshot of statistics, but if called with -w N argument it will loop and display a line of statistics every N seconds, similar to iostat. The specific information iostat displays differs among the systems but it usually includes the amount of free memory, number of page faults, memory paging activity (swap), and CPU stats. vmstat is important as it's a quick way to find out if the system's high I/O rates are due to memory swapping.


The systat utility is more complex than those already mentioned, as it's a full-screen utility that is usually used for long-term performance tracking (for example: started on a spare console in the system room that is overseen by administrators). It has several display modes, which differ among BSD systems, but the common ones are iostat, vmstat, netstat, mbufs, swap and pigs. The display mode is specified directly on the command line (but prefixed with a - on FreeBSD).

  • iostat mode shows I/O statistics similar to the iostat utility
  • vmstat mode shows kernel statistics similar to the vmstat utility
  • netstat mode shows network I/O statistics similar to the netstat utility
  • mbufs mode shows network buffers statistics
  • swap mode shows swap usage
  • pigs mode shows processes with highest CPU usage

Different BSD systems have some useful additions to the list of display modes, for example FreeBSD has ifstat mode for per-network-interface statistics, and NetBSD has a ps mode that displays a list of processes. See specific man pages for more information.


The nfsstat utility shows NFS statistics. When started without arguments it will display a screenfull of information about NFS, but if called with -w N it will display a two line statics every N seconds (about client and server NFS usage).


The gstat utility is specific to FreeBSD. It's a full-screen utility requiring root privileges that shows I/O statistics for all GEOM devices, including virtual devices. With gstat, I/O can be monitored for individual disk partitions, virtual devices such as RAID geoms, memory drives and all other GEOM devices.


The following will continously monitor I/O statistics for first two SCSI drives on FreeBSD:

> iostat -w 1 da0 da1

To see an overview of NFS performance, use:

> nfsstat

Practice Exercises

  1. Start a "fork bomb" program (usually one can be found in ports/packages/pkgsrc of the system) and monitor how the system behaves with each of above utilities.

More information

iostat(8), gstat(8) on FreeBSD, systat(1), vmstat(1), nfsstat(1)