張樂奕，通常使用的網名為kamus，也曾用過seraphim，現在任職於北京某大型軟體公司，Oracle資料庫DBA，主要負責證券行業的核心交易系統資料庫管理及維護工作。
最早是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。
報錯。
原來編譯器就根本沒裝。
先介紹一下主機情況，一台SunFire v480，兩塊73G內建硬碟，4個UltraSPARC-III+的CPU，8G記憶體，安裝的是Solaris8，由於需要類比真實環境，所以安裝的是比較老的02.2版本，而且沒有打任何patch。
在Sun給的安裝光碟片中居然沒有找到Companion CD，編譯器應該是在這張盤上，沒辦法只好上網自己找，還好，很快就找到一個很棒的網站blastwave，包括了Solaris8，9的sparc和x86版本的所有需要的package。
根據gcc包下載頁面中的說明，發現需要下載下面四個package。
前面三個包是最後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，一切正常。
然後依次安裝其它的包，一切正常。
這個包將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，仍然報錯。
檢查PATH環境變數，已經將/opt/csw/gcc3/bin目錄加入了。
想了一下，感覺應該是系統還在使用原來的/usr/ucb/cc。於是將cc連結到新安裝的gcc上，這樣無論什麼時候調用cc其實都是直接使用gcc了。
備忘：如果要安裝gcc2的包，那麼需要下載下面兩個package。
安裝完畢以後，同樣是將cc連結到這個版本的gcc上。
修改完畢以後編譯成功。
運行bonnie++，報錯。
繼續查資料，發現bonnie++尋找的lib路徑是環境變數LD_LIBRARY_PATH指定的路徑，但是這個路徑下並沒有libstdc++.so.5檔案，於是手工將libstdc++.so.5檔案從gcc3的安裝路徑中ln到/usr/lib下面。
再次運行，仍然報錯。
這次就輕車熟路了，直接再作一次link。
終於，bonnie++可以正常運行了。
我們可以不需要自己編譯，在eygle的網站上有Solaris8下載編譯好的bonnie++。直接可以使用，當然如果運行報libstdc++.so.5找不到的問題，還需要按照上面的方法解決。
接下來繼續介紹bonnie++（Version: 1.03）的使用方法以及結果的含義。
首先說明一下命令中常用的參數。
-m 機器名，實際上我們可以認為是本次測試的方案名，可以隨便定義。預設是原生hostname。
-b 在每次寫檔案時調用fsync()函數，對於測試郵件伺服器或者資料庫伺服器這種通常需要同步操作的情況比較適合，而不使用該參數則比較適合測試copy檔案或者編譯等操作的效率。
通常我們可以簡單地運行如下命令進行磁碟效能測試：
這樣將會在指定的目錄下（通常我們會指定一個盤陣上卷的掛載點），產生相當於主機實體記憶體兩倍的檔案，如果總量大於1G，則產生多個大小為1G的檔案。假設主機記憶體為4G，那麼在測試中就會產生8個1G的檔案，到測試結束，這些檔案會被自動刪除。
如果我們的主機記憶體是4G，但是我們想縮短測試的時間，比如說唯寫2G的檔案，就應該執行下面的命令：
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。
依次解讀一下，從Writing with putc()開始到Delete files in random order…結束，這是bonnie++作的12項測試，這12項測試依次對應12項結果，而這12項結果又被分為了5大類，分別是Sequential Output（寫測試），Sequential Input（讀測試），Random Seeks（讀寫測試），Sequential Create（順序讀寫檔案測試）和Random Create（隨意讀寫檔案測試）。
那麼測試步驟和測試結果依次對應的順序就是：
每個結果中又包括了2項數值，一個是K位元組數或者檔案數，另一個是%CP，就是執行這項測試時CPU的平均佔用率。
對於輸出結果的評價，我們認為在相等CPU的佔用率情況下，存取位元組數越高表示該存放裝置的輸送量越大，自然效能也就越好。
值得注意的是，在測試RAID的時候，對於多CPU的系統，bonnie++並沒有發揮CPU的最大潛力，也就是說bonnie++發出的I/O請求通常不夠達到CPU和磁碟的最大壓力，這時候顯示的輸送量就不是這個存放裝置能夠達到的最大值。我們可以在測試的同時通過iostat,mpstat,sar等命令監控系統狀況，如果沒有明顯的I/O等待，通常表示測試軟體的壓力不夠。在bonnie++的首頁上也表示對於多CPU多進程的支援將放到2.0版本中去實現。
明白了測試步驟和測試結果之後，我們再來進一步看看每個測試結果都是什麼含義。
就是Per-Character的含義。使用putc()函數進行迴圈寫入，每次寫入的位元組很小，基本上可以放入任意一種I-Cache中，這種情況下的CPU消耗在處理putc()代碼和分配磁碟檔案空間上。
使用write(2)函數建立檔案。這種情況下的CPU消耗只是在分配磁碟檔案空間上。
使用read(2)函數讀取檔案，然後修改再用write(2)函數寫回。由於檔案的空間已經分配好，所以這種方式可以很有效地測試檔案系統緩衝和資料轉送的速度。
使用read(2)函數迴圈讀取檔案內容，有效測試磁碟讀取的效率。
預設3個進程作8000次的測試。用read(2)函數讀取檔案的block，同時有10%的操作是用write(2)函數將block修改以後寫迴文件中。在這個測試中，如果記憶體容量大於建立的檔案大小，那麼將會出現比較高的數值，而這個數值可能並不能準確反映磁碟本身的I/O效率。
這兩大類測試均是用建立，讀取，刪除大量的小檔案來測試磁碟效率。檔案名稱用7位元字和任意個數（0-12）的任意英文字母來組成。在Sequential部分，字母在數字之後，而Random部分則是字母在數字之前。
建立檔案的最小值和最大值等參數可以在bonnie++命令列中用-n參數來控制。
我們通過bonnie++來測試各種磁碟配置，或者測試各種RAID設定下的磁碟效率，可以有助於我們對於各個產品或者各個方案的磁碟吞吐效率有個大體認識。
在測試結果的最後一行是用逗號隔開的一列數字，第一個位置是我們在運行bonnie++時用-m參數指定的機器名，第二個位置是測試時產生的檔案大小，後面依次是各類測試的結果。我們將多個測試的最後一行粘貼到Excel中，然後用圖表功能產生柱狀圖，就可以對多項測試有一個極為直觀的評測比較。
下面列出了幾種評測的結果，以後也會陸續添加更多的評測，同時歡迎大家將自己的評測結果mail給我，我會加入到這篇文章中。我的郵件地址是kamus@itpub.net。