【儲存】如何計算IOPS ?

楊奇龍發表於2013-03-31
我們知道評估io效能的三個關鍵指標為:
 1 IOPS
   每秒鐘處理的IO請求數量。IOPS是隨機訪問型別業務(OLTP類)很重要的一個參考指標。
 2 IO Response Time
   IO的響應時間。IO響應時間是從作業系統核心發出一個IO請求到接收到IO響應的時間。因此,IO Response time除了包括磁碟獲取資料的時間,還包括了作業系統以及在儲存系統內部IO等待的時間。
 3 Throughput
  吞吐量。這個指標衡量標識了最大的資料傳輸量。如上說明,這個值在順序訪問或者大資料量訪問的情況下會比較重要。尤其在大資料量寫的時候。
   如何計算IOPS ? 本文透過利用/proc/disksats 的內容來計算磁碟iops,如果是多個磁碟,需要多個變數來標記每個磁碟的累計值和前一秒的值,做減法操作。
首先介紹一下/proc/diskstats 的意義
root@rac1 markbench]# cat /proc/diskstats
   1    0 ram0 0 0 0 0 0 0 0 0 0 0 0
   1    1 ram1 0 0 0 0 0 0 0 0 0 0 0
   3    0 hda 215832 48798 8460369 1779489 10387352 10706454 278983110 129355207 12 30046343 131143587
   3    1 hda1 328 1805 2367 1482 24 11 61 1518 0 1499 3000
   3    2 hda2 214383 41704 8442154 1766493 10387210 10706256 278981160 129335402 12 30040228 131110596
   3    3 hda3 174 1250 1455 920 0 0 0 0 0 110 920
   3    4 hda4 4 0 8 9 0 0 0 0 0 9 9
   3    5 hda5 925 4006 13977 10447 118 187 1889 18287 0 7409 28734
  202   32 xvdc 38 76 912 14 0 0 0 0 0 14 14
  202   16 xvdb 40 76 928 17 0 0 0 0 0 17 17
  22    0 hdc 18 86 416 39 0 0 0 0 0 35 39
   9    0  md0 0 0 0 0 0 0 0 0 0 0 0

這個命令用於顯示磁碟、分割槽和統計資訊:hda為整個硬碟的統計資訊,hda1為第一個分割槽的統計資訊,hda2為第二個分割槽的統計資訊。
ramdisk裝置為透過軟體將RAM當做硬碟來使用的一項技術。

[root@rac1 markbench]#  cat /sys/block/hda/hda2/stat
  214428    41704  8443522  1767344 10431899 10785067 282040104 130435808        9 30120018 132201965

/proc/diskstats檔案比/sys/block/hda/hda2/stat檔案多3列,從左至右分別對應主裝置號,次裝置號和裝置名稱。後續的11列的意義在這兩個檔案裡是相同的,除了第9列,所有的域都是從啟動時的累積值。 

第1 列 讀完成次數,成功完成讀的總次數。
(number of issued reads. This is the total number of reads completed successfully.)

第2 列 合併讀完成次數, 第6 列合併寫完成次數。為了效率可能會合並相鄰的讀和寫。從而兩次4K的讀在它最終被處理到磁碟上之前可能會變成一次8K的讀,才被計數(和排隊),因此只有一次I/O操作。該值使你知道這樣的操作有多頻繁。
(number of reads merged)

第3 列 讀扇區的次數,成功讀過的扇區總次數。
(number of sectors read. This is the total number of sectors read successfully.)

第4 列 讀花費的毫秒數,這是所有讀操作所花費的毫秒數(用__make_request()到end_that_request_last()測量)。
(number of milliseconds spent reading. This is the total number of milliseconds spent by all reads (as measured from __make_request() to end_that_request_last()).)

第5 列 寫完成次數,成功寫完成的總次數。
(number of writes completed. This is the total number of writes completed successfully.)

第6 列 合併寫完成次數  
(number of writes merged Reads and writes which are adjacent to each other may be merged for efficiency. Thus two 4K reads may become one 8K read before it is ultimately handed to the disk, and so it will be counted (and queued) as only one I/O. This field lets you know how often this was done.)

第7 列 寫扇區次數,成功寫扇區總次數。
(number of sectors written. This is the total number of sectors written successfully.)

第8 列 寫操作花費的毫秒數,這是所有寫操作所花費的毫秒數(用__make_request()到end_that_request_last()測量)。
(number of milliseconds spent writing This is the total number of milliseconds spent by all writes (as measured from __make_request() to end_that_request_last()).)

第9 列 正在處理的輸入/輸出請求數-I/O的當前進度,只有這個域應該是0。當請求被交給適當的request_queue_t時增加和請求完成時減小。
(number of I/Os currently in progress. The only field that should go to zero. Incremented as requests are given to appropriate request_queue_t and decremented as they finish.)

第10 列 輸入/輸出操作花費的毫秒數,花在I/O操作上的毫秒數,這個域會增長只要field 9不為0。
(number of milliseconds spent doing I/Os. This field is increased so long as field 9 is nonzero.)

第11 列 輸入/輸出操作花費的加權毫秒數  花在I/O操作上的毫秒數,在每次I/O開始,I/O結束,I/O合併時這個域都會增加。這可以給I/O完成時間和儲存那些可以累積的提供一個便利的測量標準。
(number of milliseconds spent doing I/Os. This field is incremented at each I/O start, I/O completion, I/O merge, or read of these stats by the number of I/Os in progress (field 9) times the number of milliseconds spent doing I/O since the last update of this field. This can provide an easy measure of both I/O completion time and the backlog that may be accumulating.)


統計的iops 的指令碼如下:
#!/bin/bash
uplrio=0
uplwio=0
updrio=0
updwio=0

while true ; do
        lrio=$(grep hda2 /proc/diskstats | awk '{print $4}')
        lwio=$(grep hda2 /proc/diskstats | awk '{print $8}')
        llrio=$(echo $lrio - $uplrio | bc)
        llwio=$(echo $lwio - $uplwio | bc)
        iops=$(echo "$llrio + $llwio " | bc)
        echo "iops:$iops Data_Read $llrio Data_Write $llwio "
        uplrio=$lrio
        uplwio=$lwio
        sleep 1
done

效果展示:
[root@rac1 markbench]# sh iops.sh 
iops:10348521 Data_Read 214045 Data_Write 10134476  --第一個因為是累計值-0的結果,所以比較大,可以忽略。
iops:322 Data_Read 0 Data_Write 322 
iops:596 Data_Read 0 Data_Write 596 
iops:589 Data_Read 0 Data_Write 589 
iops:615 Data_Read 0 Data_Write 615 
iops:599 Data_Read 0 Data_Write 599 
iops:455 Data_Read 0 Data_Write 455 
iops:533 Data_Read 0 Data_Write 533 
iops:516 Data_Read 0 Data_Write 516 
iops:214 Data_Read 0 Data_Write 214 
iops:544 Data_Read 0 Data_Write 544 

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

相關文章