天天看點

使用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會給你的讀寫的内容進行緩存,會使數值非常不準确。

安裝iozone,最新版iozone是3-408,下載下傳位址:http://www.iozone.org/;你既可以下載下傳源碼包,還可以下載下傳編譯好的RPM包,還有使用文檔下載下傳。

注:之中方式隻能安裝在/opt下,本想安裝在/usr/local/下的,但是iozone把位置定死了。不知道源碼安裝是否可以改變位置,麻煩用的告訴一聲^_^

在介紹具體用法之前,我們先來做幾個例子(這裡iozone安裝在/opt/iozone下,想知道軟體安裝在哪使用:rpm -qpl iozone-3-408.i386.rpm)

最簡單開始使用iozone方法是自動模式

iozone将在所有模式下進行測試,使用記錄塊從4k到16M,測試檔案大小從64k到512M

如果想以圖表形式顯示測試結果,可以使用,iozone将測試結果放在Excel中

如果記憶體大于512MB,則測試檔案需要更大;最好測試檔案是記憶體的兩倍。例如記憶體為1G,将測試檔案設定最大為2G

如果我們隻關心檔案磁盤的read/write性能,而不必花費時間在其他模式上測試,則我們需要指定測試模式。具體将在參數解釋中介紹

最後,如果我們測試的NFS,将使用-c,這通知iozone在測試過程中執行close()函數。使用close()将減少NFS用戶端緩存的影響。但是如果測試檔案比記憶體大,就沒有必要使用參數-c

測試的定義

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混合使用

下面做個在我機器上做的測試:隻進行read/write測試,測試檔案大小是4G,記錄塊從2k到8m,并将測試資料輸出到Excel檔案中

使用iozone測試磁盤性能
使用iozone測試磁盤性能

最後資料就是測試結果,左邊第一列是測試檔案大小,第二列是記錄塊大小(機關是kb),以後每列就是測試模式(機關是kb/s)

繼續閱讀