1. 程式人生 > >Linux讀寫效能測試工具--iozone

Linux讀寫效能測試工具--iozone

IOzone是一個檔案系統測試基準工具。可以測試不同的作業系統中檔案系統的讀寫效能。可以通過 write, re-write, read, re-read, random read, random write, random mix, backwards read, record rewirte, strided read, fwrite, frewrite, fread, freread, mmap, async I/0 等不同的模式下的硬碟的效能。
測試的時候請注意,設定的測試檔案的大小一定要大過你的記憶體(最佳為記憶體的兩倍大小),不然linux會給你的讀寫的內容進行快取,會使數值非常不準確。

測試的定義
Write: 測試向一個新檔案寫入的效能。當一個新檔案被寫入時,不僅僅是那些檔案中的資料需要被儲存,還包括那些用於定位資料儲存在儲存介質的具體位置的額外資訊。這些額外資訊被稱作“元資料”。它包括目錄資訊,所分配的空間和一些與該檔案有關但又並非該檔案所含資料的其他資料。拜這些額外資訊所賜,Write的效能通常會比Re-write的效能低。
Re-write: 測試向一個已存在的檔案寫入的效能。當一個已存在的檔案被寫入時,所需工作量較少,因為此時元資料已經存在。Re-write的效能通常比Write的效能高。
Read: 測試讀一個已存在的檔案的效能。
Re-Read: 測試讀一個最近讀過的檔案的效能。Re-Read效能會高些,因為作業系統通常會快取最近讀過的檔案資料。這個快取可以被用於讀以提高效能。
Random Read: 測試讀一個檔案中的隨機偏移量的效能。許多因素可能影響這種情況下的系統性能,例如:作業系統快取的大小,磁碟數量,尋道延遲和其他。
Random Write: 測試寫一個檔案中的隨機偏移量的效能。同樣,許多因素可能影響這種情況下的系統性能,例如:作業系統快取的大小,磁碟數量,尋道延遲和其他。
Random Mix: 測試讀寫一個檔案中的隨機偏移量的效能。同樣,許多因素可能影響這種情況下的系統性能,例如:作業系統快取的大小,磁碟數量,尋道延遲和其他。這個測試只有在吞吐量測試模式下才能進行。每個執行緒/程序執行讀或寫測試。這種分散式讀/寫測試是基於round robin 模式的。最好使用多於一個執行緒/程序執行此測試。
Backwards Read: 測試使用倒序讀一個檔案的效能。這種讀檔案方法可能看起來很可笑,事實上,有些應用確實這麼幹。MSC Nastran是一個使用倒序讀檔案的應用程式的一個例子。它所讀的檔案都十分大(大小從G級別到T級別)。儘管許多作業系統使用一些特殊實現來優化順序讀檔案的速度,很少有作業系統注意到並增強倒序讀檔案的效能。
Record Rewrite: 測試寫與覆蓋寫一個檔案中的特定塊的效能。這個塊可能會發生一些很有趣的事。如果這個塊足夠小(比CPU資料快取小),測出來的效能將會非常高。如果比CPU資料快取大而比TLB小,測出來的是另一個階段的效能。如果比此二者都大,但比作業系統快取小,得到的效能又是一個階段。若大到超過作業系統快取,又是另一番結果。
Strided Read: 測試跳躍讀一個檔案的效能。舉例如下:在0偏移量處讀4Kbytes,然後間隔200Kbytes,讀4Kbytes,再間隔200Kbytes,如此反覆。此時的模式是讀4Kbytes,間隔200Kbytes並重復這個模式。這又是一個典型的應用行為,檔案中使用了資料結構並且訪問這個資料結構的特定區域的應用程式常常這樣做。
  許多作業系統並沒注意到這種行為或者針對這種型別的訪問做一些優化。同樣,這種訪問行為也可能導致一些有趣的效能異常。一個例子是在一個數據片化的檔案系統裡,應用程式的跳躍導致某一個特定的磁碟成為效能瓶頸。
Fwrite: 測試呼叫庫函式fwrite()來寫檔案的效能。這是一個執行快取與阻塞寫操作的庫例程。快取在使用者空間之內。如果一個應用程式想要寫很小的傳輸塊,fwrite()函式中的快取與阻塞I/O功能能通過減少實際作業系統呼叫並在作業系統呼叫時增加傳輸塊的大小來增強應用程式的效能。
  這個測試是寫一個新檔案,所以元資料的寫入也是要的。
Frewrite:測試呼叫庫函式fwrite()來寫檔案的效能。這是一個執行快取與阻塞寫操作的庫例程。快取在使用者空間之內。如果一個應用程式想要寫很小的傳輸塊,fwrite()函式中的快取與阻塞I/O功能能通過減少實際作業系統呼叫並在作業系統呼叫時增加傳輸塊的大小來增強應用程式的效能。
  這個測試是寫入一個已存在的檔案,由於無元資料操作,測試的效能會高些。
Fread:測試呼叫庫函式fread()來讀檔案的效能。這是一個執行快取與阻塞讀操作的庫例程。快取在使用者空間之內。如果一個應用程式想要讀很小的傳輸塊,fwrite()函式中的快取與阻塞I/O功能能通過減少實際作業系統呼叫並在作業系統呼叫時增加傳輸塊的大小來增強應用程式的效能。
Freread: 這個測試與上面的fread 類似,除了在這個測試中被讀檔案是最近才剛被讀過。這將導致更高的效能,因為作業系統快取了檔案資料。
  幾個特殊測試:
  Mmap:許多作業系統支援mmap()的使用來對映一個檔案到使用者地址空間。對映之後,對記憶體的讀寫將同步到檔案中去。這對一些希望將檔案當作記憶體塊來使用的應用程式來說很方便。一個例子是記憶體中的一塊將同時作為一個檔案儲存在於檔案系統中。
  mmap 檔案的語義和普通檔案略有不同。如果發生了對記憶體的儲存,並不是立即發生相應的檔案I/O操作。使用MS_SYNC 和MS_ASYNC標誌位的 msyc()函式呼叫將控制記憶體和檔案的一致性。呼叫msync() 時將MS_SYNC置位將強制把記憶體裡的內容寫到檔案中去並等待直到此操作完成才返回。而MS_ASYNC 置位則告訴作業系統使用非同步機制將記憶體重新整理到磁碟,這樣應用程式可以直接返回而不用等待此操作的完成。
  這個測試就是測量使用mmap()機制完成I/O的效能。
  Async I/O: 許多作業系統支援的另外一種I/O機制是POSIX 標準的非同步I/O。本程式使用POSIX標準非同步I/O介面來完成此測試功能。
  例如: aio_write(), aio_read(), aio_error()。這個測試測量POSIX非同步I/O機制的效能。


引數介紹
iozone功能很強大,當然引數也很多,但是我們常用的就那幾個引數
Usage: iozone [-s filesize_Kb] [-r record_size_Kb ] [-f [path]filename]
  [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children] [-h] [-o]
  [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x]
  [-d microseconds] [-F path1 path2...] [-V pattern] [-j stride]
  [-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point]
  [-S cache_size] [-O] [-K] [-L line_size] [-g max_filesize_Kb]
  [-n min_filesize_Kb] [-N] [-Q] [-P start_cpu] [-c] [-e] [-b filename]
  [-J milliseconds] [-X filename] [-Y filename] [-w] [-W]
  [-y min_recordsize_Kb] [-q max_recordsize_Kb] [-+m filename]
  [-+u ] [ -+d ] [-+p percent_read] [-+r] [-+t ] [-+A #]


-a
全自動模式測試。測試記錄塊大小從4k到16M,測試檔案從64k到512M
-A
使用自動模式雖然測試比較全面,但是比較花時間。-a選項將在檔案大於32MB時停止使用低於64k一下記錄塊,來節省時間。-A通知iozone不要節省時間,進行所有測試。注:在3.61版本以後不建議使用,用-az代替-aA
-B
使用mmap()。這將使用mmap()介面來建立並訪問所有測試用的臨時檔案。一些應用程式傾向於將檔案當作記憶體的一塊來看待。這些應用程式對檔案執行mmap()呼叫,然後就可以以讀寫記憶體的方式訪問那個塊來完成檔案I/O。
-c
計算時間將close()包括進來
-C
顯示吞吐量測試中每個客戶端的位元組數。
-D
對mmap檔案使用MSYNC(MS_ASYNC)。告訴作業系統在mmap空間的所有資料需要被非同步的寫到磁碟上。
-e
測試時間是包含flush(fsync, fflush)
-f filename
指定用來測試臨時檔案,在測試完成後將被自動刪除
-F filename filename ...
指定測試中每個臨時檔名,檔名的數量應該和指定的程序或執行緒數相同
-g #
在自動模式下設定檔案最大值,可以使用#k #m #g分別表示kb,mb,gb
-G
對mmap檔案使用msync(MS_SYNC)。告訴作業系統在mmap空間的所有資料需要被同步的寫到磁碟上
-h
顯示幫助
-i #
指定運行於哪種模式測試。可以使用-i # -i # -i #進行多個測試
0=write/rewrite
1=read/re-read
2=random read/random write
3=backwards read
4=re-write-record
5=stride-read
6=fwirte/re-fwrite
7=fread/re-fread
8=random mix
9=pwrite/re-pwrite
10=pread/re-pread
11=pwritev/re-pwritev
12=preadv/re-preadv
-I
對所有檔案操作使用DIRECT I/O。通知檔案系統所有操作跳過快取直接在磁碟上操作
-j #
設定訪問檔案的跨度為(# * 塊)。stride read測試將使用這個跨度來讀塊
-J #(毫秒)
在每個I/O操作之前產生指定毫秒的計算延遲。看-X和-Y獲取控制計算延遲的其他引數
-l #
設定程式最小程序數。在測試過程允許使用者設定的最小程序或執行緒數。需要配合-u選項使用。
-L #
設定處理器交換資訊的單位量為#(bytes)。可以加速測試。
-m
iozone將在內部使用多個快取。一些程式反覆複寫一塊快取,還有就是設定多個快取塊。此引數將允許使用這兩種模式。iozone預設行為是重複使用內部一個快取。此選項將允許在內部使用多個快取塊。
-M
呼叫uname(),將返回字串放在輸出檔案中
-n #
設定自動模式下測試檔案的最小值
-N
報告結果以毫秒每操作的方式顯示
-o
寫方式是同步寫到磁碟上
-O
報告結果以操作每秒方式顯示
-q #
在自動模式下設定記錄塊的最大值,可以使用#k(kb),#m(mb),#g(gb)。使用-y可以設定最小值
-r #
設定記錄塊大小為#
-R
使用Excel顯示結果
-s #
設定測試檔案大小
-S #
設定處理器的快取大小
-t #
設定測試程式的執行緒或程序數
-T 
使用POSIX的pthreads進行測試
-u #
設定最大程序或執行緒數,需要配合-l引數使用
-U mountpoint
在測試開始之前,iozone將unmount和remount掛載點。這將保證測試中快取不包含任何檔案
-w
在測試結束後不要刪除臨時檔案。臨時檔案將在測試過後儲存下來
-W
在測試過程中,當讀或寫檔案時鎖住檔案
-y #
設定記錄塊最小值
-z
同-a一起使用,進行全部測試
-Z
允許mmap I/O和file I/O混合使用

安裝iozone rpm包;
執行命令iozone -ac -s 8m   -f /home/books/testfile -y 2k -q 8m