Fork me on GitHub

控制fio单位时间发出的请求数

fio通常用来测试存储设备的性能。他使用io engine生成workload给存储设备来执行,并记录执行效率以评估存储设备的性能。fio可以通过readwrite提供不同类型的请求,比如read表示顺序读请求,randread表示随机读请求,rw表示顺序的读写请求,randrw表示随机的读写混合请求。在我的研究中,我需要模拟真实服务器硬盘负载,来测试在不同比例的随机请求和顺序请求下的硬盘性能。要完成这一研究有两大挑战。

首先,生成不同比例的随机请求与顺序请求将是一大挑战。我们可以单独发出顺序请求或随机请求。但我们无法简单地用两个进程分别发出随机请求和顺序请求来生成不同比例的随机/顺序请求。因为磁盘依次执行io request queue中的请求,只有当相邻的请求访问的地址之间是连续的,磁头才能顺序的执行而避免重新寻道。顺序进程发出的是访问地址相邻的请求,但因为要与随机进程发出的随机请求一起执行,所以依然会导致相邻请求之间的不连续。因此,这些顺序请求其实就变成了随机请求。所以,我们不能从同时发出请求的方式来得到不同比例的随机请求与顺序请求。我们要控制不同时间发出的请求的类型。比如前50%的时间只随机请求,后50%的时间只发出顺序请求,这时的随机/顺序的比例可以认为是1:1。这里我们以时间为比例的评估指标,也可以考虑以数据量/io数量作为比例的评估指标。以时间为指标是因为时间更好操作。

另一个挑战则是fio的测试与真实服务器负载的差异性。我们知道大部分服务器的负载不是持续的。因此,在真实服务器上很难看到io利用率长时间保持在100。而fio则是会不断的发送请求,或者是监控io request queue, 一旦队中io request数少于某个值就开始发请求,这会保持io利用率一直处于100%。为了模拟真实负载,我们需要对单位时间内发出请求的数量进行调整。其实如果请求密度比较少的话,顺序请求的吞吐率和延迟也会和随机请求一样吧

No pain, No gain