調優之iostat

dragon路發表於2011-08-01

用途

  報告中央處理器(CPU)統計資訊和整個系統、介面卡、tty 裝置、磁碟和 CD-ROM 的輸入/輸出統計資訊。

語法

  iostat [ -s ] [ -a ] [ -d | -t ] [ -T ][ -m ][ PhysicalVolume ... ] [ Interval [ Count ] ]

描述

  iostat 命令用來監視系統輸入/輸出裝置負載,這通過觀察與它們的平均傳送速率相關的物理磁碟的活動時間來實現。iostat 命令生成的報告可以用來更改系統配置來更好地平衡物理磁碟和介面卡之間的輸入/輸出負載。
  由 iostat 命令生成的第一份報告提供了關於自從系統被引導後的時間統計資訊。後繼的每一份報告都包含自上一次報告以來的時間。每次執行 iostat 命令時,就報告所有的統計資訊。報告由緊接著一行 tty 和 CPU 統計資訊的 tty 和 CPU 頭行組成。在多處理器系統上,CPU 統計資訊是系統範圍計算的,是所有處理器的平均值。
  如果指定 -s 標誌,則顯示系統頭行,隨後是一行整個系統的統計資訊。系統的主機名被列印在系統頭上。
  如果指定 -a 標誌,就會顯示一個介面卡頭行,隨後是一行介面卡的統計資訊。這後面將回有一個磁碟頭行和連線到介面卡的所有磁碟/CD-ROM 的統計資訊。為所有與系統連線的磁碟介面卡生成這種報告。
  顯示一個磁碟頭行,隨後是一行配置的磁碟的統計資訊。如果指定 PhysicalVolume 引數,則只顯示那些指定的名稱。
  如果指定 PhysicalVolume 引數,那麼可以指定一個或者更多的字母或者字母數字的物理卷。如果指定 PhysicalVolume 引數,就會顯示 tty 和 CPU 報告並且磁碟報告包含指定驅動器的統計資訊。如果沒有發現指定邏輯驅動器名,那麼報告將列出指定的名稱並且顯示沒有找到驅動器的訊息。如果沒有指定邏輯驅動器名,報告則包含所有已配置的磁碟和 CD-ROM 的統計資訊。如果系統上沒有配置驅動器,則不生成磁碟報告。PhysicalVolume 引數中的第一個字元不能為數字型。
  Interval 引數指定了在每個報告之間的以秒計算的時間量。第一份報告包含了自系統啟動(引導)以來的時間統計資訊。每一份後繼報告都包含在和前一份報告的時間間隔之間收集的統計資訊。Count 引數可被指定來連線 Interval 引數。如果指定了 Count 引數,它的記數值就確定在 Interval 秒間生成的報告數。如果指定了 Interval 引數但沒有 Count 引數,iostat 命令就會不斷生成報告。
  iostat 命令用來確定一個物理卷是否正在形成一個效能瓶頸,以及是否有可能改善這種情況。物理卷的 % 使用率欄位表明了檔案活動在驅動器中分佈多均勻。物理卷的高 % 使用率是表明也許存在這個資源的爭用很好的徵兆。由於 CPU 使用率的統計資訊同樣適用於 iostat 報告,CPU 在 I/O 等待佇列中的時間的百分比可以在同一時間確定。如果 I/O 等待時間是有效數字並且磁碟使用率不是在捲上均勻分佈,那麼就要考慮在驅動器上分佈資料。
  注: 一些系統資源被消耗是為了為 iostat 命令維護磁碟 I/O 的歷史記錄。使用sysconfig子例程,或者系統管理介面工具(SMIT)來停止歷史記錄賬戶。報告iostat 命令生成四種型別的報告,tty 和 CPU 使用率報告、磁碟使用率報告、系統吞吐量報告和介面卡吞吐量報告。
  tty 和 CPU 使用率報告由 iostat 命令生成的第一份報告是 tty 和 CPU 使用率報告。對於多處理器系統,CPU 值是所有處理器的總平均。同時,I/O 等待狀態是系統級定義的,而不是每個處理器。報告有以下格式:
  
描述
tin 顯示了系統為所有 tty 讀取的字元總數。
tout 顯示了系統為所有 tty 寫入的字元總數。
% user 顯示了在使用者級(應用程式)執行時產生的 CPU 使用率百分比。
% sys 顯示了在系統級(核心)執行時產生的 CPU 使用率百分比。
% idle 顯示了在 CPU 空閒並且系統沒有未完成的磁碟 I/O 請求時的時間百分比。
% iowait 顯示了 CPU 空閒期間系統有未完成的磁碟 I/O 請求時的時間百分比。
每過一定時間間隔,核心就更新這條資訊(一般每秒六十次)。tty 報告提供了從系統中所有終端的收到的每秒字元總數,以及和每秒輸出到系統所有終端的字元的總數。
  用來計算 CPU 磁碟 I/O 等待時間的方法作業系統 V4.3.3 和後來的版本包含用來估算 CPU 在磁碟 I/O(wio 時間)等待上的所花時間的百分比的增強方法。用在 AIX 4.3.2 和作業系統的早期版本上的方法在一定條件下,能夠給出 SMP 上的 wio 時間的一個放大的檢視。wio 時間是根據命令 sar(%wio)、 vmstat(wa)和 iostat(% iowait)報告出來的。
  在 AIX 4.3.2 中和早期版本中使用的方法如下:在每個處理器(每處理器一秒一百次)的每個時鐘中斷上,將確定四個類別(usr/sys/wio/idle)中的哪一個放 置在最後的 10ms 內。如果在時鐘中斷的時刻 CPU 以 usr 模式中處於忙狀態,那麼 usr 獲得這個時間計點並歸於此類。如果在時鐘中斷時刻 CPU 以核心模式中處於忙狀態,那麼 sys 類別將獲得該計時點。如果 CPU 不處於忙狀態,將檢查是否在進行任何磁碟 I/O。如果在進行任何磁碟 I/O,則 wio 類別將增加。如果磁碟在進行 I/O 操作並且 CPU 不忙,那麼 idle 類別將獲取計時點。wio 時間的放大檢視是由於所有空閒 CPU 被歸為 wio 而不管在 I/O 上等待的執行緒數所導致。例如,僅有一個執行緒執行 I/O 的系統可以報告超過 90% 的 wio 時間而不管其 CPU 數。
  在 AIX 4.3.3 中和後繼版本中使用的方法如下:如果在那個 CPU 上啟動一個未完成的的 I/O,那麼作業系統 V4.3.3 中的更改僅把一個空閒 CPU 標為 wio。當只有少數執行緒正在執行 I/O 否則系統就空閒的情況下,這種方法可以報告更少的 wio 時間。例如,一個有四個 CPU 且只有一個執行緒執行 I/O 的系統將報告一個最大值是 25% 的 wio 時間。一個有 12 個 CPU 且僅有一個執行緒執行 I/O 的系統將報告一個最大值為 8% 的 wio 時間。 NFS 客戶機通過 VMM 讀/寫,並且為了完成一個 I/O 而在 vmm 等待中用的時間現在將被報告為 I/O 等待時間。
  磁碟使用率報告由 iostat 命令生成的第二個報告是磁碟使用率報告。磁碟報告提供了在每個物理磁碟基礎上的統計資訊。這個報告有以下類似的格式:
  
% tm_act 表示物理磁碟處於活動狀態的時間百分比(驅動器的頻寬使用率)。
Kbps 表示以 KB 每秒為單位的傳輸(讀或寫)到驅動器的資料量。
tps 表示每秒鐘輸出到物理磁碟的傳輸次數。一次傳輸就是一個對物理磁碟的 I/O 請求。多個邏輯請求可被併為對磁碟的一個單一 I/O 請求。傳輸具有中等的大小。
Kb_read 讀取的 KB 總數。
Kb_wrtn 寫入的 KB 總數。
CD-ROM 裝置的統計資訊也要報告。
  對於配置有大量磁碟的大型系統配置,當 iostat 沒有執行時,系統可以設定為避免收集物理硬碟的輸入/輸出資料。如果系統用上述的方式配置,那麼第一個磁碟報告將顯示訊息引導不可用後的磁碟歷史記錄而不是磁碟統計資訊。由 iostat 命令生成的後繼時間間隔報告包含在報告時間間隔期間收集的磁碟統計資訊。引導後的任何 tty 和 CPU 都不會影響。如果一個系統管理命令用來重新保留磁碟統計資訊,那麼第一個 iostat 命令報告會顯示從啟用磁碟輸入/輸出統計資訊那一刻時間間隔起點起的行為。
  系統吞吐量報告如果指定 -s 標誌將生成這個報告。這份報告提供了整個系統的統計資訊。這份報告有以下格式:
  
Kbps 表示了每秒以 KB 為單位的傳輸(讀或寫)到整個系統的資料量。
tps 表示每秒傳輸到整個系統的傳輸次數。
Kb_read 從整個系統中讀取的 KB 總數。
Kb_wrtn 寫到整個系統的 KB 總數。
介面卡吞吐量報告如果指定 -a 標誌將產生該報告。這份報告提供了介面卡上的統計資訊。
  
Kbps 表示每秒鐘以 KB 為單位的傳輸到(讀或寫)到介面卡的資料量。
tps 表示每秒鐘輸出到介面卡的傳輸次數。
Kb_read 從介面卡讀取的 KB 總數。
Kb_wrtn 寫到介面卡的 KB 總數。
磁碟輸入/輸出歷史記錄要提高效能,已經禁用了磁碟輸入/輸出統計資訊集合。要啟用該資料的集合,請輸入:
  chdev -l sys0 -a iostat=true要顯示當前設定,請輸入:
  lsattr -E -l sys0 -a iostat如果禁用了磁碟輸入/輸出歷史記錄的集合,那麼 iostat 輸出的第一個磁碟報告將顯示訊息引導不可用後的磁碟歷史記錄而不是磁碟統計資訊。如前,由 iostat 命令生成後繼時間間隔報告包含了在報告時間間隔期間收集的磁碟統計資訊。

標誌

  
-a 顯示介面卡吞吐量報告。
-d -d 標誌不能和 -t 標誌合用,且僅顯示磁碟使用率報告。
-s 顯示系統吞吐量報告。
-m -m 標誌將為以下列印路徑統計資訊 到啟用 MPIO(Multi-Path I/O)裝置的路徑。 ESS 機器中的路徑。 吞吐量是每個裝置的。裝置所有路徑的吞吐量符合該裝置的吞吐量。 對於 ESS 機器,vpaths 將被當作磁碟,而 hdisks 將被看作路徑。在內部 vpaths 是磁碟,hdisks 是它們的路徑。對於啟用 MPIO 的裝置,路徑名將表示為 Path0、Path1、Path2 等等。數字0、1、2 等都是 lspath 命令提供的路徑標識。由於一個裝置的路徑可以附加到任何介面卡上,所以介面卡報告將報告每個介面卡下的路徑資訊。磁碟名稱是所有路徑的字首。對於所有啟用 MPIO 的裝置,介面卡報告將列印路徑名為 hdisk10_Path0 、hdisk0_Path1等等。對於所有 ESS 機器,介面卡報告將列印路徑名為 vpath0_hdisk3 、vpath10_hdisk25等等。
-t -t 標誌排除了 -d 標誌且僅顯示了 tty 和 cpu 用法報告。
-T 列印 iostat輸出的每一行邊上的時間戳記。時間戳記以 HH:MM:SS 格式顯示。
注:
  -s 和 -a 標記都能指定來顯示系統和介面卡吞吐量報告。 如果同時指定 -a 標誌和 -t 標誌,將顯示 tty 和 CPU 報告,隨後是介面卡吞吐量報告。連線在介面卡上的磁碟的使用率報告將不會顯示在介面卡吞吐量報告後面。 如果同時指定 -a 標誌和 -d 標誌,將不會顯示 tty 和 CPU 報告。如果指定物理卷引數,那麼指定卷的磁碟使用率報告將在它所屬於的相應介面卡下列印出來。

示例

  要為所有 tty、CPU 和磁碟顯示引導後的單一歷史記錄報告,請輸入: iostat 要為邏輯名是 disk1 的磁碟顯示一個以兩秒為時間間隔的持續磁碟報告,請輸入: iostat -d disk1 2 要為邏輯名是 disk1 的磁碟顯示以兩秒為時間間隔的六個報告,請輸入: iostat disk1 2 6 要為所有磁碟顯示以兩秒為時間間隔的六個報告,請輸入: iostat -d 2 6 要為三個名稱分別為 disk1、disk2、disk3 的磁碟顯示以兩秒為時間間隔的六個報告,請輸入: iostat disk1 disk2 disk3 2 6 要列印系統吞吐量報告,請輸入:
  iostat -s 要列印介面卡吞吐量報告,請輸入: iostat -a 要列印系統和介面卡吞吐量報告,且僅有 tty 和 CPU 報告(沒有磁碟報告),請輸入:

  iostat -sat 要列印帶有 hdisk0 和 hdisk7 的磁碟使用率報告的系統和介面卡吞吐量報告,請輸入: iostat -sad hdisk0 hdisk7 要顯示 iostat 輸出的每行的下一行的時間戳記,請輸入: iostat -T

iostat 輸出解析

   iostat 輸出解析
    ===============


1. /proc/partitions

對於kernel 2.4, iostat 的資料的主要來源是 /proc/partitions,而對於kernel 2.6, 資料主要來自/proc/diskstats或者/sys/block/[block-device-name]/stat。

先看看 /proc/partitions 中有些什麼。

# cat /proc/partitions
major minor  #blocks  name     rio rmerge rsect ruse wio wmerge wsect wuse running use aveq

   3     0   1Array535040 hda 12524 31127 344371 344360 12Array41 25534 308434 10Array72Array0 -1 15800720 28214662
   3     1    7172ArrayArray1 hda1 13 71 168 140 0 0 0 0 0 140 140
   3     2          1 hda2 0 0 0 0 0 0 0 0 0 0 0
   3     5    5116671 hda5 100 477 665 620 1 1 2 30 0 610 650
   3     6     265041 hda6 518 Array2 4616 2770 257 3375 2Array056 143880 0 46520 146650
   3     7    6Array80211 hda7 1188Array 30475 3388Array0 340740 12683 22158 27Array376 Array53380 0 50Array350 12Array4120

major: 主裝置號。3 代表 hda。
minor:    次裝置號。7 代表 No.7 分割槽。
#blocks: 裝置總塊數 (1024 bytes/block)。1Array535040*1024 => 20003880Array60(bytes) ~2G
name:    裝置名稱。如 hda7。

rio:    完成的讀 I/O 裝置總次數。指真正向 I/O 裝置發起並完成的讀運算元目,
    也就是那些放到 I/O 佇列中的讀請求。注意很多程式發起的讀操作
    (read())很可能會和其他的操作進行 merge,不一定每個 read() 呼叫
    都引起一個 I/O 請求。
rmerge: 進行了 merge 的讀運算元目。
rsect:  讀扇區總數 (512 bytes/sector)

ruse:   從進入讀佇列到讀操作完成的時間累積 (毫秒)。上面的例子顯示從開機
        開始,讀 hda7 操作共用了約340秒。

wio:    完成的寫 I/O 裝置總次數。
wmerge:    進行了 merge 的寫運算元目。
wsect:    寫扇區總數
wuse:    從進入寫佇列到寫操作完成的時間累積 (毫秒)

running: 已進入 I/O 請求佇列,等待進行裝置操作的請求總數。上面的例子顯
     示 hda7 上的請求佇列長度為 0。

use:    扣除重疊等待時間的淨等待時間 (毫秒)。一般比 (ruse+wuse) 要小。比
    如 5 個讀請求同時等待了 1 毫秒,那麼 ruse值為5ms, 而 use值為
    1ms。use 也可以理解為I/O佇列處於不為空狀態的總時間。hda7 的I/O
    佇列非空時間為 50Array 秒,約合8分半鐘。
    
aveq:    在佇列中總的等待時間累積 (毫秒) (約等於ruse+wuse)


2. iostat 結果解析

# iostat  -x
Linux 2.4.21-Array.30AX (localhost)         2004年07月14日

avg-cpu:  %user   %nice    %sys   %idle
           3.85    0.00    0.Array5   Array5.20

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
/dev/hda     1.70   1.70  0.82  0.82   1Array.88   20.22     Array.Array4    10.11    24.50    11.83   57.81 610.76  ArrayArray.Array6
/dev/hda1    0.00   0.00  0.00  0.00    0.01    0.00     0.00     0.00    12.Array2     0.00   10.77  10.77   0.00
/dev/hda5    0.02   0.00  0.00  0.00    0.03    0.00     0.02     0.00     6.60     0.00    6.44   6.04   0.00
/dev/hda6    0.01   0.38  0.05  0.03    0.43    3.25     0.21     1.62    46.Array0     0.15  1Array3.Array6  52.25   0.41
/dev/hda7    1.66   1.33  0.76  0.7Array   1Array.41   16.Array7     Array.70     8.4Array    23.44     0.7Array   51.13  1Array.7Array   3.07

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系統已經滿負荷,該磁碟
可能存在瓶頸。

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 洪水。


3. 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 的速度和響應時間。


4. 一個例子

# iostat -x 1
avg-cpu:  %user   %nice    %sys   %idle
          16.24    0.00    4.31   7Array.44
Device:    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/c0d0
             0.00  44.Array0  1.02 27.55    8.16  57Array.5Array     4.08   28Array.80    20.57    22.35   78.21   5.00  14.2Array
/dev/cciss/c0d0p1
             0.00  44.Array0  1.02 27.55    8.16  57Array.5Array     4.08   28Array.80    20.57    22.35   78.21   5.00  14.2Array
/dev/cciss/c0d0p2
             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

上面的 iostat 輸出表明秒有 28.57 次裝置 I/O 操作: delta(io)/s = r/s +
w/s = 1.02+27.55 = 28.57 (次/秒) 其中寫操作佔了主體 (w:r = 27:1)。

平均每次裝置 I/O 操作只需要 5ms 就可以完成,但每個 I/O 請求卻需要等上
78ms,為什麼? 因為發出的 I/O 請求太多 (每秒鐘約 2Array 個),假設這些請求是
同時發出的,那麼平均等待時間可以這樣計算:

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

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

每秒發出的 I/O 請求很多 (約 2Array 個),平均佇列卻不長 (只有 2 個 左右),
這表明這 2Array 個請求的到來並不均勻,大部分時間 I/O 是空閒的。

一秒中有 14.2Array% 的時間 I/O 佇列中是有請求的,也就是說,85.71% 的時間裡
I/O 系統無事可做,所有 2Array 個 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。


5. iostat 的 bug 修正

iostat.c 中是這樣計算avgqu-sz的:

    ((double) current.aveq) / itv

aveq 的單位是毫秒,而 itv 是兩次取樣之間的間隔,單位是 jiffies。必須換
算成同樣單位才能相除,所以正確的演算法是:

    ((double) current.aveq) / itv * HZ / 1000

這樣,上面 iostat 中輸出的 avgqu-sz 值應為 2.23,而不是 22.3。

另外,util值的計算中做了 HZ 值的假設,不是很好,也需要修改。

--- sysstat-4.0.7/iostat.c.orig    2004-07-15 13:31:27.000000000 +0800
+++ sysstat-4.0.7/iostat.c    2004-07-15 13:37:34.000000000 +0800
@@ -370,7 +370,7 @@
    
            nr_ios = current.rd_ios + current.wr_ios;
            tput   = nr_ios * HZ / itv;
-           util   = ((double) current.ticks) / itv;
+           util   = ((double) current.ticks) / itv * HZ / 1000;
         /* current.ticks (ms), itv (jiffies) */
            svctm  = tput ? util / tput : 0.0;
            /* kernel gives ticks already in milliseconds for all platforms -> no need for further scaling */
@@ -387,12 +387,12 @@
               ((double) current.rd_sectors) / itv * HZ, ((double) current.wr_sectors) / itv * HZ,
               ((double) current.rd_sectors) / itv * HZ / 2, ((double) current.wr_sectors) / itv * HZ / 2,
               arqsz,
-              ((double) current.aveq) / itv,
+        ((double) current.aveq) / itv * HZ / 1000, /* aveq is in ms */
         await,
         /* again: ticks in milliseconds */
-        svctm * 100.0,
+        svctm,
         /* NB: the ticks output in current sard patches is biased to output 1000 ticks per second */
-        util * 10.0);
+        util * 100.0);
      }
   }
       }

一會兒 jiffies, 一會兒 ms,看來 iostat 的作者也被搞暈菜了。

這個問題在 systat 4.1.6 中得到了修正:

        * The average I/O requests queue length as displayed by iostat -x was
          wrongly calculated. This is now fixed.

但 Redhat 的 sysstat 版本有些太過時了 (4.0.7)。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25736250/viewspace-703636/,如需轉載,請註明出處,否則將追究法律責任。

相關文章