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

怎樣才能快速的定位到併發高是因爲磁盤io開銷大呢?能夠經過三種方式:node

Top能夠看到的cpu信息有:ios

  Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie數據庫

  Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si緩存

  具體的解釋以下:性能優化

  Tasks: 29 total 進程總數併發

  1 running 正在運行的進程數app

  28 sleeping 睡眠的進程數函數

  0 stopped 中止的進程數工具

  0 zombie 殭屍進程數佈局

  Cpu(s):

  0.3% us 用戶空間佔用CPU百分比

  1.0% sy 內核空間佔用CPU百分比

  0.0% ni 用戶進程空間內改變過優先級的進程佔用CPU百分比

  98.7% id 空閒CPU百分比

  0.0% wa 等待輸入輸出的CPU時間百分比

  0.0% hi

  0.0% si

  0.0% wa 的百分比能夠大體的體現出當前的磁盤io請求是否頻繁。若是 wa的數量比較大,說明等待輸入輸出的的io比較多。

 

 

 

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

1.小文件讀寫的磁盤性能瓶頸是尋址(隨機讀寫性能更差)評估標準:TPS
2.大文件讀寫的磁盤性能瓶頸是貸款,評估標準是持續的讀寫速度
3.Linux有一個特性是能夠用空閒的內存做爲Cache,所以大的內存能夠頗有效的提升存儲系統性能.

磁盤 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%,同時等待時間也較長,應該對其採起管理措施。

在 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.三、SLES 十一、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 的異常問題,管理員可經過採起相應的措施使得問題得以消除和緩解。

相關文章
相關標籤/搜索