From: Jens Axboe <axboe@kernel.dk>
To: Dan Ehrenberg <dehrenberg@google.com>
Cc: fio@vger.kernel.org, nauman@google.com, egouriou@google.com,
tirea@google.com
Subject: Re: [PATCH] time_based: Avoid restarting main I/O loop
Date: Fri, 16 Mar 2012 11:07:48 +0100 [thread overview]
Message-ID: <4F6310F4.8000000@kernel.dk> (raw)
In-Reply-To: <1331867567-25371-1-git-send-email-dehrenberg@google.com>
On 03/16/2012 04:12 AM, Dan Ehrenberg wrote:
> Previously, when fio had written a volume of I/O equal to the size
> argument, it restarted the main do_io loop.
>
> This patch allows time_based tests to be run for longer than one
> cycle in the do_io main loop. This has a couple of advantages:
> * The random number generator is not reset on each iteration
> of the loop, so running longer will reach different locations.
> * There is not a throughput-reducing point where all operations
> must be reaped before new operations are submitted.
>
> The implementation consists of two minor changes:
> * In the do_io loop, a time_based test will not exit the loop for
> reading or writing too much data.
> * When reading or writing sequentially, the operations wrap around
> to the beginning after reading the end within the
> get_next_seq_block function.
This looks good, but one question - does it really behave with random
IO, when the random map is enabled? I set write_iolog and looked at the
patterns. From the beginning:
foo.1.0 add
foo.1.0 open
foo.1.0 read 8093696 4096
foo.1.0 read 99356672 4096
foo.1.0 read 113164288 4096
[...]
foo.1.0 close
foo.1.0 open
foo.1.0 read 8093696 4096
foo.1.0 read 99356672 4096
foo.1.0 read 113164288 4096
[...]
etc. So it's definitely repeating the same sequence there. We don't want
to close/open the file for this case either, how does the below
look/work for you? It's your patch, and an update in
get_next_rand_block() to handle this case too.
diff --git a/backend.c b/backend.c
index 7343286..1d9b0a2 100644
--- a/backend.c
+++ b/backend.c
@@ -555,7 +555,8 @@ static void do_io(struct thread_data *td)
td_set_runstate(td, TD_RUNNING);
while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
- (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td)) {
+ (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td) ||
+ td->o.time_based) {
struct timeval comp_time;
unsigned long bytes_done[2] = { 0, 0 };
int min_evts = 0;
diff --git a/io_u.c b/io_u.c
index 20794c3..3bda0e6 100644
--- a/io_u.c
+++ b/io_u.c
@@ -238,13 +238,18 @@ ret:
static int get_next_rand_block(struct thread_data *td, struct fio_file *f,
enum fio_ddir ddir, unsigned long long *b)
{
- if (get_next_rand_offset(td, f, ddir, b)) {
- dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
- f->file_name, f->last_pos, f->real_file_size);
- return 1;
+ if (!get_next_rand_offset(td, f, ddir, b))
+ return 0;
+
+ if (td->o.time_based) {
+ fio_file_reset(f);
+ if (!get_next_rand_offset(td, f, ddir, b))
+ return 0;
}
- return 0;
+ dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n",
+ f->file_name, f->last_pos, f->real_file_size);
+ return 1;
}
static int get_next_seq_block(struct thread_data *td, struct fio_file *f,
@@ -252,6 +257,9 @@ static int get_next_seq_block(struct thread_data *td, struct fio_file *f,
{
assert(ddir_rw(ddir));
+ if (f->last_pos >= f->io_size && td->o.time_based)
+ f->last_pos = f->last_pos - f->io_size;
+
if (f->last_pos < f->real_file_size) {
unsigned long long pos;
--
Jens Axboe
next prev parent reply other threads:[~2012-03-16 10:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-16 3:12 [PATCH] time_based: Avoid restarting main I/O loop Dan Ehrenberg
2012-03-16 10:07 ` Jens Axboe [this message]
2012-03-16 17:46 ` Daniel Ehrenberg
2012-03-16 17:51 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F6310F4.8000000@kernel.dk \
--to=axboe@kernel.dk \
--cc=dehrenberg@google.com \
--cc=egouriou@google.com \
--cc=fio@vger.kernel.org \
--cc=nauman@google.com \
--cc=tirea@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.