使用disksim生成io trace

disksim 是一個很強大的磁盤模擬工具,前一篇轉載裏講述如何安裝disksim,這裏主要將一下如何利用disksim來生成獲得不一樣需求的io trace。
disksim用法是:
/src/disksim <parfile> <outfile> <tracetype> <tracefile> <synthgen> [ par override... ]
<>裏是必須的命令 [ ]裏是可選命令
parfile是參數文件,經過該文件來配置disksim,生成的trace的特效也是在該文件裏編寫
outfile是輸出文件,輸出的內容經過parfile指定
tracetype是輸入trace的格式,disksim支持多種Trace格式:ascii,raw,validate等,用戶還能夠自定義輸入的trace格式
tracefile就是輸入的trace文件路徑
synthgen 表示是否disksim自動生成測試trace。disksim有兩種測試模式,一種是運行用戶輸入的trace,還有一種是用戶沒有trace,須要 disksim內部生成,此時tracefile要設爲0,synthgen大於0,synthgen的值就表示了用多少個generator來生成 trace,一個generator表明一個產生io請求的進程。每一個generator的行爲要在參數文件裏面設置

更多內容請參考disksim的manual,位於/doc/disksim4-manual.pdf
這裏只說一下如何編寫參數文件裏的自動生成trace部分的內容
在disksim4-manual中的section C裏面也有相關的描述
通常對於實驗用的trace咱們主要關心如下幾個方面:
總的頁面個數,讀寫比例,隨機和順序的比例,訪問的局部性
這三點均可以經過參數文件傳遞給disksim,用於生成符合要求的trace
在disksim-4.0/valid下有數個已經編輯好的參數文件供給咱們參考,.parv後綴的全是參數文件。下面利用atlas10k.parv來進行分析
參數文件裏的用{ }括起來的相似結構體定義的東西就是disksim裏面的參數設置
disksim_global Global {
 ide

Init Seed = 42,
 Real Seed = 42,
 # Statistic warm-up period = 0.0 seconds,
 Stat definition file = statdefs,
 Output file for trace of I/O requests simulated = atlas10k.outtrace
}
以上是設置global對象,具體每一個值的含義能夠參考manual
這裏要提的是若是想輸出生成的trace文件,必須設置Output file for trace of I/O requests simulated參數,給它賦予一個文件名,當disksim運行完了以後會將IO trace輸出到該文件中。

參數文件後面的一大段能夠暫時忽略,由於咱們生成的trace不關心底層的配置
在atlas10k.parv最後一個結構是disksim_synthio Synthio,這裏面就是配置咱們上面提到的trace生成器的相關參數。
disksim_synthio Synthio {
 Number of I/O requests to generate = 10000,
 Maximum time of trace generated = 100000.0,
 System call/return with each request = 0,
 Think time from call to request = 0.0,
 Think time from request to return = 0.0,
 Generators = [
 disksim_synthgen { # generator 0
   Storage capacity per device = 1000,   
   devices = [ disk0 ],
   Blocking factor = 8, 
   Probability of sequential access = 0.0,
   Probability of local access = 0.0,   
   Probability of read access = 0.66,
   Probability of time-critical request = 0.0,
   Probability of time-limited request = 0.0,
   Time-limited think times = [ normal, 30.0, 100.0 ],
   General inter-arrival times = [ exponential, 0.0, 0.0 ],
   Sequential inter-arrival times = [ normal, 0.0, 0.0 ],
   Local inter-arrival times = [ exponential, 0.0, 0.0 ],
   Local distances = [ normal, 0.0, 40000.0 ],
   Sizes = [ exponential, 0.0, 8.0 ]
 } # end of generator 0
] # end of generator list
} # end of synthetic workload spec

以上一行就是一個參數,下面提取重要參數來講明設置過程:
Number of I/O requests to generate 要生成的trace的記錄條數
Generators 生成器的詳細配置
Storage capacity per device 模擬設備的容量,其實就是扇區(頁面)的總數目
Blocking factor 設置的是一個請求的單元大小,若是設爲8,則一次請求的頁面數目就是8的倍數。

Probability of sequential access = 0.0,
Probability of local access = 0.0,   
Probability of read access = 0.66,
以上三個機率的設置就是控制隨機請求的比例,局部性還有讀寫比例
上面的值表示生成的trace全隨機,而且讀請求佔66%
關於local access,manual裏面說的是若是一個請求離上一個請求的地址距離在一個較短的距離裏面,則這個請求就是local 請求,下面一個 Local distances就設置了這個較短的距離的值。Probability of local access就是local請求的機率。這裏有個疑問就是local好像不能反映trace的集中性,但願瞭解的人能夠交流一下。。。。

最後要提的是sizes參數,表示每次請求訪問的扇區(頁面)個數。
另外,注意到
Time-limited think times = [ normal, 30.0, 100.0 ],
   General inter-arrival times = [ exponential, 0.0, 0.0 ],
   Sequential inter-arrival times = [ normal, 0.0, 0.0 ],
   Local inter-arrival times = [ exponential, 0.0, 0.0 ],
   Local distances = [ normal, 0.0, 40000.0 ],
   Sizes = [ exponential, 0.0, 8.0 ]
等式右邊並非某個特定的值,而是用 [ ]括起來的一些量,這些是表示該參數的值不是固定的,對於每次請求該值都不同。[ ] 裏的英文表示分佈的類型,具體解釋參考manual sectionC
 
atlas10k.parv裏面正好模擬的是一個磁盤的狀況,能夠根據上面的參數的做用來修改該文件獲得咱們想要的trace。
trace 每條請求以下:
4.911651   0   16350   1   20000003
有5個值,分別是
請求發起的時間 4.911651
訪問的設備號 0
訪問的塊號 16350
該請求讀取的塊數目 1
標誌位 20000003

標誌位裏保存了trace的相關信息 ,包括讀/寫 以及是否local request 等
標誌信息的定義在disksim_reqflags.h裏,以下所示
#define DISKSIM_WRITE      0x00000000
#define DISKSIM_READ      0x00000001
#define DISKSIM_TIME_CRITICAL   0x00000002
#define DISKSIM_TIME_LIMITED   0x00000004
#define DISKSIM_TIMED_OUT   0x00000008
#define DISKSIM_HALF_OUT   0x00000010
#define DISKSIM_MAPPED      0x00000020
#define DISKSIM_READ_AFTR_WRITE 0x00000040
#define DISKSIM_SYNC          0x00000080
#define DISKSIM_ASYNC          0x00000100
#define DISKSIM_IO_FLAG_PAGEIO   0x00000200
#define DISKSIM_SEQ      0x40000000
#define DISKSIM_LOCAL      0x20000000
#define DISKSIM_BATCH_COMPLETE 0x80000000

因此上面那條請求的標誌位表示了該請求是讀請求,time_critical ,Local的請求
經過編寫一個小的統計程序來收集生成的trace的信息,證實了生成的trace是知足咱們要求的。
這樣就能夠利用disksim來模擬不一樣狀況的負載用於未來的科研實驗中。特此一記工具

相關文章
相關標籤/搜索