qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: Adrian Suarez <adrian@eitrsystems.com>
Cc: qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Qemu-block <qemu-block@nongnu.org>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] Question about QEMU's threading model and stacking multiple block drivers
Date: Wed, 8 Feb 2017 22:30:08 +0800	[thread overview]
Message-ID: <20170208143008.GC22807@lemon.lan> (raw)
In-Reply-To: <08b13ba8-5e66-5fd9-3c4f-b567e87137d8@redhat.com>

On Wed, 02/08 14:59, Max Reitz wrote:
> CC-ing qemu-block, Stefan, Fam.
> 
> 
> On 08.02.2017 03:38, Adrian Suarez wrote:
> > We’ve implemented a block driver that exposes storage to QEMU VMs. Our
> > block driver (O) is interposing on writes to some other type of storage
> > (B). O performs low latency replication and then asynchronously issues the
> > write to the backing block driver, B, using bdrv_aio_writev(). Our problem
> > is that the write latencies seen by the workload in the guest should be
> > those imposed by O plus the guest I/O and QEMU stack (around 25us total
> > based on our measurements), but we’re actually seeing much higher latencies
> > (around 120us). We suspect that this is due to the backing block driver B’s
> > coroutines blocking our coroutines. The sequence of events is as follows
> > (see diagram:
> > https://docs.google.com/drawings/d/12h1QbecvxzlKxSFvGKYAzvAJ18kTW6AVTwDR6VA8hkw/pub?w=576&h=565

I cannot open this, so just trying to understand from steps below..

> > ):
> > 
> > 1. Write is issued to our block driver O using the asynchronous interface
> > for QEMU block driver.
> > 2. Write is replicated to a fast device asynchronously.
> > 2.a. In a different thread, the fast device invokes a callback on
> > completion that causes a coroutine to be scheduled to run in the QEMU
> > iothread that acknowledges completion of the write to the guest OS.
> > 2.b. The coroutine scheduled in (2.a) is executed.
> > 3. Write is issued asynchronously to the backing block driver, B.
> > 3.a. The backing block driver, B, invokes the completion function supplied
> > by us, which frees any memory associated with the write (e.g. copies of IO
> > vectors).

Do you only start submitting request to B (step 3) after the fast device I/O
completes (step 2.a)? The fact that they are serialized incurs extra latency.
Have you tried to do 2 and 3 in parallel with AIO?

> > 
> > Steps (1), (2), and (3) are performed in the same coroutine (our driver's
> > bdrv_aio_writev() implementation). (2.a) is executed in a thread that is
> > part of our transport library linked by O, and (2.b) and (3.a) are executed
> > as coroutines in the QEMU iothread.
> > 
> > We've tried improving the performance by using separate iothreads for the
> > two devices, but this only shaved about lowered the latency to around 100us
> > and caused stability issues. What's the best way to create a separate
> > iothread for the backing driver to do all of its work in?
> 
> I don't think it's possible to use different AioContexts for
> BlockDriverStates in the same BDS chain, at least not currently. But
> others may know more about this.

This may change in the future but currently all the BDSes in a chain need to
stay on the same AioContext.

Fam

  reply	other threads:[~2017-02-08 14:30 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-08  2:38 [Qemu-devel] Question about QEMU's threading model and stacking multiple block drivers Adrian Suarez
2017-02-08 13:59 ` Max Reitz
2017-02-08 14:30   ` Fam Zheng [this message]
2017-02-08 19:00     ` Adrian Suarez
2017-02-09  1:27       ` Fam Zheng

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=20170208143008.GC22807@lemon.lan \
    --to=famz@redhat.com \
    --cc=adrian@eitrsystems.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).