linuxperformanceawksediostat

How to get iostat second sample


iostat -x doesn't show the real values. That is obvious if you run iostat -x 1 and see the values per second. When I run iostat -x 1 2 I thought that I can get the values that I wanted by grabbing the exact lines and then the values.

iostat -x 1 2 | awk '{gsub(/,/,"."); if (NR==15) printf ("%s,%s,%s,", $1, $3 ,$4); else if (NR == 18) printf ("%s,", $14);}'

from line 15 give me %user, %system, %iowait, from line 18 the %sda.

Unfortunately, I cannot do this because I have more than one machine with different disks. When I run iostat -x sda might be in line 18, in line 21 or in another line.

How can I run iostat -x and get only the second sample? or how can I get the values that I want regarding the line?

I thought of iostat -x 1 2 | awk '/^sda/ {print $14}'and then get only the second value but if I follow this approach I would need 8 seconds to get all the values that I want.

Output of iostat -x 1 2

Linux 3.10.0-327.28.3.el7.x86_64 (sth)  13/12/2016  _x86_64_    (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0,70    0,00    0,23    0,09    0,00   98,98

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme0n1           0,00     0,00    0,00    0,00     0,03     0,00    38,29     0,00    0,13    0,13    0,00   0,02   0,00
sda               0,01     0,18    0,23    7,52    38,37  3132,67   819,15     1,26  162,49  219,88  160,76   3,74   2,89
sdb               0,00     0,00    0,62    0,00    78,93     0,00   255,56     0,00    0,40    0,40    0,00   0,24   0,01
dm-0              0,00     0,00    1,02    2,10    21,16   156,62   113,89     0,11   34,80    4,22   49,58   2,13   0,66
dm-1              0,00     0,00    0,00    0,00     0,01     0,00    59,16     0,00    0,54    0,36    3,15   0,42   0,00
dm-2              0,00     0,00    0,01    0,01     0,13     0,76    84,61     0,00  177,30    0,58  287,55  28,81   0,06

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0,03    0,00    0,03    0,00    0,00   99,94

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme0n1           0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
sda               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
sdb               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
dm-0              0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
dm-1              0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00
dm-2              0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00    0,00    0,00   0,00   0,00

Solution

  • this will give you the second instance of the headers and values, you can restrict the fields further and skip the headers if you want

    $ iostat -x 1 2 | awk '/^avg-cpu/  {c++; a=4} 
                           c==2 && a && a--; 
                           c==2 && /^sdb/'
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               1.31    0.00    0.22    0.00    0.00   98.47
    
    Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    sdb              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
    

    this one, without the headers, just pick the field you want to print (instead of $0).

    $ iostat -x 1 2 | awk '/^avg-cpu/        {c++; a=2} 
                           c==2 && a && !--a {print $0} 
                           c==2 && /^sdb/    {print $0}'
    
               1.78    0.00    0.78    0.03    0.00   97.41
    sdb              0.00     0.00  0.00 831.00     0.00  6648.00     8.00     0.72    0.87   0.01   0.60