1. 程式人生 > >Linux 如何測試 IO 效能(磁碟讀寫速度)

Linux 如何測試 IO 效能(磁碟讀寫速度)

這幾天做MySQL效能測試,偌大一個公司,找幾臺效能測試機器都很糾結,終於協調到兩臺,IO的效能如何還不知道。
資料庫屬於IO密集型的應用,所以還是先評估下Server的IO效能,看看是否能和線上的機器匹配上。

之前一直知道用dd(device to device)命令可以簡單測試磁碟的IO讀寫速度,但沒有深究。
但這次做效能測試的關係,需要得到一個相對精確的值(之前的測試吃過這方面的虧,插個題外話,效能測試一定要首先確認好測試環境。)
網上常見的方法是使用hdparm和dd命令來測試,但實際的使用起來都有問題,而且測試結果總感覺有偏差,心裡沒底。
於是還是安心研究了下這兩個命令,也做了一些測試和分析,簡單做下總結。

用法:
1.測試IO讀


     hdparm -t --direct /dev/sda3

     IO讀用上面的命令測試即可,不過 hdparm 這個工具需要自己安裝,而且需要root使用者去執行。

2.測試IO寫
    sync;/usr/bin/time -p bash -c "(dd if=/dev/zero of=test.dd  bs=1000K count=20000;sync)"

    dd bs=1M count=20000 if=/dev/zero of=test.dd conv=fdatasync   dd命令測試是IO的順序寫和讀方式。

3.檢視檔案系統塊大小

   tune2fs -l /dev/sda1 | grep Block

上面的命令列有些複雜,做下詳細的解釋:
(1)sync 命令用來重新整理檔案系統的緩衝區,執行sync命令實際的作用是把記憶體中的資料緩衝寫入到磁碟中。
         先執行下sync命令,是為了減少對後面測試的影響。也可以使用 echo 3 > /proc/sys/vm/drop_caches 來清除快取。
(2)time 命令用來測試命令的執行時間,shell內建還有一個time命令,我們這裡使用全路徑來指定使用的是非內建命令。
        -p 選項設定時間的輸出格式為POSIX預設時間格式,單位是秒,在後面的測試小節可以看到time -p 的輸出形式。
(3)bash 命令 -c 選項的作用是將後面的字串引數當作bash指令碼來執行,看起來有些畫蛇添足,好像直接執行也是可行的,
        其實不然,因為後面字串中包含了兩條命令列,而time命令需要統計這兩條命令列的執行時間。
(4)小括號的意思是另起一個子程序來執行括號中的指令碼,dd 這條命令列這裡就不講了,不知道的話Baidu吧。
        重點是sync命令,因為當dd退出時,這條命令列提交的大部分內容都在記憶體緩衝區(寫快取),甚至如果機器的記憶體相比於你提交的資料要大得多,
        那可能資料都在記憶體中,而再執行sync才能將記憶體中的資料寫入到磁碟中,否則就成了測試記憶體的寫速度,那顯然不是你想要的結果。


測試實踐:
在一臺記憶體64G,SAS硬碟上做了一些測試。
測試過程中,需要關注兩點,磁碟的讀寫速度和IO使用率,我們分別使用iopp和iostat工具來觀察。

測試寫速度:
測試寫入20G資料,資料量越大,測試值應該更精確。
# sync;/usr/bin/time -p bash -c "(dd if=/dev/zero of=test.dd  bs=1M count=20000)"
20000+0 records in
20000+0 records out
real 92.87
user 0.00
sys 18.08

寫入20000M的時間是92.87s,所以磁碟的寫速度為 215.35MB/sec (20000M/92.87)。
使用iostat觀測,%util 一直處於100%的狀態,而iopp 顯示的dd命令寫入速度基本和上面計算出的值是一致的(取樣時間設定為5s)
# iostat -x 5
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.20  864.00     1.60 449004.80   519.56   143.61  163.46   1.16 100.00

# iopp -i -k 5
pid    rchar    wchar    syscr    syscw      rkb      wkb     cwkb command
32566  1033216  1033216        0        0        0  1034868        0 dd

注:命令列的當前工作目錄在分割槽/dev/sda3上,所以test.dd這個檔案也建立在這個分割槽上,下面的讀測試會使用到這個檔案。

測試讀速度:
將dd 和 hdparm的做一個對比:

#  hdparm -t --direct /dev/sda3
/dev/sda3:
 Timing O_DIRECT disk reads: 2108 MB in  3.00 seconds = 702.34 MB/sec

hdparm的測試結果為,3s讀取了2108MB,讀速度為702.34MB。

由於hdparm測試時間太短,iostat和iopp取樣時間調整為1s。

iostat -x 1
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00 2752.00    1.00 1409024.00     8.00   511.82     4.64    1.69   0.35  96.10

iopp -i -k 1
pid    rchar    wchar    syscr    syscw      rkb      wkb     cwkb command
32349   733184        0        0        0   733184        0        0 hdparm

使用dd做讀取測試
# echo 3 > /proc/sys/vm/drop_caches ; /usr/bin/time -p dd if=test.dd of=/dev/null  bs=1M 
20000+0 records in
20000+0 records out
real 35.69
user 0.00
sys 9.81

讀取了20G,讀速度為560.38MB/sec。

讀取會比寫入要快,iostat和iopp的取樣時間調整為每3s。
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda             106.67     0.00 5851.00    0.33 1434256.00     2.67   245.12     1.62    0.28   0.16  93.60

pid    rchar    wchar    syscr    syscw      rkb      wkb     cwkb command
17004  1449984  1449984        1        1  1450760        0        0 dd

結論:

dd測試出的讀速度和hdparm 是存在區別的,
通過 bs 選項 設定不通的讀寫塊大小測試(預設512位元組,測試使用1M),
可以看出 dd 的測出的速度與讀寫塊的大小有關係,還可能受到系統中有IO讀寫的程序的影響。
hdparm的測試原理沒做深入研究,可能是和dd的測試方法存在差別,需要知道這一點。

整體上看,IO的實際測試速度是受到很多因素影響的,包括讀寫的方式(隨機還是順序,hdparm和dd測試是都是採用順序讀寫)、快取機制、測試的取樣等等。
所以不太可能得到一個確定的值(相同的命令列多次測試也不一樣,不過差別要小些),以上的方法中讀測試還是推薦使用hdparm。
以上的資料雖然存在偏差,但還是能大體分析出機器的IO效能。只是需要明確,這些測試值是在什麼樣的環境下獲得的。

友情連結:

FIO測試iops:http://elf8848.iteye.com/blog/2168876

dd測試io: http://www.askoracle.org/linux/disk/968.html