Token-based flow control
This patch allows two fio jobs to be kept to a certain
proportion of each other using token-based flow control.
There are three new parameters: flow, flow_watermark, and
flow_sleep, documented in the fio options. An example of an fio
job using these parameters is below:
[global]
norandommap
thread
time_based
runtime=30
direct=1
ioengine=libaio
iodepth=256
size=100g
bs=8k
filename=/tmp/testfile
flow_watermark=100
flow_sleep=1000
[job2]
numjobs=1
rw=write
flow=-8
[job1]
numjobs=1
rw=randread
flow=1
The motivating application of this patch was to allow random reads
and sequential writes at a particular given proportion.
This initial version is only correct when run with 'thread', as shared
state is represented with a global variable. It also only allows two
jobs to be synchronized properly. A future version might do more, but
no more functionality was needed for my application.
Tested: Ran a few fio jobs with this flow control, observing
the proportion of IOPS to match what was intended by the job file.
Varied the flow_watermark and flow_sleep parameters and observed
the effect on throughput.
Signed-off-by: Dan Ehrenberg <dehrenberg@google.com>
Modified by me to support flow_id, so an arbitrary number of flows can
be used. This means it no longer relies on global context, so it can be
used from a thread or process alike. Also added man page documentation.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/HOWTO b/HOWTO
index c6304a7..da037d2 100644
--- a/HOWTO
+++ b/HOWTO
@@ -1231,6 +1231,25 @@
gid=int Set group ID, see uid.
+flow_id=int The ID of the flow. If not specified, it defaults to being a
+ global flow. See flow.
+
+flow=int Weight in token-based flow control. If this value is used, then
+ there is a 'flow counter' which is used to regulate the
+ proportion of activity between two or more jobs. fio attempts
+ to keep this flow counter near zero. The 'flow' parameter
+ stands for how much should be added or subtracted to the flow
+ counter on each iteration of the main I/O loop. That is, if
+ one job has flow=8 and another job has flow=-1, then there
+ will be a roughly 1:8 ratio in how much one runs vs the other.
+
+flow_watermark=int The maximum value that the absolute value of the flow
+ counter is allowed to reach before the job must wait for a
+ lower value of the counter.
+
+flow_sleep=int The period of time, in microseconds, to wait after the flow
+ watermark has been exceeded before retrying operations
+
In addition, there are some parameters which are only valid when a specific
ioengine is in use. These are used identically to normal parameters, with the
caveat that when used on the command line, they must come after the ioengine