Linux iostat命令詳解

磁盤I/O 子系統是Linux 系統中最慢的部分,當以爲系統中出現了I/O 瓶頸時,如何監控系統的I/O狀況,本文介紹的iostat命令徹底能夠勝任這個工做,iostat命令是報告cpu的統計信息和磁盤的i/o統計信息,下面從man手冊來學習這個命令
NAME
iostat – Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.html

iostat命令是報告cpu的統計信息和磁盤的i/o統計信息linux

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

DESCRIPTION
The iostat command is used for monitoring system input/output device loading by observing the time the devices are active in relation to their average transfer rates. The iostat command generates reports that can be used to change system configuration to better balance the input/output load between physical disks.ios

iostat命令經過觀察存儲設備實際的工做時間和它們的平均傳輸率來監控系統的i/o負載。iostat命令生成的報告能夠用來改變系統配置來更好的平衡各個磁盤的i/o負載
算法

The first report generated by the iostat command provides statistics concerning the time since the system was booted. Each subsequent report covers the time since the previous report. All statistics are reported each time the iostat command is run. The report consists of a CPU header row followed by a row of CPU statistics. On multiprocessor systems, CPU statistics are calculated system-wide as averages among all processors. A device header row is displayed followed by a line of statistics for each device that is configured.express

iostat命令生成的第一個報告的統計信息的時間是從系統啓動時開始算起的。每個後面的報告都包含了以前報告的時間。全部的統計數據都是每個 iostat命令運行統計出來的。報告包括一行cpu信息標題字段和一行cpu的統計信息。在多cpu系統中,cpu的統計信息是全部cpu的平均值。 io系統標題行後面每一行統計數據都是每一個i/o設備的統計信息服務器

The interval parameter specifies the amount of time in seconds between each report. The first report contains statistics for the time since system startup (boot). Each subsequent report contains statisics collected during the interval since the previous report. The count parameter can be specified in conjunction with the interval parameter. If the count parameter is specified, the value of count determines the number of reports generated at interval seconds apart. If the interval parameter is specified without the count parameter, the iostat command generates reports continuously.app

間隔參數是指每一個報告之間的時間間隔,以秒爲單位。第一個報告包含系統啓動以來的統計數據。每一個後續報告包含自上次報告的時間和間隔期間收集的統計 信息的累積量。計數參數能夠間隔參數一塊兒使用。若是計數參數指定了,計數的值決定了生成的報告的數量。若是計數參數沒有指定,則iostat命令會一直按 指定的時間間隔生產報告ide

REPORTS
The iostat command generates two types of reports, the CPU Utilization report and the Device Utilization report.工具

iostat命令生產兩種類型的報告,cpu利用率報告和磁盤利用率報告post

CPU Utilization Re

The first report generated by the iostat command is the CPU Utilization Report. For multiprocessor systems, the CPU values are global averages among all processors. The report has the following format:

%user   Show  the percentage of CPU utilization that occurred while executing at the user level   (application).
        在用戶級別運行所使用的CPU的百分比.%nice   Show the percentage of CPU utilization that occurred while executing at the user  level   with nice priority.
        優先進程消耗的CPU時間,佔全部CPU的百分比%system Show  the  percentage  of  CPU  utilization that occurred while executing at the system  level (kernel).
        在系統級別(kernel)運行所使用CPU的百分比.%iowait Show the percentage of time that the CPU or CPUs were idle during which the system  had  an outstanding disk I/O request.
        CPU等待硬件I/O時,所佔用CPU百分比%steal  Show  the percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.
        管理程序維護另外一個虛擬處理器時,虛擬CPU的無心識等待時間百分比。%idle   Show the percentage of time that the CPU or CPUs were idle and the system did not  have  an outstanding disk I/O request.
        CPU空閒時間的百分比

Device Utilization Report

The second report generated by the iostat command is the Device Utilization Report. The device report provides statistics on a per physical device or partition basis. Block devices for which statistics are to be displayed may be entered on the command line. Partitions may also be entered on the command line providing that option -x is not used. If no device nor partition is entered, then statistics are displayed for every device used by the system, and providing that the kernel maintains statistics for it. If the ALL keyword is given on the command line, then statistics are displayed for every device defined by the system, including those that have never been used. The report may show the following fields, depending on the flags used:
此報告是iostat命令生成的i/o設備利用率報告。報告提供了每個物理存儲設備或分區的統計信息。經過命令行能夠指定顯示某個塊設備的統計信息。如 果不用-x選項是也能夠用命令指定顯示某個分區的統計信息。若是不在命令中指定塊設備或分區,將顯示被系統識別的每個設備的統計信息,包括那些那些歷來 沒有使用的設備。報告根據命令行的選項能夠顯示其餘的字段信息:

  Device:
        This column gives the device (or partition) name, which is displayed as hdiskn with 2.2
        kernels, for the nth device. It is displayed as devm-n with 2.4 kernels, where m is the
        major number of the device, and n a distinctive number.  With newer kernels, the device
        name as listed in the /dev directory is displayed.

 tps        Indicate the number of transfers per second that were issued to the device. A  transfer        is  an I/O request to the device. Multiple logical requests can be combined into a sin-
        gle I/O request to the device. A transfer is of indeterminate size.
        顯示設備的每秒傳輸次數。一次傳輸就是一次i/o請求。多個邏輯請求能夠合併成一次i/o請求。
        每次傳輸的數據量大小不能肯定

 Blk_read/s        Indicate the amount of data read from the device expressed in a number  of  blocks  per
        second.  Blocks are equivalent to sectors with 2.4 kernels and newer and therefore have
        a size of 512 bytes. With older kernels, a block is of indeterminate size.
        每秒讀取的數據塊數。在2.4內核及以上版本的內核數據塊等於磁盤扇區的大小512bytes,
	老的內核版本數據塊的大學不肯定。
 Blk_wrtn/s        Indicate the amount of data written to the device expressed in a number of  blocks  per second.
        每秒寫入的數據塊數
 Blk_read
        The total number of blocks read.
        從系統啓動到如今讀入的數據塊數
 Blk_wrtn
        The total number of blocks written.
         從系統啓動到如今寫入的數據塊數
 kB_read/s        Indicate the amount of data read from the device expressed in kilobytes per second.
        每秒從設備讀取多少kb數據量
 kB_wrtn/s        Indicate the amount of data written to the device expressed in kilobytes per second.
        每秒寫入設備多少kb數據量
 kB_read        The total number of kilobytes read.
        從系統啓動到如今總共讀取了多少kb數據量
 kB_wrtn        The total number of kilobytes written.
        從系統啓動到如今總共寫入了多少kb數據量
 MB_read/s        Indicate the amount of data read from the device expressed in megabytes per second.
       每秒從設備讀取多少mb數據量
 MB_wrtn/s        Indicate the amount of data written to the device expressed in megabytes per second.
       每秒寫入設備多少mb數據量
 MB_read        The total number of megabytes read.
         從系統啓動到如今總共讀取了多少mb數據量
 MB_wrtn        The total number of megabytes written.
        從系統啓動到如今總共寫入了多少mb數據量
 rrqm/s        The number of read requests merged per second that were queued to the device.
        將讀入請求合併後,每秒發送到設備的讀入請求數
 wrqm/s        The number of write requests merged per second that were queued to the device.
         將寫入請求合併後,每秒發送到設備的寫入請求數
 r/s        The number of read requests that were issued to the device per second.
       每秒發送到設備的讀入請求數
 w/s        The number of write requests that were issued to the device per second.
        每秒發送到設備的寫入請求數
 rsec/s        The number of sectors read from the device per second.
        每秒從設備讀入的扇區數
 wsec/s        The number of sectors written to the device per second.
         每秒向設備寫入的扇區數.
 rkB/s        The number of kilobytes read from the device per second.
        
 wkB/s        The number of kilobytes written to the device per second.

 rMB/s        The number of megabytes read from the device per second.

 wMB/s        The number of megabytes written to the device 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.
        I/O請求平均執行時間.包括髮送請求和執行的時間.單位是毫秒
 svctm        The  average  service  time  (in milliseconds) for I/O requests that were issued to the device.
        發送到設備的I/O請求的平均執行時間.單位是毫秒
 %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%.
        在I/O請求發送到設備期間,佔用CPU時間的百分比.用於顯示設備的帶寬利用率,當這個值接近100%時,表示設備帶寬已經佔滿
 rops/s        Indicate the number of read operations that were issued to the mount point per second        掛載點每秒多少次讀操做
 wops/s        Indicate the number of write operations that were issued to the mount point per second        掛載點多少次寫操做

OPTIONS 參數

   -c  The -c option is exclusive of the -d option and displays only the CPU usage report.
    僅顯示CPU統計信息.與-d選項互斥.-d  The -d option is exclusive of the -c option and displays only the device utilization report.
    僅顯示磁盤統計信息.與-c選項互斥-k  Display statistics in kilobytes per second instead of blocks per second.  
    Data  displayed  are  valid only with kernels 2.4 and newer. 
    以K爲單位顯示每秒的磁盤請求數,默認單位塊-m  Display  statistics  in  megabytes per second instead of blocks or kilobytes per second. 
    Data displayed are valid only with kernels 2.4 and newer.
    以M爲單位顯示每秒的磁盤請求數,默認單位塊-n  Displays the NFS-directory statistic.  Data displayed are valid only with kernels  2.6.17  and
    newer.  This option is exclusive ot the -x option.
    顯示nfs統計信息-h  Display the NFS report more human readable.
       -p [ { device | ALL } ]
    The  -p option is exclusive of the -x option and displays statistics for block devices and all
    their partitions that are used by the system.  If a device name  is  entered  on  the  command
    line, then statistics for it and all its partitions are displayed. Last, the ALL keyword indi-
    cates that statistics have to be displayed for all the block devices and partitions defined by
    the  system, including those that have never been used.  Note that this option works only with
    post 2.5 kernels.
    與-x選項互斥,用於顯示塊設備及系統分區的統計信息-t  Print the time for each report displayed.
    在輸出數據時,打印蒐集數據的時間-V  Print version number then exit.-x  Display extended statistics.  This option is exclusive of the -p and -n, and works  with  post    2.5 kernels since it needs /proc/diskstats file or a mounted sysfs to get the statistics. This
    option may also work with older kernels (e.g. 2.4) only if extended statistics  are  available    in /proc/partitions (the kernel needs to be patched for that).
    輸出擴展信息

示例

參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block爲單位的列強制使用Kilobytes爲單位;2表示,數據顯示每隔2秒刷新一次。

# iostat // 顯示一條統計記錄,包括全部的CPU和設備.

[root@rac1 oswbb]# iostatLinux 2.6.18-164.el5 (rac1) 	01/23/2015avg-cpu:  %user   %nice %system %iowait  %steal   %idle           3.43    0.05   10.80   10.66    0.00   75.07Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               4.33        14.94       129.96    2693442   23426434sda1              0.00         0.01         0.00       2402         10sda2              3.36        13.10       119.21    2361759   21489488sda3              0.98         1.82        10.75     328913    1936936

# iostat -d 2 // 每隔2秒,顯示一次設備統計信息.

[root@rac1 oswbb]# iostat -d 2Linux 2.6.18-164.el5 (rac1) 	01/23/2015Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               4.33        14.88       129.83    2693466   23502386sda1              0.00         0.01         0.00       2402         10sda2              3.35        13.05       119.09    2361783   21557728sda3              0.98         1.82        10.74     328913    1944648

# iostat -d 2 6 // 每隔2秒,顯示一次設備統計信息.總共輸出6次.

[root@rac1 oswbb]# iostat -d 2Linux 2.6.18-164.el5 (rac1) 	01/23/2015Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               4.33        14.88       129.83    2693466   23502386sda1              0.00         0.01         0.00       2402         10sda2              3.35        13.05       119.09    2361783   21557728sda3              0.98         1.82        10.74     328913    1944648Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               4.33        14.88       129.83    2693466   23502386sda1              0.00         0.01         0.00       2402         10sda2              3.35        13.05       119.09    2361783   21557728sda3              0.98         1.82        10.74     328913    1944648

# iostat -x sda sdb 2 6// 每隔2秒顯示一次hda,hdb兩個設備的擴展統計信息,共輸出6次.

[root@rac1 oswbb]# iostat -x sda sdb 2 6Linux 2.6.18-164.el5 (rac1) 	01/23/2015avg-cpu:  %user   %nice %system %iowait  %steal   %idle           3.42    0.05   10.79   10.66    0.00   75.07Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.19    12.36  0.46  3.86    14.87   129.80    33.44     0.02    4.85   1.38   0.60sdb               0.00     0.00  0.11  0.26     1.49     2.11     9.51     0.00    8.95   8.58   0.32

# iostat -p sda 2 6 // 每隔2秒顯示一次sda及上面全部分區的統計信息,共輸出6次.

[root@rac1 oswbb]# iostat -p sda 2 6 Linux 2.6.18-164.el5 (rac1) 	01/23/2015avg-cpu:  %user   %nice %system %iowait  %steal   %idle           3.42    0.05   10.79   10.66    0.00   75.07Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnsda               4.33        14.87       129.79    2693474   23515370sda3              1.86         0.01         0.98       2092     178453sda2             13.45         0.17         9.88      30717    1789685sda1              0.01         0.01         0.02       1070       3759

下面是oswbb經過iostat -xk輸出iostat信息片斷

zzz ***Mon Jan 19 15:00:10 CST 2015avg-cpu:  %user   %nice %system %iowait  %steal   %idle           0.15    0.00    0.15    0.00    0.00   99.70Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
cciss/c0d0        0.00    46.00  0.00  2.00     0.00   192.00   192.00     0.00    0.00   0.00   0.00cciss/c0d0p1      0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00cciss/c0d0p2      0.00    46.00  0.00  2.00     0.00   192.00   192.00     0.00    0.00   0.00   0.00cciss/c0d0p3      0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00cciss/c0d0p4      0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00cciss/c0d0p5      0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00cciss/c0d0p6      0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00cciss/c0d0p7      0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

%iowait並不能反應磁盤瓶頸

iowait實際測量的是cpu時間:%iowait = (cpu idle time)/(all cpu time)

這個文章說明:高速cpu會形成很高的iowait值,但這並不表明磁盤是系統的瓶頸。惟一能說明磁盤是系統瓶頸的方法,就是很高的read/write時間通常來講超過20ms,就表明了不太正常的磁盤性能。爲何是20ms呢?通常來講,一次讀寫就是一次尋到+一次旋轉延遲+數據傳輸的時間。因爲,現代硬盤數據傳輸就是幾微秒或者幾十微秒的事情,遠遠小於尋道時間2~20ms和旋轉延遲4~8ms,因此只計算這兩個時間就差很少了,也就是15~20ms。只要大於20ms,就必須考慮是否交給磁盤讀寫的次數太多,致使磁盤性能下降了。

做者的文章以AIX系統爲例,使用其工具filemon來檢測磁盤每次讀寫平均耗時。在Linux下,能夠經過iostat命令還查看磁盤性能。其 中的svctm一項,反應了磁盤的負載狀況,若是該項大於15ms,而且util%接近100%,那就說明,磁盤如今是整個系統性能的瓶頸了。
iostat來對linux硬盤IO性能進行了解

之前一直不太會用這個參數。如今認真研究了一下iostat,由於恰好有臺重要的服務器壓力高,因此放上來分析一下.下面這臺就是IO有壓力過大的服務器

[root@rac1 oswbb]# iostat -x 1 1Linux 2.6.18-164.el5 (rac1) 	01/23/2015avg-cpu:  %user   %nice %system %iowait  %steal   %idle           3.42    0.05   10.79   10.65    0.00   75.08Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.19    12.34  0.46  3.86    14.81   129.64    33.44     0.02    4.84   1.37   0.59

字段描述

rrqm/s:每秒進行 merge 的讀操做數目。即 delta(rmerge)/s
wrqm/s:每秒進行 merge 的寫操做數目。即 delta(wmerge)/s
r/s:每秒完成的讀 I/O 設備次數。即 delta(rio)/s
w/s:每秒完成的寫 I/O 設備次數。即 delta(wio)/s
rsec/s:每秒讀扇區數。即 delta(rsect)/s
wsec/s:每秒寫扇區數。即 delta(wsect)/s
rkB/s:每秒讀K字節數。是 rsect/s 的一半,由於每扇區大小爲512字節。(須要計算)wkB/s:每秒寫K字節數。是 wsect/s 的一半。(須要計算)avgrq-sz:平均每次設備I/O操做的數據大小 (扇區)。delta(rsect+wsect)/delta(rio+wio)avgqu-sz:平均I/O隊列長度。即 delta(aveq)/s/1000 (由於aveq的單位爲毫秒)。await:平均每次設備I/O操做的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)svctm:平均每次設備I/O操做的服務時間 (毫秒)。即 delta(use)/delta(rio+wio)%util: 一秒中有百分之多少的時間用於 I/O 操做,或者說一秒中有多少時間 I/O 隊列是非空的。
      即 delta(use)/s/1000 (由於use的單位爲毫秒)

若是 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。
idle小於70% IO壓力就較大了,通常讀取速度有較多的wait。

同時能夠結合vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高)
另外 await 的參數也要多和 svctm 來參考。差的太高就必定有 IO 的問題。
avgqu-sz 也是個作 IO 調優時須要注意的地方,這個就是直接每次操做的數據的大小,若是次數多,但數據拿的小的話,其實 IO 也會很小.若是數據拿的大,才IO 的數據會高。也能夠經過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是講,讀定速度是這個來決定的。

另外還能夠參考svctm 通常要小於 await (由於同時等待的請求的等待時間被重複計算了),svctm 的大小通常和磁盤性能有關,CPU/內存的負荷也會對其有影響,請求過多也會間接致使 svctm 的增長。await 的大小通常取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。若是 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;若是 await 遠大於 svctm,說明 I/O 隊列太長,應用獲得的響應時間變慢,若是響應時間超過了用戶能夠允許的範圍,這時能夠考慮更換更快的磁盤,調整內核 elevator 算法,優化應用,或者升級 CPU。

隊列長度(avgqu-sz)也可做爲衡量系統 I/O 負荷的指標,但因爲 avgqu-sz 是按照單位時間的平均值,因此不能反映瞬間的 I/O 洪水。
別人一個不錯的例子(I/O 系統 vs. 超市排隊)

舉一個例子,咱們在超市排隊 checkout 時,怎麼決定該去哪一個交款臺呢? 首當是看排的隊人數,5我的總比20人要快吧? 除了數人頭,咱們也經常看看前面人購買的東西多少,若是前面有個採購了一星期食品的大媽,那麼能夠考慮換個隊排了。還有就是收銀員的速度了,若是碰上了連 錢都點不清楚的新手,那就有的等了。另外,時機也很重要,可能 5 分鐘前還人滿爲患的收款臺,如今已經是人去樓空,這時候交款但是很爽啊,固然,前提是那過去的 5 分鐘裏所作的事情比排隊要有意義 (不過我還沒發現什麼事情比排隊還無聊的)。

I/O 系統也和超市排隊有不少相似之處:

r/s+w/s 相似於交款人的總數
平均隊列長度(avgqu-sz)相似於單位時間裏平均排隊人的個數
平均服務時間(svctm)相似於收銀員的收款速度
平均等待時間(await)相似於平均每人的等待時間
平均I/O數據(avgrq-sz)相似於平均每人所買的東西多少
I/O 操做率 (%util)相似於收款臺前有人排隊的時間比例。

咱們能夠根據這些數據分析出 I/O 請求的模式,以及 I/O 的速度和響應時間。
下面是別人寫的這個參數輸出的分析

# iostat -x 1avg-cpu: %user %nice %sys %idle16.24 0.00 4.31 79.44Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util/dev/cciss/c0d00.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29

上面的 iostat 輸出代表秒有 28.57 次設備 I/O 操做: 總IO(io)/s = r/s(讀) +w/s(寫) = 1.02+27.55 = 28.57 (次/秒) 其中寫操做佔了主體 (w:r = 27:1)。
平均每次設備 I/O 操做只須要 5ms 就能夠完成,但每一個 I/O 請求卻須要等上 78ms,爲何? 由於發出的 I/O 請求太多 (每秒鐘約 29 個),假設這些請求是同時發出的,那麼平均等待時間能夠這樣計算:

平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + … + 請求總數-1) / 請求總數

應用到上面的例子: 平均等待時間 = 5ms * (1+2+…+28)/29 = 70ms,和 iostat 給出的78ms 的平均等待時間很接近。這反過來代表 I/O 是同時發起的。

每秒發出的 I/O 請求不少 (約 29 個),平均隊列卻不長 (只有 2 個 左右),這代表這 29 個請求的到來並不均勻,大部分時間 I/O 是空閒的。
一秒中有 14.29% 的時間 I/O 隊列中是有請求的,也就是說,85.71% 的時間裏 I/O 系統無事可作,全部 29 個 I/O 請求都在142毫秒以內處理掉了。
delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,代表每秒內的I/O請求總共須要等待2232.8ms。因此平均隊列長度應爲 2232.8ms/1000ms = 2.23,而 iostat 給出的平均隊列長度 (avgqu-sz) 卻爲 22.35,爲何?! 由於 iostat 中有 bug,avgqu-sz 值應爲 2.23,而不是 22.35

參考http://oplinux.com/order/iostat.html

相關文章
相關標籤/搜索