歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux下iostat監控磁盤IO狀況

磁盤 I/O 監控是 Unix/Linux 系統管理中一個非常重要的組成部分。它可以監控吞吐量、每秒 I/O 數、磁盤利用率、服務時間等信息,並且在發現異常時,發送告警信息給系統管理員,便於系統管理員進行調整數據布局等管理活動以達到優化系統總體性能的目的。

不同的操作系統監控磁盤 I/O 的命令可能略有不同。本文將介紹 Unix/Linux 操作系統磁盤 I/O 管理命令及相關信息,並講述 Unix/Linux 操作系統上磁盤 I/O 管理監控的自動化腳本實現。

Unix/Linux 磁盤 I/O 性能監控命令

磁盤 I/O 性能監控指標和調優方法

在介紹磁盤 I/O 監控命令前,我們需要了解磁盤 I/O 性能監控的指標,以及每個指標的所揭示的磁盤某方面的性能。磁盤 I/O 性能監控的指標主要包括:

指標 1:每秒 I/O 數(IOPS 或 tps)

對於磁盤來說,一次磁盤的連續讀或者連續寫稱為一次磁盤 I/O, 磁盤的 IOPS 就是每秒磁盤連續讀次數和連續寫次數之和。當傳輸小塊不連續數據時,該指標有重要參考意義。

指標 2:吞吐量(Throughput)

指硬盤傳輸數據流的速度,傳輸數據為讀出數據和寫入數據的和。其單位一般為 Kbps, MB/s 等。當傳輸大塊不連續數據的數據,該指標有重要參考作用。

指標 3:平均 I/O 數據尺寸

平均 I/O 數據尺寸為吞吐量除以 I/O 數目,該指標對揭示磁盤使用模式有重要意義。一般來說,如果平均 I/O 數據尺寸小於 32K,可認為磁盤使用模式以隨機存取為主;如果平均每次 I/O 數據尺寸大於 32K,可認為磁盤使用模式以順序存取為主。

指標 4:磁盤活動時間百分比(Utilization)

磁盤處於活動時間的百分比,即磁盤利用率,磁盤在數據傳輸和處理命令(如尋道)處於活動狀態。磁盤利用率與資源爭用程度成正比,與性能成反比。也就是說磁盤利用率越高,資源爭用就越嚴重,性能也就越差,響應時間就越長。一般來說,如果磁盤利用率超過 70%,應用進程將花費較長的時間等待 I/O 完成,因為絕大多數進程在等待過程中將被阻塞或休眠。

指標 5:服務時間(Service Time)

指磁盤讀或寫操作執行的時間,包括尋道,旋轉時延,和數據傳輸等時間。其大小一般和磁盤性能有關,CPU/ 內存的負荷也會對其有影響,請求過多也會間接導致服務時間的增加。如果該值持續超過 20ms,一般可考慮會對上層應用產生影響。

指標 6:I/O 等待隊列長度(Queue Length)

指待處理的 I/O 請求的數目,如果 I/O 請求壓力持續超出磁盤處理能力,該值將增加。如果單塊磁盤的隊列長度持續超過 2,一般認為該磁盤存在 I/O 性能問題。需要注意的是,如果該磁盤為磁盤陣列虛擬的邏輯驅動器,需要再將該值除以組成這個邏輯驅動器的實際物理磁盤數目,以獲得平均單塊硬盤的 I/O 等待隊列長度。

指標 7:等待時間(Wait Time)

指磁盤讀或寫操作等待執行的時間,即在隊列中排隊的時間。如果 I/O 請求持續超出磁盤處理能力,意味著來不及處理的 I/O 請求不得不在隊列中等待較長時間。

通過監控以上指標,並將這些指標數值與歷史數據,經驗數據以及磁盤標稱值對比,必要時結合 CPU、內存、交換分區的使用狀況,不難發現磁盤 I/O 潛在或已經出現的問題。但如果避免和解決這些問題呢?這就需要利用到磁盤 I/O 性能優化方面的知識和技術。限於本文主題和篇幅,僅列出一些常用的優化方法供讀者參考:

  1. 調整數據布局,盡量將 I/O 請求較合理的分配到所有物理磁盤中。
  2. 對於 RAID 磁盤陣列,盡量使應用程序 I/O 等於條帶尺寸或者為條帶尺寸的倍數。並選取合適的 RAID 方式,如 RAID10,RAID5。
  3. 增大磁盤驅動程序的隊列深度,但不要超過磁盤的處理能力,否則,部分 I/O 請求會因為丟失而重新發出,這將降低性能。
  4. 應用緩存技術減少應用存取磁盤的次數,緩存技術可應用在文件系統級別或者應用程序級別。
  5. 由於多數數據庫中已包括經優化後的緩存技術,數據庫 I/O 宜直接存取原始磁盤分區(raw partition)或者利用繞過文件系統緩存的 DIO 技術(direct IO)
  6. 利用內存讀寫帶寬遠比直接磁盤 I/O 操作性能優越的特點,將頻繁訪問的文件或數據置於內存中。

磁盤 I/O 性能監控命令簡介

Unix/Linux 提供了兩個非常有用的用於磁盤 I/O 性能監控的命令:iostat 和 sar。

iostat 命令主要通過觀察物理磁盤的活動時間以及他們的平均傳輸速度,監控系統輸入 / 輸出設備負載。根據 iostat 命令產生的報告,用戶可確定一個系統配置是否平衡,並據此在物理磁盤與適配器之間更好地平衡輸入 / 輸出負載。iostat 工具的主要目的是通過監控磁盤的利用率,而探測到系統中的 I/O 瓶頸。不同操作系統命令格式輸出格式略有不同,管理員可以通過查看用戶手冊來確定它的用法。

sar 命令報告 CPU 的使用情況,I/O 以及其它系統行為。sar 命令可以收集,報告以及保存系統行為信息。以這種方式收集到的數據對於確定系統的時間周期特征和決定峰值使用時間是很有用的。但要注意的是,sar 命令自己運行時會產生相當數量的讀寫,因此最好在沒有工作量的情況下運行 sar 統計,看看 sar 對總的統計數字有多大的影響。

AIX 環境下,iostat 和 sar 位於文件集 bos.acct 中,是基本系統 (Base Operating System) 的一部分,在缺省安裝情況下無需進行任何配置或任何額外包安裝。

Linux 環境下,iostat 和 sar 包含在 sysstat 包中。sysstat 是 Linux 系統中的常用工具包。不同的 Linux 系統或不同的硬件平台,安裝包名字和具體命令可能會有微小差異。清單1為一個在 RHEL5.3 上安裝 sysstat 包的例子。

清單1:在 RHEL5.3 上安裝 sysstat 包
 # rpm -ivh sysstat-7.0.2-3.el5.ppc.rpm 
 warning: sysstat-7.0.2-3.el5.ppc.rpm: Header V3 DSA signature: NOKEY, key ID 37017186 
 Preparing...             #################################### [100%] 
   1:sysstat              #################################### [100%]

在 AIX 系統上監控磁盤 I/O 狀況

清單 2 與清單 3 是在一個負載較重的 AIX 節點上運行 iostat 和 sar 的執行結果,每個命令時間間隔設定為 10 秒,總共執行3次。

清單 2:在 AIX6.1 系統上利用 iostat 查看磁盤 I/O 負載
# iostat -d 10 3 

 System configuration: lcpu=32 drives=226 paths=2 vdisks=0 

 Disks:    % tm_act     Kbps       tps      Kb_read    Kb_wrtn 

 hdisk1        51.6     1582.8      25.6       2208     13632 
 hdisk2        14.6     6958.5       7.1          0     69637 
 hdisk3        94.2     40013.8      73.3       9795    390643 

 hdisk1        61.2     2096.9      33.9       4176     16844 
 hdisk2        20.1     9424.0      10.0         32     94438 
 hdisk3        97.2     39928.3      73.8      25112    375144 

 hdisk1        63.5     2098.6      34.7       4216     16796 
 hdisk2        27.1     13549.5      13.6       8352    127308 
 hdisk3        98.4     40263.8      81.2      27665    375464

主要字段含義如下:

% tm_act 表示物理磁盤處於活動狀態的時間百分比,即磁盤利用率。

Kbps 表示以 KB 每秒為單位的傳輸(讀或寫)到驅動器的數據量。

Tps 表示每秒物理磁盤的 I/O 次數。

Kb_read 在設定時間間隔內讀取的數據量,以 KB 為單位。

Kb_wrtn 在設定時間間隔內寫入的數據量,以 KB 為單位。

清單 3: 在 AIX6.1 系統上使用 sar – d 報告磁盤 I/O 信息
# sar -d 10 3 

 AIX node001 1 6 00CAA4CC4C00    08/19/09 

 System configuration: lcpu=32 drives=226  mode=Capped 

 04:34:43 device     %busy   avque   r+w/s   Kbs/s   avwait   avserv 

 04:34:53 hdisk1     52      0.0       26     1645      0.0     28.3 
          hdisk2     18      0.0        8     8614      0.4     73.5 
          hdisk3     92      0.1       72    38773     28.5    105.1 

 04:35:03 hdisk1     62      0.0       34     2133      0.0     30.7 
          hdisk2     20      0.0       10     9855      0.4     84.2 
          hdisk3     98      0.1       74    39975     24.4    115.7 

 04:35:13 hdisk1     62      0.0       33     2019      0.0     32.5 
          hdisk2     23      0.0       11    11898      0.4     67.4 
          hdisk3     97      0.0       80    40287     13.7     97.4 

 Average  hdisk1     58      0.0       31     1932      0.0     30.5 
          hdisk2     20      0.0        9    10122      0.4     75.0 
          hdisk3     95      0.1       75    39678     22.2    106.1

輸出的主要字段含義如下:

%busy 處理 I/O 請求所占用的時間,以百分比表示。

avque 在指定的時間間隔沒有完成的請求數量的平均值。

r+w/s 每秒 I/O 讀寫總數。

Kbs/s 每秒字節數,以 KB 為單位。

avwait 傳送請求等待隊列空閒的平均時間,以毫秒為單位。

avserv 完成 I/O 請求所需平均時間,以毫秒為單位。

本例顯示 hdisk1 的利用率居中,每秒 I/O 數居中,但吞吐量最小;hdisk2 的利用率最小,每秒 I/O 數最小,但吞吐量比 hdisk1 高;hdisk3 I/O 利用率最大,每秒 I/O 數和吞吐量也最大,I/O 平均等待時間最長,服務時間也最長。hdisk1 的平均 I/O 尺寸為 1932/31= 62 KB;hdisk2 的平均 I/O 尺寸為 10122/9= 1125 KB;hdisk3 的平均 I/O 尺寸為 39678/75= 529 KB。從中可見,小塊隨機存取對每秒 I/O 數影響較大,大塊順序讀取對吞吐量影響較大。hdisk3 利用率超過 70% 警戒線,雖然其平均 I/O 尺寸比 hdisk2 小約一半,但服務時間卻比 hdisk2 增加約 30%,同時等待時間也較長,應該對其采取管理措施。

下面是centos6.5執行命令後的結果:

[sourcecode]

[azureuser@v-db-as ~]$ sar -d 10 3
Linux 2.6.32-504.3.3.el6.x86_64 (v-db-as) 12/30/2014 _x86_64_ (2 CPU)

10:29:51 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
10:30:01 AM dev8-0 1.62 103.54 12.94 72.00 0.00 1.19 0.81 0.13
10:30:01 AM dev8-32 255.11 0.00 2178.36 8.54 1.34 5.27 3.90 99.43
10:30:01 AM dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

10:30:01 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
10:30:11 AM dev8-0 0.61 77.81 3.24 133.33 0.01 10.17 9.67 0.59
10:30:11 AM dev8-32 273.76 0.00 2884.70 10.54 1.47 5.39 3.63 99.47
10:30:11 AM dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

10:30:11 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
10:30:21 AM dev8-0 0.60 77.34 6.45 138.67 0.00 5.33 5.33 0.32
10:30:21 AM dev8-32 269.59 0.00 4238.47 15.72 1.59 5.90 3.65 98.34
10:30:21 AM dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev8-0 0.94 86.22 7.54 99.43 0.00 4.00 3.68 0.35
Average: dev8-32 266.15 0.00 3102.19 11.66 1.47 5.52 3.72 99.08
Average: dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

[/sourcecode]

在 Linux 系統上監控磁盤 I/O 狀況

清單 4 與清單 5 是在一個負載較輕的 Linux 節點上 iostat 和 sar 的執行結果,時間間隔設定為 10 秒,總共執行 3 次。

清單 4:在 RHEL5.3 系統上利用 iostat 查看磁盤 I/O 負載
 # iostat -d -x 10 3 

 Linux 2.6.18-128.el5 (node002.ibm.com)       08/19/2009 

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

 sda      0.10   22.12  0.14  2.06   12.98   286.60   136.58   0.19   87.17   3.76   0.82 

 sda1     0.00   0.00   0.00  0.00    0.00    0.00    75.06    0.00    3.89   3.14   0.00 

 sda2     0.00   0.00    0.00  0.00   0.02    0.00    53.56    0.00   13.28  11.67   0.00 

 sda3     0.09   22.12   0.14  2.06   12.94   286.60   136.59  0.19   87.19   3.76   0.82 

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

 sda      0.00   6.40  0.00  1.20     0.00    91.20    76.00   0.01    7.25   5.08   0.61 

 sda1     0.00   0.00  0.00  0.00     0.00     0.00     0.00   0.00    0.00   0.00   0.00 

 sda2     0.00   0.00  0.00  0.00     0.00     0.00     0.00   0.00    0.00   0.00   0.00 

 sda3     0.00   6.40  0.00  1.20     0.00    91.20    76.00   0.01    7.25   5.08   0.61 

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

 sda      0.00   3.30  0.00  5.40   0.00   100.00    18.52     0.45   83.24   3.63   1.96 

 sda1     0.00   0.00  0.00  0.00   0.00     0.00     0.00     0.00    0.00   0.00   0.00 

 sda2     0.00   0.00  0.00  0.00   0.00     0.00     0.00     0.00    0.00   0.00   0.00 

 sda3     0.00   3.30  0.00  5.40   0.00   100.00    18.52     0.45   83.24   3.63   1.96

主要字段含義如下:

r/s 每秒讀操作數。

w/s 每秒寫操作數。

rsec/s 每秒從設備讀取的扇區數量。

wsec/s 每秒向設備寫入的扇區數量。

avgrq-sz I/O 請求的平均扇區數。

avgqu-sz I/O 請求的平均隊列長度。

await I/O 請求的平均等待時間,單位為毫秒。

svctm I/O 請求的平均服務時間,單位為毫秒。

%util 處理 I/O 請求所占用的時間的百分比,即設備利用率。

清單 5:在 RHEL5.3 系統上利用 sar 報告磁盤 I/O 信息
 #sar -pd 10 3 

 Linux 2.6.18-128.el5 (node002.ibm.com)       08/19/2009 

 04:13:48 AM   DEV    tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz   await   svctm   %util 

 04:13:58 AM   sda    1.20   0.00     91.11     76.00      0.01     7.25   5.08      0.61 

 04:13:58 AM   sda1   0.00   0.00    0.00      0.00       0.00     0.00   0.00      0.00 

 04:13:58 AM   sda2   0.00   0.00    0.00      0.00       0.00     0.00    0.00     0.00 

 04:13:58 AM   sda3   1.20   0.00     91.11     76.00      0.01    7.25      5.08    0.61 

 04:13:58 AM   DEV  tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz   await   svctm   %util 

 04:14:08 AM   sda   5.41  0.00    100.10     18.52      0.45     83.24    3.63    1.96 

 04:14:08 AM   sda1   0.00  0.00    0.00      0.00      0.00      0.00    0.00     0.00 

 04:14:08 AM   sda2   0.00  0.00    0.00      0.00      0.00      0.00    0.00     0.00 

 04:14:08 AM   sda3   5.41  0.00    100.10     18.52    0.45     83.24    3.63      1.96 

 04:14:08 AM   DEV   tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await   svctm    %util 

 04:14:18 AM    sda   0.60  0.00   74.47    124.00       0.00     7.50     6.33     0.38 

 04:14:18 AM    sda1  0.00  0.00  0.00      0.00      0.00      0.00      0.00      0.00 

 04:14:18 AM    sda2  0.00   0.00  0.00     0.00      0.00      0.00      0.00      0.00 

 04:14:18 AM    sda3  0.60   0.00  74.47    124.00     0.00      7.50      6.33      0.38 

 Average:  DEV  tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util 

 Average:  sda   2.40   0.00     88.56     36.89      0.15     64.26      4.10      0.98 

 Average:  sda1  0.00   0.00      0.00      0.00      0.00      0.00      0.00      0.00 

 Average:  sda2  0.00   0.00      0.00      0.00      0.00      0.00      0.00      0.00 

 Average:  sda3  2.40   0.00     88.56     36.89      0.15     64.26      4.10      0.98

輸出的主要字段含義如下:

DEV 正在監視的塊設備

tps 每秒鐘物理設備的 I/O 傳輸總量

rd_sec/s 每秒從設備讀取的扇區數量

wr_sec/s 每秒向設備寫入的扇區數量

avgrq-sz I/O 請求的平均扇區數

avgqu-sz I/O 請求的平均隊列長度

await I/O 請求的平均等待時間,單位為毫秒

svctm I/O 請求的平均服務時間,單位為毫秒

%util I/O 請求所占用的時間的百分比,即設備利用率

本例可見磁盤 sda 的 I/O 操作較少,僅分區 sda3 存在 I/O 操作,且利用率低於 1%,平均 I/O 尺寸為 0.15 * 512 = 77B,I/O 操作以小塊寫入為主。本例中未發現異常輸出,不需對磁盤采取管理措施。

 

Unix/Linux 系統磁盤 I/O 性能監控自動化腳本示例

前文介紹了 AIX 與 Linux 磁盤 I/O 監控的手段,本節將結合實例介紹磁盤 I/O 監控的自動化腳本的設計和實現。

設計思路

1 . 監控指標

前文介紹了多個監控指標,比如吞吐量,每秒 I/O 數,平均單次 I/O 響應時間,磁盤利用率等,用戶可以根據自身系統和應用的特點選取監控指標。下文將以磁盤利用率為例進行監控腳本的設計。

2 .監控手段

對於 AIX, 命令“iostat -d”的輸出字段“% tm_act”反映磁盤利用率;對於 Linux, 命令“iostat -d -x”的輸出字段“%util”反映磁盤利用率。監控的頻次可以通過“iostat”命令本身的參數指定。

3. 告警機制

一般來說,如果磁盤使用率長時間達到 75% 或 80%, 通常會視為磁盤較忙,一般需進行調整磁盤布局,調整應用使用分配等管理活動,如果磁盤使用率偶爾較高,只需要繼續監視即可。因此告警既不能對於偶發現象頻繁告警,也不能放過持續時間較長的現象,本例的告警機制設定為“在一定時間間隔內的一定比例的監控記錄超出設定的磁盤利用率門限值即告警”

4 .日志

要保留磁盤 I/O,分析活動,告警信息等原始信息,便於以後進行問題分析,定位。

磁盤 I/O 分析和告警自動腳本

結合上文設計思路,筆者開發了磁盤 I/O 分析和告警腳本 I/OAnalyzer.sh, 我們的腳本在 RHEL 5.3、SLES 11、AIX 5.3 和 AIX 6.1 上測試通過。

腳本 IOAnalyzer.sh 的第一部分先進行了初始化,檢驗並處理輸入參數,對未輸入的參數指定默認值。

清單 6. IOAnalyzer.sh 腳本初始化部分
 #!/bin/sh 
 # ================================================================ 
 # Script Name:  IOAnalyzer.sh 
 # Desciption:   To analyze output of 'iostat -d', send an alert to admin 
 #              if disk utilization counter reach defined threshold 
 # Date:         May 19, 2009 
 #================================================================ 

 # ----------------------------------------------------------------- 
 # Function definitions...  	                          定義函數
 #---------------------------------------------------------------- 
			
 function usage { 
    echo ""
    echo "usage: IOAnalyzer.sh -i inIostatFile [ -l outLogFile ]  
 [ -a outAlertFile ] [ -u dishUtil ] [ -r rateGEUtil ]"
    echo ""
    echo "For example: IOAnalyzer.sh -i /tmp/iostat.out -l /tmp/logFile  
 -a /tmp/aletFile -u 80 -r 70"
    echo "For AIX, please run 'iostat -d [ <interval> [ <count> ]  
 to create inIostatFile"
    echo "For Linux, please run 'iostat -d -x [ <interval> [ <count> ]  
 to create inIostatFile"
    exit 1 
 } 

 # ---------------------------------------------------------------- 
 # Process command-line arguments 					     命令行參數處理
 # ---------------------------------------------------------------- 
 while getopts :i:l:a:u:r: opt 
 do 
    case "$opt" in 
    i) inIostatFile="$OPTARG";; 
    l) outLogFile="$OPTARG";; 
    a) outAlertFile="$OPTARG";; 
    u) diskUtil="$OPTARG";; 
    r) rateGEUtil="$OPTARG";; 
    ?) usage;; 
    esac 
 done 

 #---------------------------------------------------------------- 
 # Input validation 					                  輸入驗證
 #---------------------------------------------------------------- 

 if [ ! -f "$inIostatFile" ] 
 then 
        echo "error: invalid Augument inIostatFile in OPTION -i "
        usage 
        exit 1 
 fi 
 #--------------------------------------------------------------- 
			
 # Set values, if unset                                   設置變量
 # ---------------------------------------------------------------- 

 outLogFile=${outLogFile:-${inIostatFile}.log} 
 outAlertFile=${outAlertFile:-${inIostatFile}.alert} 
 diskUtil=${diskUtil:-'80'} 
 rateGEUtil=${rateGEUtil:-'60'}

接下來, IOAnalyzer.sh 腳本查詢日志,通過計算起止行的辦法定位 IO 輸出文件的待分析文本。

清單 7. IOAnalyzer.sh 腳本定位 I/O 輸出文件待分析部分
 # ---------------------------------------------------------------- 
 # Identify the lines to be analyzed between StartLine and Endline 
 # 定位日志中待分析文本
			
 # ---------------------------------------------------------------- 

 if [ ! -f "$outLogFile" ] || [ ! tail -1 "$outLogFile"|grep 'ENDLINE'] 
 then 
        StartLineNum=1; 
 else 
        CompletedLine=`tail -1 "$outLogFile" | grep 'ENDLINE' |  
 awk '{print $4}'|cut -d: -f2` 
        StartLineNum=`expr 1 + $CompletedLine` 
 fi 

 eval "sed -n '${StartLineNum},$p' $inIostatFile" > ${inIostatFile}.tail 

 LineCount=`cat ${inIostatFile}.tail|wc -l|awk '{print $1}'` 
 EndLineNum=`expr $LineCount + $StartLineNum`

清單 7 中的腳本實現了按行分析上文定位的 iostat 輸出,如果某行磁盤利用率小於先前定義的門限值,則在行尾標記“OK”,如果某行磁盤利用率大於等於先前定義的門限值,則在行尾標記“Alarm”。並且腳本中對於 AIX 和 Linux 輸出格式和磁盤命名的不同作了相應處理。

清單 8. IOAnalyzer.sh 按行分析 iostat 輸出
 # ---------------------------------------------------------------- 
 # Analyze 'iostat' output, append "Alarm" or "OK" at the end of each# line 
			
 # ---------------------------------------------------------------- 
 OS=`uname` 
 case "$OS" in 
 AIX) 
        diskUtilLabel="% tm_act"
        diskUtilCol=2 
        diskPrefix="hdisk"
        ;; 
 Linux) 
        diskUtilLabel="%util"
        diskUtilCol=14 
        diskPrefix="hd|sd"
        ;; 
 *)      echo "not support $OS operating system!"
        exit 1; 
        ;; 
 esac 

 eval "cat ${inIostatFile}.tail | egrep '${diskPrefix}'  
 | awk '{if ( $${diskUtilCol} * 100 < ${diskUtil} )  
 {$20 = "OK"; print $1"t"$${diskUtilCol}"t"$20 }  
 else {$20 = "Alarm"; print $1"t"$${diskUtilCol}"t"$20 } }'"  
 > ${outLogFile}.tmp

下文腳本給出一個告警觸發的例子,如果過高的磁盤利用率計數占總分析行數的比率達到或超出預定的比率,腳本會給 root 用戶發一封告警郵件。

清單 9. IOAnalyzer.sh 觸發告警
 # ---------------------------------------------------------------- 
 # Send admin an alert if disk utilization counter reach defined 
 # threshold 
			
 # ---------------------------------------------------------------- 
 Alert="NO"
 for DISK in `cut -f1  ${outLogFile}.tmp | sort -u` 
 do 
        numAlarm=`cat ${outLogFile}.tmp | grep "^$DISK.*Alarm$" |wc -l` 
        numRecord=`cat ${outLogFile}.tmp | grep "^$DISK" |wc -l` 
        rateAlarm=`expr $numAlarm * 100 / $numRecord` 
        if [ $rateAlarm -ge $rateGEUtil ];then 
                echo "DISK:${DISK}      TIME:`date +%Y%m%d%H%M`   
 RATE:${rateAlarm}      THRESHOLD:${rateGEUtil}" >> ${outAlertFile}.tmp 
 Alert="YES"
        fi 
 done 
 if [ $Alert= "YES" ];then 
			 cat ${outAlertFile}.tmp >> ${outAlertFile} 
        mail -s "DISK IO Alert"  root@localhost< ${outAlertFile}.tmp 
 fi

最後,腳本將分析活動歸檔,便於下次分析時定位起始行;另外,分析過程中產生的文件將被刪除。

清單 10. IOAnalyzer.sh 記錄分析活動日志和清除臨時文件
 #---------------------------------------------------------------- 
 # Clearup temporary files and logging 
 # ---------------------------------------------------------------- 

 echo "IOSTATFILE:${inIostatFile}        TIME:`date +%Y%m%d%H%M`   
 STARTLINE:${StartLineNum}       ENDLINE:${EndLineNum}   ALERT:${Alert}"  
			
 >> ${outLogFile} 

 rm -f ${outLogFile}.tmp 
 rm -f ${outAlertFile}.tmp 
 rm -f ${inIostatFile}.tail 

 exit 0

腳本使用示例

以下為 IOAnalyzer.sh 腳本在 AIX 上使用示例

1 .後台執行 iostat, 並將輸出重定向到文件中

清單 11. 後台執行 iostat
# nohup iostat -d 5 > /root/iostat.out &  
(對於 Linux,運行 iostat -d – x 5 > /root/iostat.out &)

2 .編輯 crontab 文件,每 10 分鐘運行一次 IOAnalyzer.sh 腳本,-u 70 –r 80,表示在距上次運行 IOAnalyzer.sh 至今產生的某磁盤的監控記錄中的 80% 使用率達到或超過 70%,即發出告警。告警日志和分析日志可通過 IOAnalyzer.sh 的 –l –a 參數指定,本例保持默認值,即在 iostat 的輸出文件所在目錄產生 iostat.out.log 和 iostat.out.alert 文件。

清單 12. 編輯 crontab
 # crontab – e 
 0,10,20,30,40,50 * * * * /root/IOAnalyzer.sh -i /root /iostat.out -u 70 
  -r 80>/tmp/iostat.out 2>&1

3 .用戶收到告警郵件,需要進一步查詢歷史記錄時,可查看日志文件

清單 13. 查看日志文件
 # cat /root/iostat.out.log | more 
 IOSTATFILE: /root/iostat.out TIME:200905200255 STARTLINE:7220 ENDLINE:7580  ALARM:YES 
 IOSTATFILE: /root/iostat.out  TIME:200905200300  STARTLINE:7581 ENDLINE:7940 ALARM:YES 
 IOSTATFILE:/root/iostat.out TIME:200905200305  STARTLINE:7941 ENDLINE:8300 ALARM:YES 

 [AIXn01]> cat /root/iostat.out.alert | more 
 DISK:hdisk4     TIME:200905200250         RATE:84      THRESHOLD:70 
 DISK:hdisk5     TIME:200905200250         RATE:84      THRESHOLD:70 
 DISK:hdisk6     TIME:200905200250         RATE:84      THRESHOLD:70
 

小結

本文介紹了 Unix/Linux 上的磁盤 I/O 管理命令並通過一個自動化監控腳本詳細介紹了如何實現磁盤 I/O 的自動化監控管理。磁盤 I/O 的自動化監控能幫助系統管理員及時發現磁盤 I/O 的異常問題,管理員可通過采取相應的措施使得問題得以消除和緩解。

Copyright © Linux教程網 All Rights Reserved