磁盘 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)%util
磁盤處于活動時間的百分比,即磁盤利用率,磁盤在數據傳輸和處理命令(如尋道)處于活動狀態。磁盤利用率與資源爭用程度成正比,與性能成反比。也就是說磁盤利用率越高,資源爭用就越嚴重,性能也就越差,響應時間就越長。一般來說,如果磁盤利用率超過?70%,應用進程將花費較長的時間等待?I/O?完成,因為絕大多數進程在等待過程中將被阻塞或休眠。
5)服務時間(ServiceTime)svctm
指磁盤讀或寫操作執行的時間,包括尋道,旋轉時延,和數據傳輸等時間。其大小一般和磁盤性能有關,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?宜直接存取原始磁盤分區(rawpartition)或者利用繞過文件系統緩存的?DIO?技術(direct IO);
(6)利用內存讀寫帶寬遠比直接磁盤?I/O?操作性能優越的特點,將頻繁訪問的文件或數據置于內存中。
?
iostat使用
| [命令:] iostat [-c|-d] [-k] [-t] [間隔描述] [檢測次數] 參?數: -c :?僅顯示cpu的狀態 -d :?僅顯示存儲設備的狀態,不可以和-c一起使用 -k :?默認顯示的是讀入讀出的block信息,用-k可以改成KB大小來顯示 -t:?顯示日期 -p device | ALL : device為某個設備或者某個分區,如果使用ALL,就表示要顯示所有分區和設備的信息 |
1)基本使用
$iostat-d -k 1 10
說明:參數-d?表示,顯示設備(磁盤)使用狀態;-k某些使用block為單位的列強制使用Kilobytes為單位;1 10表示,數據顯示每隔1秒刷新一次,共顯示10次,每一次的統計都是上一次的統計時間到這次的統計時間之間的統計數據。
2)-x?參數
使用-x參數我們可以獲得更多統計信息。
$iostat -d -x -k 1 10
3)-c?參數
獲取cpu部分狀態值
$iostat -c 1 10
4)常見用法
$iostat -d -k 1 10
#查看TPS和吞吐量信息
$iostat -d -x -k 1 10
#查看設備使用率(%util)、響應時間(await)
$iostat -c 1 10
#查看cpu狀態
5)mpstat命令
mpstat是MultiProcessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統里,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。下面只介紹mpstat與CPU相關的參數,mpstat的語法如下:
| mpstat??[-P {|ALL}] [internal [count]] 參數解釋-P??{|ALL}?表示監控哪個CPU,?cpu在[0,cpu個數-1]中取值 internal??相鄰的兩次采樣的間隔時間 count??采樣的次數,count只能和delay一起使用 |
當沒有參數時,mpstat則顯示系統啟動以后所有信息的平均值。有interval時,第一行的信息自系統啟動以來的平均信息。
(1)$mpstat
mpstat不帶參數時,輸出為從系統啟動以來的平均值。
(2)$mpstat-P ALL 2 3
2秒產生所有處理器的統計數據報告,統計三次,默認輸出所有的處理器的統計數據;
(3)$mpstat–P 0 2 3
2秒產生0號處理器的統計數據報告,統計三次;
iostat相關參數說明| 參數 | 英文說明 | 說明 |
| rrqm/s | read request merge | 每秒進行?merge?的讀操作數目。即?delta(rmerge)/s |
| wrqm/s | write request merge | 每秒進行?merge?的寫操作數目。即?delta(wmerge)/s |
| r/s | read | 每秒完成的讀?I/O?設備次數。即?delta(rio)/s |
| w/s | write | 每秒完成的寫?I/O?設備次數。即?delta(wio)/s |
| rsec/s | read section | 每秒讀扇區數。即??delta(rsect)/s |
| wsec/s | write section | 每秒寫扇區數。即??delta(wsect)/s |
| rkB/s | read kilo byte | 每秒讀K字節數。是?rsect/s?的一半,因為每扇區大小為512字節。(需要計算) |
| wkB/s | write kilo byte | 每秒寫K字節數。是?wsect/s?的一半。(需要計算) |
| avgrq-sz | average request size | 平均每次設備I/O操作的數據大小?(扇區)。delta(rsect+wsect)/delta(rio+wio) |
| avgqu-sz | average queue size | 平均I/O隊列長度。即?delta(aveq)/s/1000 (因為aveq的單位為毫秒) |
| await | average wait | 平均每次設備I/O操作的等待時間?(毫秒)。即??delta(ruse+wuse)/delta(rio+wio) |
| svctm | service time | 平均每次設備I/O操作的服務時間?(毫秒)。即??delta(use)/delta(rio+wio) |
| %util | utilty | 一秒中有百分之多少的時間用于?I/O?操作,或者說一秒中有多少時間?I/O?隊列是非空的。即?delta(use)/s/1000 (因為use的單位為毫秒) |
如果%util接近?100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸,idle小于70% IO壓力就較大了,一般讀取速度有較多的wait。同時可以結合vmstat(virtual memory status)查看b參數(等待資源的進程數)和wa參數(IO等待所占用的CPU時間的百分比,高過30%時IO壓力高)
另外還可以參考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人要快吧??除了數人頭,我們也常??纯辞懊嫒速徺I的東西多少,如果前面有個采購了一星期食品的大媽,那么可以考慮換個隊排了。還有就是收銀員的速度了,如果碰上了連錢都點不清楚的新手,那就有的等了。另外,時機也很重要,可能?5?分鐘前還人滿為患的收款臺,現在已是人去樓空,這時候交款可是很爽啊,當然,前提是那過去的?5?分鐘里所做的事情比排隊要有意義(不過我還沒發現什么事情比排隊還無聊的)。
I/O?系統也和超市排隊有很多類似之處:
r/s+w/s?類似于交款人的總數
平均隊列長度(avgqu-sz)類似于單位時間里平均排隊人的個數
平均服務時間(svctm)類似于收銀員的收款速度
平均等待時間(await)類似于平均每人的等待時間
平均I/O數據(avgrq-sz)類似于平均每人所買的東西多少
I/O?操作率(%util)類似于收款臺前有人排隊的時間比例。
參數輸出的分析
#iostat -x 1
| avg-cpu: %user %nice %sys %idle 16.24 0.00 4.31 79.44 Device: rrqm/s wrqm/s r/s w/s rsec/s??wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsda 0.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。
我們可以根據這些數據分析出?I/O?請求的模式,以及?I/O?的速度和響應時間。
?
轉載于:https://blog.51cto.com/lfsoul/1176501
總結
以上是生活随笔為你收集整理的磁盘 I/O性能指标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java进阶02 异常处理
- 下一篇: grub参数介绍。