Skip to content

Commit

Permalink
Add thinktime_blocks_type parameter
Browse files Browse the repository at this point in the history
This patch adds a new parameter thinktime_blocks_type to control the
behavior of thinktime_blocks. It can be either `complete` or `issue`. If
it is `complete` (default), fio triggers thinktime when thinktime_blocks
number of blocks are **completed**. If it is `issue`, fio triggers
thinktime when thinktime_blocks number of blocks are **issued**

Tests:
jobfile1:
```
[global]
thread
kb_base=1000
direct=1
size=1GiB
group_reporting
io_size=96KiB
ioengine=libaio
iodepth=8
bs=4096
filename=/dev/qblkdev
rw=randwrite

[fio_randwrite]
thinktime=2s
thinktime_blocks=4
```

jobfile2:
```
[global]
thread
kb_base=1000
direct=1
size=1GiB
group_reporting
io_size=96KiB
ioengine=libaio
iodepth=8
bs=4096
filename=/dev/qblkdev
rw=randwrite

[fio_randwrite]
thinktime=2s
thinktime_blocks=4
thinktime_blocks_type=issue
```

Results:
Current HEAD:
fio jobfile1:
	write: IOPS=5, BW=24.6kB/s (24.0KiB/s)(98.3kB/4002msec); 0 zone resets
blktrace:
	11 reqs -- 2s -- 8 reqs -- 2s -- 5 reqs -- end

This patch:
fio jobfile1:
	write: IOPS=5, BW=24.6kB/s (24.0KiB/s)(98.3kB/4001msec); 0 zone resets
blktrace:
	11 reqs -- 2s -- 8 reqs -- 2s -- 5 reqs -- end

fio jobfile2:
	write: IOPS=1, BW=8190B/s (8190B/s)(98.3kB/12002msec); 0 zone resets
blktrace:
	4 reqs -- 2s -- 4 reqs ... -- 4 reqs -- 2s -- end

Server:
fio --server=192.168.1.172,8765
Client (On the same machine):
fio --client=192.168.1.172,8765 jobfile1
	write: IOPS=5, BW=24.6kB/s (24.0KiB/s)(98.3kB/4001msec); 0 zone resets
blktrace:
	11 reqs -- 2s -- 8 reqs -- 2s -- 5 reqs -- end

fio --client=192.168.1.172,8765 jobfile2
	write: IOPS=1, BW=8191B/s (8191B/s)(98.3kB/12001msec); 0 zone resets
blktrace:
	4 reqs -- 2s -- 4 reqs ... -- 4 reqs -- 2s -- end

Signed-off-by: Hongwei Qin <[email protected]>
[axboe: fold patch 3 into this one]
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
HongweiQin authored and axboe committed Jan 26, 2021
1 parent e493cea commit 33f42c2
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 5 deletions.
7 changes: 7 additions & 0 deletions HOWTO
Original file line number Diff line number Diff line change
Expand Up @@ -2574,6 +2574,13 @@ I/O rate
before we have to complete it and do our :option:`thinktime`. In other words, this
setting effectively caps the queue depth if the latter is larger.

.. option:: thinktime_blocks_type=str

Only valid if :option:`thinktime` is set - control how :option:`thinktime_blocks`
triggers. The default is `complete`, which triggers thinktime when fio completes
:option:`thinktime_blocks` blocks. If this is set to `issue`, then the trigger happens
at the issue side.

.. option:: rate=int[,int][,int]

Cap the bandwidth used by this job. The number is in bytes/sec, the normal
Expand Down
16 changes: 11 additions & 5 deletions backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -864,8 +864,8 @@ static void handle_thinktime(struct thread_data *td, enum fio_ddir ddir)
uint64_t total;
int left;

b = ddir_rw_sum(td->io_blocks);
if (b % td->o.thinktime_blocks)
b = ddir_rw_sum(td->thinktime_blocks_counter);
if (b % td->o.thinktime_blocks || !b)
return;

io_u_quiesce(td);
Expand Down Expand Up @@ -1076,6 +1076,10 @@ static void do_io(struct thread_data *td, uint64_t *bytes_done)
}
if (ret < 0)
break;

if (ddir_rw(ddir) && td->o.thinktime)
handle_thinktime(td, ddir);

if (!ddir_rw_sum(td->bytes_done) &&
!td_ioengine_flagged(td, FIO_NOIO))
continue;
Expand All @@ -1090,9 +1094,6 @@ static void do_io(struct thread_data *td, uint64_t *bytes_done)
}
if (!in_ramp_time(td) && td->o.latency_target)
lat_target_check(td);

if (ddir_rw(ddir) && td->o.thinktime)
handle_thinktime(td, ddir);
}

check_update_rusage(td);
Expand Down Expand Up @@ -1744,6 +1745,11 @@ static void *thread_main(void *data)
if (rate_submit_init(td, sk_out))
goto err;

if (td->o.thinktime_blocks_type == THINKTIME_BLOCKS_TYPE_COMPLETE)
td->thinktime_blocks_counter = td->io_blocks;
else
td->thinktime_blocks_counter = td->io_issues;

set_epoch_time(td, o->log_unix_epoch);
fio_getrusage(&td->ru_start);
memcpy(&td->bw_sample_time, &td->epoch, sizeof(td->epoch));
Expand Down
2 changes: 2 additions & 0 deletions cconv.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ void convert_thread_options_to_cpu(struct thread_options *o,
o->thinktime = le32_to_cpu(top->thinktime);
o->thinktime_spin = le32_to_cpu(top->thinktime_spin);
o->thinktime_blocks = le32_to_cpu(top->thinktime_blocks);
o->thinktime_blocks_type = le32_to_cpu(top->thinktime_blocks_type);
o->fsync_blocks = le32_to_cpu(top->fsync_blocks);
o->fdatasync_blocks = le32_to_cpu(top->fdatasync_blocks);
o->barrier_blocks = le32_to_cpu(top->barrier_blocks);
Expand Down Expand Up @@ -431,6 +432,7 @@ void convert_thread_options_to_net(struct thread_options_pack *top,
top->thinktime = cpu_to_le32(o->thinktime);
top->thinktime_spin = cpu_to_le32(o->thinktime_spin);
top->thinktime_blocks = cpu_to_le32(o->thinktime_blocks);
top->thinktime_blocks_type = __cpu_to_le32(o->thinktime_blocks_type);
top->fsync_blocks = cpu_to_le32(o->fsync_blocks);
top->fdatasync_blocks = cpu_to_le32(o->fdatasync_blocks);
top->barrier_blocks = cpu_to_le32(o->barrier_blocks);
Expand Down
1 change: 1 addition & 0 deletions engines/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ static int fio_cpuio_init(struct thread_data *td)
* set thinktime_sleep and thinktime_spin appropriately
*/
o->thinktime_blocks = 1;
o->thinktime_blocks_type = THINKTIME_BLOCKS_TYPE_COMPLETE;
o->thinktime_spin = 0;
o->thinktime = ((unsigned long long) co->cpucycle *
(100 - co->cpuload)) / co->cpuload;
Expand Down
6 changes: 6 additions & 0 deletions fio.1
Original file line number Diff line number Diff line change
Expand Up @@ -2323,6 +2323,12 @@ queue depth setting redundant, since no more than 1 I/O will be queued
before we have to complete it and do our \fBthinktime\fR. In other words, this
setting effectively caps the queue depth if the latter is larger.
.TP
.BI thinktime_blocks_type \fR=\fPstr
Only valid if \fBthinktime\fR is set - control how \fBthinktime_blocks\fR triggers.
The default is `complete', which triggers \fBthinktime\fR when fio completes
\fBthinktime_blocks\fR blocks. If this is set to `issue', then the trigger happens
at the issue side.
.TP
.BI rate \fR=\fPint[,int][,int]
Cap the bandwidth used by this job. The number is in bytes/sec, the normal
suffix rules apply. Comma-separated values may be specified for reads,
Expand Down
5 changes: 5 additions & 0 deletions fio.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ enum {

RATE_PROCESS_LINEAR = 0,
RATE_PROCESS_POISSON = 1,

THINKTIME_BLOCKS_TYPE_COMPLETE = 0,
THINKTIME_BLOCKS_TYPE_ISSUE = 1,
};

enum {
Expand Down Expand Up @@ -354,6 +357,8 @@ struct thread_data {
struct fio_sem *sem;
uint64_t bytes_done[DDIR_RWDIR_CNT];

uint64_t *thinktime_blocks_counter;

/*
* State for random io, a bitmap of blocks done vs not done
*/
Expand Down
22 changes: 22 additions & 0 deletions options.c
Original file line number Diff line number Diff line change
Expand Up @@ -3608,6 +3608,28 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
.category = FIO_OPT_C_IO,
.group = FIO_OPT_G_THINKTIME,
},
{
.name = "thinktime_blocks_type",
.lname = "Thinktime blocks type",
.type = FIO_OPT_STR,
.off1 = offsetof(struct thread_options, thinktime_blocks_type),
.help = "How thinktime_blocks takes effect",
.def = "complete",
.category = FIO_OPT_C_IO,
.group = FIO_OPT_G_THINKTIME,
.posval = {
{ .ival = "complete",
.oval = THINKTIME_BLOCKS_TYPE_COMPLETE,
.help = "thinktime_blocks takes effect at the completion side",
},
{
.ival = "issue",
.oval = THINKTIME_BLOCKS_TYPE_ISSUE,
.help = "thinktime_blocks takes effect at the issue side",
},
},
.parent = "thinktime",
},
{
.name = "rate",
.lname = "I/O rate",
Expand Down
5 changes: 5 additions & 0 deletions thread_options.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ struct thread_options {
unsigned int thinktime;
unsigned int thinktime_spin;
unsigned int thinktime_blocks;
unsigned int thinktime_blocks_type;
unsigned int fsync_blocks;
unsigned int fdatasync_blocks;
unsigned int barrier_blocks;
Expand Down Expand Up @@ -479,6 +480,7 @@ struct thread_options_pack {
uint32_t thinktime;
uint32_t thinktime_spin;
uint32_t thinktime_blocks;
uint32_t thinktime_blocks_type;
uint32_t fsync_blocks;
uint32_t fdatasync_blocks;
uint32_t barrier_blocks;
Expand Down Expand Up @@ -506,6 +508,9 @@ struct thread_options_pack {
uint32_t stonewall;
uint32_t new_group;
uint32_t numjobs;

uint8_t pad3[4];

/*
* We currently can't convert these, so don't enable them
*/
Expand Down

0 comments on commit 33f42c2

Please sign in to comment.