How do I find out Linux Disk utilization?

I’ve already written about finding out Linux / UNIX cpu utilization using various tools. You can use same iostat command to find out disk utilization and for monitoring system input/output device loading by observing the time the physical disks are active in relation to their average transfer rates.

iostat syntax for disk utilization report

iostat -d -x interval count

  • -d : Display the device utilization report (d == disk)
  • -x : Display extended statistics including disk utilization
  • interval : It is time period in seconds between two samples . iostat 2 will give data at each 2 seconds interval.
  • count : It is the number of times the data is needed . iostat 2 5 will give data at 2 seconds interval 5 times

Display 3 reports of extended statistics at 5 second intervals for disk

Type the following command:
$ iostat -d -x 5 3

Linux 2.6.18-53.1.4.el5 (   12/17/2007

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               1.10    39.82  3.41 13.59   309.50   427.48    43.36     0.17   10.03   1.03   1.75
sdb               0.20    18.32  1.15  6.08   117.36   195.25    43.22     0.51   71.14   1.26   0.91

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00   108.40  1.40 64.40    49.60  1382.40    21.76     0.04    0.67   0.44   2.92
sdb               0.00    37.80  0.00 245.20     0.00  2254.40     9.19    28.91  108.49   1.08  26.36

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    97.01  1.00 57.29    39.92  1234.33    21.86     0.03    0.58   0.50   2.89
sdb               0.00    38.32  0.00 288.42     0.00  2623.55     9.10    32.97  122.30   1.15  33.27


  • rrqm/s : The number of read requests merged per second that were queued to the hard disk
  • wrqm/s : The number of write requests merged per second that were queued to the hard disk
  • r/s : The number of read requests per second
  • w/s : The number of write requests per second
  • rsec/s : The number of sectors read from the hard disk per second
  • wsec/s : The number of sectors written to the hard disk per second
  • avgrq-sz : The average size (in sectors) of the requests that were issued to the device.
  • avgqu-sz : The average queue length of the requests that were issued to the device
  • await : The average time (in milliseconds) for I/O requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.
  • svctm : The average service time (in milliseconds) for I/O requests that were issued to the device
  • %util : Percentage of CPU time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100%.

How do I interpret the output result for optimization?

First you need to note down following values from the iostat output:

  1. The average service time (svctm)
  2. Percentage of CPU time during which I/O requests were issued (%util)
  3. See if a hard disk reports consistently high reads/writes (r/s and w/s)

If any one of these are high, you need to take one of the following action:

  • Get high speed disk and controller for file system (for example move from SATA I to SAS 15k disk)
  • Tune software or application or kernel or file system for better disk utilization
  • Use RAID array to spread the file system

For example, from about iostat report it appears that /dev/sdb under load. Hope this information will help you diagnose and optimize disk related issues.

Related: How to find out Linux CPU utilization using vmstat, iostat, mpstat and sar commands.

Please note that command and information discussed here almost applies to any other UNIX like variant.

🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.

🐧 24 comments so far... add one
CategoryList of Unix and Linux commands
Disk space analyzersdf ncdu pydf
File Managementcat tree
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network UtilitiesNetHogs dig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
24 comments… add one
  • Rishi kapur Feb 29, 2008 @ 5:54

    Please suggest me – system load average is shooting.

    %iowait is high and found with iostat output one disk mentioned below may be the cause.

    Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
    cciss/c0d0 2269.60 132.60 296.20 77.60 20521.60 1681.60 10260.80 840.80 59.40 4.15 11.18 2.65 99.20

    please suggest

  • Mike Mar 1, 2008 @ 13:23

    When I enter the command “iostat -d -x 5 3” I do not get any statistics. Here is what I get:

    # iostat -d -x 5 3
    Linux (FILES) 03/01/2008

    Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

    Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

    Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

    Any ideas on what the problem could be? I’m running Slackware 11.0 with the stock kernel.

    Thanks in advance.

    • soundar Feb 9, 2012 @ 12:55

      where x = device

      example : iostat -x -d sda 5

  • Ash Sethi May 21, 2008 @ 6:31

    Another good article… thanks for sharing,

  • whall Aug 27, 2009 @ 21:43

    Mike – you need to not specify “-d”. Only use -d if you’re going to specify a disk like sda or sdb. Just use the -x interval.

    ie, iostat -x 10

    means it will immediately give one output that represents from boot to now, and then every 10 seconds it will output a line that represents the last 10 seconds, and it will repeat forever.

    You can also take this into excel and graph it, paying attention to the 4-5 columns the author mentioned.

  • arumon Sep 3, 2009 @ 11:48

    good artice!!!!
    one question, Please tell what is the use of the below specified files.

  • Dave Neary Feb 9, 2010 @ 11:28


    Thanks for the information, very useful.

    I have one question – what constitutes “high” for r/s & w/s? Is over 10 high? Over 100, 1000?

    I suspect that a hard disk is slowing down on me – whenever there is an I/O intensive operation (swapping, download, starting Firefox or OOo, things like that), everything slows to a crawl, including process switching.

    Is there a way to find out from iostat what bandwidth the disk is giving me? What is the real latency of a disk?


  • David Ward Aug 16, 2010 @ 5:03

    Great article. Thanks!

    I too would like to know what is “high”

    Also, how do you follow on from this. I have had massive IO wait issues at times and tracking down the process causing the issue is very hard. Any tips in this direction?


  • David Ward Aug 16, 2010 @ 5:03

    I should use my gravatar email address 🙂

  • Lars Jul 26, 2011 @ 9:05

    Great article. Just a quick note. On one of our older Debian servers we had to install sysstats package to use iostat.

  • Joseph Taiwo Aug 9, 2011 @ 6:08


    My company uses a VPS hosted in softlayer. Anytime Irun iostat, I hadly get any of these data. Could it be a problem with the VPS?
    The sample of the command output for iostat -d -x 5 3 is as below:

    Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util

    Please I will like to know if there is a way around this. Thanks

  • Reza Sep 2, 2011 @ 17:03

    Very useful… thanks!

  • amir Apr 24, 2012 @ 11:00

    iostat man page :
    The average service time (svctm field) value is meaningless, as I/O statistics are calculated at block level, and we don’t know when the disk driver starts to process a request. For this reason, this field will be removed in a future sysstat version.

  • Suchitra Behera Oct 26, 2012 @ 8:29

    Please let me know to identify what is causing high disk utilization ??

  • Raj Feb 27, 2013 @ 21:16

    Hey What are the statistics for high – Just information. Need to be more specific.
    If you can not evaluate the information and reach to the conclusion then its of no use.


  • Martin Apr 9, 2013 @ 20:36

    Here’s how you get the information filtered

    iostat -x 5 3 | sed "s: +: :g" | cut -d ' ' -f 1,4,5,13,14  | sed "s: :t:g"

    you would have to wait the full 15 seconds before you see any data.
    So this is an even nicer way.

    for n in {1..3}; do iostat -x 1 1 | sed "s: +: :g" | cut -d ' ' -f 1,4,5,13,14  | sed "s: :t:g" | tail -n +2 && sleep 5; done


  • ravi Apr 30, 2013 @ 7:27


    when i try to capture the disk i/o using iostat in linux server i was getting the below error.
    If ‘iostat’ is not a typo you can run the following command to lookup the package that contains the binary:
    command-not-found iostat
    bash: iostat: command not found

    please tel me the alternative command for iostat in Linux.
    i have tried iotop,it was not working.


    • Ishaq May 30, 2013 @ 21:32

      Debian/Ubuntu: apt-get install sysstat

      CentOS: yum install sysstat

    • dirt Jun 5, 2014 @ 1:55

      yum install iostat

  • [OvO]wl Apr 27, 2014 @ 23:05

    martyn@Atlas ~ $ iotop -d -x 5 10
    Usage: /usr/lib/python-exec/python3.3/iotop [OPTIONS]

    DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
    period. SWAPIN and IO are the percentages of time the thread spent respectively
    while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
    which the thread is running (set using the ionice command).

    Controls: left and right arrows to change the sorting column, r to invert the
    sorting order, o to toggle the –only option, p to toggle the –processes
    option, a to toggle the –accumulated option, i to change I/O priority, q to
    quit, any other key to force a refresh.

    iotop: error: option -d: invalid floating-point value: ‘-x’

    Take your bad advice and fuck off my internet.

    • dirt Jun 5, 2014 @ 1:54

      Just use “iotop” , defaults are fine… or read the manual: “man iotop”

  • Barton Mar 8, 2015 @ 16:49

    I use the -d -p options. Check out the man page for iostat as there are several more important options available. I use iostat to keep track of disk writes on my Raspberry Pi to make sure I am not over using my SD card. I have an external USB HDD and have /var and most other folders that get a lot of access there. I run iostat as a cron job every AM and append to a file iostat.txt. This lets me look at the number of writes from day to day and the overall number of writes from boot time. Very helpful for tuning the system.


  • KALEES Oct 13, 2015 @ 17:10

    how can I IOSTAT for particular mount like /dev/XXX/YY

  • Amar Roy Nov 9, 2015 @ 8:28

    Could you explain me how to check and optimize Disk latency/transfer times

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre> for code samples. Still have questions? Post it on our forum