From: Jens Axboe <axboe@kernel.dk>
To: Daniel 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 18:51:51 +0100 [thread overview]
Message-ID: <4F637DB7.20701@kernel.dk> (raw)
In-Reply-To: <CAAK6Zt0+fs8P1Xvw_PQHUKGRowF9RhvgxwqhRXTYSrQCfC==xw@mail.gmail.com>
On 2012-03-16 18:46, Daniel Ehrenberg wrote:
> On Fri, Mar 16, 2012 at 3:07 AM, Jens Axboe <axboe@kernel.dk> wrote:
>> 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
>>
>
> Thanks for the correction, Jens. I only tested my code with
> norandommap, forgetting about the default case. Your modified patch
> seems to fix the issue in a nice simple way. I would be happy to see
> this new patch committed.
Thanks for confirming, I will commit the above variant.
--
Jens Axboe
prev parent reply other threads:[~2012-03-16 17:51 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
2012-03-16 17:46 ` Daniel Ehrenberg
2012-03-16 17:51 ` Jens Axboe [this message]
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=4F637DB7.20701@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.