天天看點

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #20 使用fio進行I/O的基準測試

本節介紹使用fio進行模拟各種情況的i/o基準測試的操作方法。

i/o的基準測試中有無數需要考慮的因素。是i/o依次通路還是随機通路?是通過read/write的i/o?還是通過通路mmap的空間的i/o?是單一程序發出的i/o?還是多個程序同時發出的i/o?程序是受i/o限制還是受cpu限制?等等。

如果使用fio,就不需要每次都根據不同情況來編寫用于性能評估的程式,就可以模拟這些情況的i/o。

安裝fio

fedora、ubuntu等主流釋出版中都備有fio的二進制檔案包。請使用yum、apt等安裝fio工具包。

這裡按照fedora 13中包含的fio版本1.36來進行說明。

想要使用最新版時,請先從下列網頁下載下傳fio的源代碼,再進行安裝。

程式頁

<a href="http://freshmeat.net/projects/fio">http://freshmeat.net/projects/fio</a>

git倉庫

git://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git

基本執行方法

指定記載了i/o操作模式的設定檔案,然後啟動fio指令,這就是fio最基本的執行方法。大多數的項目可以不使用配置檔案而通過指令行選項來指定。首先舉出兩種分别使用指令行選項的方法和配置檔案的方法的簡單例子,了解基本執行方法和指令行/設定檔案的對應情況。

第一個示例執行的是下列操作。

進行10mb的順序讀入。

同時,其他程序随機進行5mb的寫入。

使用read(2)和write(2)進行讀寫。

使用direct i/o。

在fio指令行進行這些設定時的操作如下。在目前目錄下會生成讀寫用的檔案,是以要在可以寫入的目錄下執行。

與上述指令行選項具有相同意義的配置檔案如下所示。

使用這個配置檔案執行fio指令如下。

指令行選項與配置檔案的各項之間的關系非常明顯。這裡簡單介紹配置檔案的各項的意義。

以#開頭的是注釋(comment)。内容直到行尾都被忽略。

方括号表示[]作業(job)定義選項的開始。方括号内是作業的名稱。作業可以任意命名。但是global這個名稱是内部使用的。作業global是用來定義所有作業共同的設定項。

fio按照每個作業生成程序,生成的程序根據設定進行實際的i/o操作。是以,fio的配置檔案中除了global選項以外,必須要定義多個作業。

global選項中設定了direct=1。将direct設定為1時,使用的就direct i/o。未指定時,就等同于direct=0(經由一般頁面緩存進行i/o)。

接下來定義名為readjob的作業。

readjob作業中使用size設定i/o操作的大小(位元組數)。字尾m表示兆位元組。字尾可以使用k、m、g、t、p。readjob作業的程序在進行了size所設定的大小的i/o後就會結束。

rw用來設定i/o模式。readjob作業中指定的是表示順序讀出的read。其他的将在下一節中介紹。

最後再定義一個名稱為writejob的作業。

writejob作業将進行i/o的大小設定為5mb,i/o模式設定為随機寫入(randwrite)。

按照這個設定執行fio時,首先會在目前目錄下生成用于i/o的檔案,進行同步處理,取消頁面緩存。然後,生成與readjob作業相對應的程序和與writejob作業相對應的程序,進行各自設定的i/o操作。各作業在完成size所設定的位元組數的i/o後,就會結束。所有作業結束後,結果就會顯示在控制台上。

輸出結果包括很多資訊。這些内容将在下一節中詳細介紹。

模拟實驗的例子和輸出的意義

現在已經掌握了基本執行方法,就可以嘗試生成并執行模拟某種情況的配置檔案,然後對輸出進行分析。

先生成符合下列情況的配置檔案。

在檔案資料的基礎上執行查詢(query)并傳回送出請求的程序有兩個正在執行。每隔10毫秒接受查詢的請求并執行,從接受請求到傳回結果的演算過程花費5毫秒。

1個正在運作的程序,它用來将通路記錄寫入磁盤。記錄每1秒通過direct i/o寫入。通過aio實作i/o複用(multiplexing)。

與此同時,執行檔案系統備份處理。

模拟這種情況的配置檔案以及其中使用的各種配置項的意義如表3-7所示。另外,模拟時間設定為執行30秒後結束。

表3-7 fio的配置項

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #20 使用fio進行I/O的基準測試
《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #20 使用fio進行I/O的基準測試

然後實際執行,并詳細檢視輸出結果。

第一部分輸出的是已執行程序的資訊,分别輸出了名稱、i/o模式、塊的大小等設定。有兩個query是因為指定為numjob=2,是以要執行兩個程序。

接下來第一行為query的兩個段落是query作業兩個程序的結果,其後顯示的分别是log作業和backup作業的結果。下面對比各部分的内容,看一下各輸出表示的意義。

從read:和write:開始的3行或4行表示的是關于讀入和寫入的資料量、平均帶寬、延遲。平均帶寬是将總資料量除以作業執行時間得出的值,是以在thinktime較長的作業中值較低。clat(completion latency)的行為延遲,是作業程序開始向核心發出i/o請要到完成為止的時間,即從調出read(2)等直到傳回的時間。log作業由于使用的是aio,是以多輸出一個slat(submitting latency)延遲。這表示i/o發出要求滞留在作業程序内部的queue時間。

從query作業的延遲來看,平均花費7.5毫秒左右,最多花費130毫秒左右。10毫秒的查詢間隔中大部分時間都耗費在等待i/o上。log作業中出現了最長16秒的延遲。這時應當重新設計系統,分散i/o負載。

小貼士:clat在read(2)或direct i/o的write(2)中i/o實際花費的時間,而在常用的經由頁面緩存的write(2)中隻是将資料存放到頁面緩存所需的時間。上例中backup作業的write就相當于這種情況,是以其值平均為79微秒,比其他情況短得多。

i/o depths的行表示通過aio實作複用的i/o數與時間之間的關系。例如,log作業的io depths中的“8=9.0%,16=18.0%”,就表示9~16個i/o同時執行的時間相當于所有執行時間的18.0%。由于i/o複用隻存在于aio的情況下,是以在log以外的作業都是“1=100%”。

從log作業的io depths可以看出,65.2%的時間都達到複用上限值附近的19~32。這也顯示i/o負載仍然過高。

最後兩個段落是關于所有程序總共的統計值。輸出所有i/o的資料量的合計結果等。

小結

本節使用fio進行實際使用情況的i/o模拟實驗,介紹了輸出的結果。fio有非常多的選項,可以進行更加精确和詳細的設定,由于數量龐大,這裡無法一一列舉。源代碼包含的文檔和man中有詳細的記載,但都是英文。參考這些内容并熟練使用i/o操作,i/o基準測試就能成為強有力的工具。

—munehiro ikeda