這幾天作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)"html
dd bs=1M count=20000 if=/dev/zero of=test.dd conv=fdatasync dd命令測試是IO的順序寫和讀方式。linux
3.查看文件系統塊大小ios
tune2fs -l /dev/sda1 | grep Blockshell
上面的命令行有些複雜,作下詳細的解釋:
(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.10bash
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
oracle
結論:async
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