關於磁盤I/O測試工具Bonnie++的專題

前言
最早是eygle在itpub上推薦這個工具,起因是我對於Sun的軟RAID性能提出的置疑,後來eygle陸續用這個工具作了一些盤陣IO的測試,包括EMC和T3的一些比較。

這些測試結果都發表在eygle的個人站點上,見本文最後相關鏈接部分。

但 是我卻一直沒有自己用Bonnie++測試過IO性能,最近一個客戶要修改自己盤陣的RAID配置,本來就是使用D2的陣列,只能支持軟RAID的一個性 能比較差的古老東東了,在我們的測試過程中忽然又發現12塊盤的盤陣配置的是RAID10,但是同時只有2塊盤在作讀寫,也就是stripe設置只是2, 這個問題在一年多以前剛上系統的時候就是這樣,居然一直沒有發現用了這麼長時間。

客戶最終決定重新設置一下RAID的配置,首先將redo和datafile分開,redo所在的盤用4塊作RAID10,剩下8塊再作RAID10,供數據文件使用,並且重新設置stripe,redo所在的lun設置爲2,datafile所在的lun設置爲4。

從理論上看,這樣的修改應該會大幅度提到整個數據庫的I/O效率,但是客戶要求能夠有一個實際的修改效果報告,也就是需要作修改前和修改後的對比。

這樣,於是決定使用bonnie++來作磁盤級的修改效果報告。至於數據庫級的修改效果自然有壓力測試程序可以完成,此處不表。

既然決定使用,那麼自然要琢磨一下該怎麼用了。剛剛bonnie++已經開始運行了,於是閒下來,寫了這篇文章。

安裝
其實今天大部分的時間是耗在怎麼讓bonnie++運行起來上面了。

 

從bonnie++的主頁上下載了最新的source,bonnie++1.03a.tgz。

gunzip bonnie++-1.03a.tgz

生成bonnie++-1.03a.tar文件,然後解包

tar xvf bonnie++-1.03a.tar

生成bonnie++-1.03a文件夾

cd bonnie++-1.03a

make

報錯。

/usr/ucb/cc: language optional software package not installed

原來編譯器就根本沒裝。

先介紹一下主機情況,一臺SunFire v480,兩塊73G內置硬盤,4個UltraSPARC-III+的CPU,8G內存,安裝的是Solaris8,由於需要模擬真實環境,所以安裝的是比較老的02.2版本,而且沒有打任何patch。

在Sun給的安裝光盤中居然沒有找到Companion CD,編譯器應該是在這張盤上,沒辦法只好上網自己找,還好,很快就找到一個很棒的站點blastwave,包括了Solaris8,9的sparc和x86版本的所有需要的package。

根據gcc包下載頁面中的說明,發現需要下載下面四個package。

common-1.3.3-SunOS5.8-sparc-CSW.pkg.gz

gcc3rt-3.3.3,REV=2004.04.23-SunOS5.8-sparc-CSW.pkg.gz

libiconv-1.8,REV=2003.01.12-SunOS5.8-sparc-CSW.pkg.gz

gcc3-3.3.3,REV=2004.03.22-SunOS5.8-sparc-CSW.pkg.gz

前面三個包是最後gcc3包的前提條件,必須安裝。全部下載完畢,開始安裝第一個包,也就是common那個包,報錯。

提示操作系統的110934補丁版本過低,需要升級。

OK,再上網找,直接用google查,關鍵字是“110934 soalris”,通常前面幾個link就會指向SunSolve站點的下載頁面,patch通常不大,很快就下載完了。

開始打補丁,patchadd 110934-21。

系統運行半天,報錯。

說要安裝這個補丁就需要先安裝110380-04的補丁。我倒。

再上網找,下載完110380-04,先patchadd 110380-04,一切正常。

再重新patchadd 110934-21,一切正常。

打完補丁以後,重新安裝common包,OK,一切正常。

pkgadd -d common-1.3.3-SunOS5.8-sparc-CSW.pkg.gz

然後依次安裝其它的包,一切正常。

這個包將gcc安裝到/opt/csw/gcc3目錄下。

說明文件指出安裝完gcc將創建/opt/csw/bin下的gcc執行程序,所以要求將這個路徑加入用戶的PATH變量中,但是實際上安裝完gcc3.3的版本以後,並沒有在上面的路徑中生成任何文件。

後來我再安裝gcc2.95版本的時候發現這個版本的安裝纔是將gcc生成到/opt/csw/bin中。

所以如果我們在Solaris8中即安裝了gcc2.95又安裝了gcc3.3,那麼要注意這兩個版本的gcc文件在不同的路徑下,其實這也是應該的,否則新版本會覆蓋舊版本,往往是很多人不願意的。

回到上面,安裝完gcc3以後,再次運行make,仍然報錯。

/usr/ucb/cc: language optional software package not installed

檢查PATH環境變量,已經將/opt/csw/gcc3/bin目錄加入了。

想了一下,感覺應該是系統還在使用原來的/usr/ucb/cc。於是將cc鏈接到新安裝的gcc上,這樣無論什麼時候調用cc其實都是直接使用gcc了。

whereis cc

cd /usr/ucb

mv cc cc.org

ln -s /opt/csw/gcc3/bin/gcc /usr/ucb/cc

備註:如果要安裝gcc2的包,那麼需要下載下面兩個package。

gcc2rt-2.95.3,REV=2003.03.01-SunOS5.8-sparc-CSW.pkg.gz

gcc2-2.95.3-SunOS5.8-sparc-CSW.pkg.gz

安裝完畢以後,同樣是將cc鏈接到這個版本的gcc上。

whereis cc

cd /usr/ucb

mv cc cc.org

ln -s /opt/csw/bin/gcc /usr/ucb/cc

修改完畢以後編譯成功。

運行bonnie++,報錯。

libstdc++.so.5: cannot open shared object file: No such file or directory.

繼續查資料,發現bonnie++尋找的lib路徑是環境變量LD_LIBRARY_PATH指定的路徑,但是這個路徑下並沒有libstdc++.so.5文件,於是手工將libstdc++.so.5文件從gcc3的安裝路徑中ln到/usr/lib下面。

# ln -s /opt/csw/gcc3/lib/libstdc++.so.5 /usr/lib/libstdc++.so.5

再次運行,仍然報錯。

libgcc_s.so.1: cannot open shared object file: No such file or directory.

這次就輕車熟路了,直接再作一次link。

# ln -s /opt/csw/gcc3/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so.1

終於,bonnie++可以正常運行了。

我們可以不需要自己編譯,在eygle的站點上有Solaris8下載編譯好的bonnie++。直接可以使用,當然如果運行報libstdc++.so.5找不到的問題,還需要按照上面的方法解決。

使用.
接下來繼續介紹bonnie++(Version: 1.03)的使用方法以及結果的含義。

usage: bonnie++ [-d scratch-dir] [-s size(Mb)[:chunk-size(b)]]

[-n number-to-stat[:max-size[:min-size][:num-directories]]]

[-m machine-name]

[-r ram-size-in-Mb]

[-x number-of-tests] [-u uid-to-use:gid-to-use] [-g gid-to-use]

[-q] [-f] [-b] [-p processes | -y]

首先說明一下命令中常用的參數。

-d 生成測試文件的路徑

-s 生成測試文件的大小,以M爲單位(如果不使用-r參數,則要求文件大小至少是系統物理內存的2倍)

-m 機器名,實際上我們可以認爲是本次測試的方案名,可以隨便定義。默認是本機的hostname。

-r 內存大小,指定內存大小,這樣可以通過-s參數創建r*2大小的文件,通常用於縮短測試時間,但是需要注意這樣由於內存的cache可能導致測試結果的不準確

-x 測試的次數

-u 測試文件的屬主和組,默認是執行bonnie++的當前用戶和當前組

-g 測試文件的組,默認是執行bonnie++的當前用組

-b 在每次寫文件時調用fsync()函數,對於測試郵件服務器或者數據庫服務器這種通常需要同步操作的情況比較適合,而不使用該參數則比較適合測試copy文件或者編譯等操作的效率。

通常我們可以簡單地運行如下命令進行磁盤性能測試:

bonnie++ -d /global/oradata –m sun3510

這樣將會在指定的目錄下(通常我們會指定一個盤陣上卷的掛載點),生成相當於主機物理內存兩倍的文件,如果總量大於1G,則生成多個大小爲1G的文件。假設主機內存爲4G,那麼在測試中就會生成8個1G的文件,到測試結束,這些文件會被自動刪除。

如果我們的主機內存是4G,但是我們想縮短測試的時間,比如說只寫2G的文件,就應該執行下面的命令:

bonnie++ -d /global/oradata –m sun3510 –s 2048 –r 1024

 

bonnie++的在測試的時候通常會佔用大量的IO和CPU,所以請不要在生產環境的業務高峯期進行測試。

下面看一個測試結果,通過這個結果我們解釋一下到底bonnie++在測試過程中都作了什麼,而每一個輸出的結果又表示了什麼。

這 個測試結果是在一臺SunFire V880 + D2陣列上進行的,主機配置是2個UltraSparc-III+ 900MHz的CPU,4G內存,而D2陣列是滿配的12塊36G SCSI磁盤,劃分了兩個LUN,我們的測試目的地/global/oradata建立在其中的一個LUN上,使用了8塊磁盤,用Veritas Volum Manager作了RAID10,stripe(也就是ncol)設置爲4。

bonnie++ -d /global/oradata -s 8192 -m d2new -u oracle

Using uid:1001, gid:101.

Writing with putc()...done

Writing intelligently...done

Rewriting...done

Reading with getc()...done

Reading intelligently...done

start 'em...done...done...done...

Create files in sequential order...done.

Stat files in sequential order...done.

Delete files in sequential order...done.

Create files in random order...done.

Stat files in random order...done.

Delete files in random order...done.

Version 1.03 ------Sequential Output------ --Sequential Input- --Random-

-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--

Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

d2new 8G 18275 62 32832 26 25423 55 27444 94 106842 60 549.9 7

------Sequential Create------ --------Random Create--------

-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--

files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

16 1723 15 +++++ +++ 5059 40 4821 37 +++++ +++ 653 5

依 次解讀一下,從Writing with putc()開始到Delete files in random order…結束,這是bonnie++作的12項測試,這12項測試依次對應12項結果,而這12項結果又被分爲了5大類,分別是Sequential Output(寫測試),Sequential Input(讀測試),Random Seeks(讀寫測試),Sequential Create(順序讀寫文件測試)和Random Create(隨意讀寫文件測試)。

那麼測試步驟和測試結果依次對應的順序就是:

Writing with putc() -> Sequential Output的Per Chr

Writing intelligently -> Sequential Output的Block

Rewriting -> Sequential Output的Rewrite

Reading with getc() -> Sequential Input的Per Chr

Reading intelligently -> Sequential Input的Block

start 'em -> Random Seeks

Create files in sequential order -> Sequential Create的Create

Stat files in sequential order -> Sequential Create的Read

Delete files in sequential order -> Sequential Create的Delete

Create files in random order -> Random Create的Create

Stat files in random order -> Random Create的Read

Delete files in random order -> Random Create的Delete

每個結果中又包括了2項數值,一個是K字節數或者文件數,另一個是%CP,就是執行這項測試時CPU的平均佔用率。

對於輸出結果的評價,我們認爲在相等CPU的佔用率情況下,存取字節數越高表示該存儲設備的吞吐量越大,自然性能也就越好。

值 得注意的是,在測試RAID的時候,對於多CPU的系統,bonnie++並沒有發揮CPU的最大潛力,也就是說bonnie++發出的I/O請求通常不 夠達到CPU和磁盤的最大壓力,這時候顯示的吞吐量就不是這個存儲設備能夠達到的最大值。我們可以在測試的同時通過iostat,mpstat,sar等 命令監控系統狀況,如果沒有明顯的I/O等待,通常表示測試軟件的壓力不夠。在bonnie++的主頁上也表示對於多CPU多進程的支持將放到2.0版本 中去實現。

明白了測試步驟和測試結果之後,我們再來進一步看看每個測試結果都是什麼含義。

Sequential Output

1. Per Char

就是Per-Character的含義。使用putc()函數進行循環寫入,每次寫入的字節很小,基本上可以放入任意一種I-Cache中,這種情況下的CPU消耗在處理putc()代碼和分配磁盤文件空間上。

2. Block

使用write(2)函數創建文件。這種情況下的CPU消耗只是在分配磁盤文件空間上。

3. Rewrite

使用read(2)函數讀取文件,然後修改再用write(2)函數寫回。由於文件的空間已經分配好,所以這種方式可以很有效地測試文件系統緩存和數據傳輸的速度。

Sequential Input

1. Per Char

使用getc()函數循環 讀取文件內容

2. Block

使用read(2)函數循環讀取文件內容,有效測試磁盤讀取的效率。

Random Seek

默 認3個進程作8000次的測試。用read(2)函數讀取文件的block,同時有10%的操作是用write(2)函數將block修改以後寫回文件 中。在這個測試中,如果內存容量大於創建的文件大小,那麼將會出現比較高的數值,而這個數值可能並不能準確反映磁盤本身的I/O效率。

Sequential Create和Radom Create

這兩大類測試均是用創建,讀取,刪除大量的小文件來測試磁盤效率。文件名用7位數字和任意個數(0-12)的任意英文字母來組成。在Sequential部分,字母在數字之後,而Random部分則是字母在數字之前。

創建文件的最小值和最大值等參數可以在bonnie++命令行中用-n參數來控制。

 

在 測試結果的最後一行是用逗號隔開的一列數字,第一個位置是我們在運行bonnie++時用-m參數指定的機器名,第二個位置是測試時生成的文件大小,後面 依次是各類測試的結果。我們將多個測試的最後一行粘貼到Excel中,然後用圖表功能生成柱狀圖,就可以對多項測試有一個極爲直觀的評測比較。

下面列出了幾種評測的結果,以後也會陸續添加更多的評測,同時歡迎大家將自己的評測結果mail給我,我會加入到這篇文章中。我的郵件地址是[email protected]




SunFire v480 4*(UltraSparc-III+ 1050MHz) 8GRAM



評測 .
我們通過bonnie++來測試各種磁盤配置,或者測試各種RAID設置下的磁盤效率,可以有助於我們對於各個產品或者各個方案的磁盤吞吐效率有個大體認識。 本地光纖硬盤

>bonnie++ -d . -s 16384 -m report -u oracle:dba

Version 1.03 ------Sequential Output------ --Sequential Input- --Random-

-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--

Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

report 16G 18703 52 28812 17 10800 12 33700 98 68172 32 260.1 2

------Sequential Create------ --------Random Create--------

-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--

files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

16 99 0 +++++ +++ 166 1 101 0 +++++ +++ 205 1

report,16G,18703,52,28812,17,10800,12,33700,98,68172,32,260.1,2,16,99,0,+++++,+++,166,1,101,0,+++++,+++,205,1



SunFire v880 2*(UltraSparc-III+ 900MHz) 4GRAM D2
陣列( 36G *12,RAID10,2 stripe

>bonnie++ -d /global/oradata -s 8192 -m d2org -u oracle

Version 1.03 ------Sequential Output------ --Sequential Input- --Random-

-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--

Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

d2org 8G 15681 55 26302 23 13877 31 26420 91 88215 49 462.6 5

------Sequential Create------ --------Random Create--------

-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--

files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

16 1245 10 +++++ +++ 3541 27 2837 21 +++++ +++ 385 3

d2org,8G,15681,55,26302,23,13877,31,26420,91,88215,49,462.6,5,16,1245,10,+++++,+++,3541,27,2837,21,+++++,+++,385,3



SunFire v880 2*(UltraSparc-III+ 900MHz) 4GRAM D2
陣列( 36G *8,RAID10,4 stripe

>bonnie++ -d /global/oradata -s 8192 -m d2new -u oracle

Version 1.03 ------Sequential Output------ --Sequential Input- --Random-

-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--

Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP

d2new 8G 18275 62 32832 26 25423 55 27444 94 106842 60 549.9 7

------Sequential Create------ --------Random Create--------

-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--

files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP

16 1723 15 +++++ +++ 5059 40 4821 37 +++++ +++ 653 5

d2new,8G,18275,62,32832,26,25423,55,27444,94,106842,60,549.9,7,16,1723,15,+++++,+++,5059,40,4821,37,+++++,+++,653,5

相關鏈接
bonnie++
主頁

http://www.coker.com.au/bonnie++/



對各種操作系統下磁盤 I/O 測試軟件的專題站點

http://www.acnc.com/04_02_01.html



該站中還有各種類型 RAID 的概念描述,優缺點,包括圖示,值得一看

http://www.acnc.com/04_00.html



關於磁盤 I/O 測試的專題討論

http://www.itpub.net/266416.html



eygle
個人站點上有關 bonnie++ 的文章

http://www.eygle.com/unix/Use.Bonnie++.To.Test.IO.speed.htm
發佈了39 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章