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 {
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来模拟不同情况的负载用于将来的科研实验中。特此一记