[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 00/13] aio: experimental virtio-blk polling m
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH v4 00/13] aio: experimental virtio-blk polling mode |
Date: |
Fri, 2 Dec 2016 03:27:07 -0500 (EST) |
> v4:
> * Added poll time self-tuning algorithm [Christian and Paolo]
> * Try a single iteration of polling to avoid non-blocking
> ppoll(2)/epoll_wait(2) [Paolo]
> * Reordered patches to make performance analysis easier - see below
Reviewed-by: Paolo Bonzini <address@hidden>
> v3:
> * Avoid ppoll(2)/epoll_wait(2) if polling succeeded [Paolo]
> * Disable guest->host virtqueue notification during polling [Christian]
> * Rebased on top of my virtio-blk/scsi virtqueue notification disable
> patches
>
> v2:
> * Uninitialized node->deleted gone [Fam]
> * Removed 1024 polling loop iteration qemu_clock_get_ns() optimization which
> created a weird step pattern [Fam]
> * Unified with AioHandler, dropped AioPollHandler struct [Paolo]
> (actually I think Paolo had more in mind but this is the first step)
> * Only poll when all event loop resources support it [Paolo]
> * Added run_poll_handlers_begin/end trace events for perf analysis
> * Sorry, Christian, no virtqueue kick suppression yet
>
> Recent performance investigation work done by Karl Rister shows that the
> guest->host notification takes around 20 us. This is more than the
> "overhead"
> of QEMU itself (e.g. block layer).
>
> One way to avoid the costly exit is to use polling instead of notification.
> The main drawback of polling is that it consumes CPU resources. In order to
> benefit performance the host must have extra CPU cycles available on physical
> CPUs that aren't used by the guest.
>
> This is an experimental AioContext polling implementation. It adds a polling
> callback into the event loop. Polling functions are implemented for
> virtio-blk
> virtqueue guest->host kick and Linux AIO completion.
>
> The -object iothread,poll-max-ns=NUM parameter sets the number of nanoseconds
> to poll before entering the usual blocking poll(2) syscall. Try setting this
> parameter to the time from old request completion to new virtqueue kick. By
> default no polling is done so you must set this parameter to get busy
> polling.
>
> Patch series overview:
>
> Here are convenient points in the patch series at which to do performance
> benchmarking to see how various pieces interact.
>
> 1. Basic -iothread poll-max-ns=NUM parameter without self-tuning:
>
> aio: add flag to skip fds to aio_dispatch()
> aio: add AioPollFn and io_poll() interface
> aio: add polling mode to AioContext
> virtio: poll virtqueues for new buffers
> linux-aio: poll ring for completions
> iothread: add polling parameters
>
> 2. My "[PATCH 0/3] virtio: disable notifications in blk and scsi" series is
> needed as a base. This is unrelated to polling but we'll also disable
> notifications during polling later:
>
> virtio-blk: suppress virtqueue kick during processing
> virtio-scsi: suppress virtqueue kick during processing
>
> 3. Disable virtqueue notifications (reduce vmexits) during polling:
>
> virtio: turn vq->notification into a nested counter
> aio: add .io_poll_begin/end() callbacks
> virtio: disable virtqueue notifications during polling
>
> 4. Self-tuning, adjusts polling time depending on wait times:
>
> aio: self-tune polling time
> iothread: add poll-grow and poll-shrink parameters
>
> Stefan Hajnoczi (13):
> aio: add flag to skip fds to aio_dispatch()
> aio: add AioPollFn and io_poll() interface
> aio: add polling mode to AioContext
> virtio: poll virtqueues for new buffers
> linux-aio: poll ring for completions
> iothread: add polling parameters
> virtio-blk: suppress virtqueue kick during processing
> virtio-scsi: suppress virtqueue kick during processing
> virtio: turn vq->notification into a nested counter
> aio: add .io_poll_begin/end() callbacks
> virtio: disable virtqueue notifications during polling
> aio: self-tune polling time
> iothread: add poll-grow and poll-shrink parameters
>
> include/block/aio.h | 53 +++++++-
> include/sysemu/iothread.h | 5 +
> aio-posix.c | 308
> +++++++++++++++++++++++++++++++++++++++-----
> aio-win32.c | 32 ++++-
> async.c | 21 ++-
> block/curl.c | 8 +-
> block/iscsi.c | 3 +-
> block/linux-aio.c | 19 ++-
> block/nbd-client.c | 8 +-
> block/nfs.c | 7 +-
> block/sheepdog.c | 26 ++--
> block/ssh.c | 4 +-
> block/win32-aio.c | 4 +-
> hw/block/virtio-blk.c | 18 ++-
> hw/scsi/virtio-scsi.c | 36 +++---
> hw/virtio/virtio.c | 54 ++++++--
> iohandler.c | 2 +-
> iothread.c | 84 ++++++++++++
> nbd/server.c | 9 +-
> stubs/set-fd-handler.c | 1 +
> tests/test-aio.c | 4 +-
> util/event_notifier-posix.c | 2 +-
> trace-events | 6 +
> 23 files changed, 604 insertions(+), 110 deletions(-)
>
> --
> 2.9.3
>
>
- [Qemu-devel] [PATCH v4 08/13] virtio-scsi: suppress virtqueue kick during processing, (continued)
- [Qemu-devel] [PATCH v4 08/13] virtio-scsi: suppress virtqueue kick during processing, Stefan Hajnoczi, 2016/12/01
- [Qemu-devel] [PATCH v4 09/13] virtio: turn vq->notification into a nested counter, Stefan Hajnoczi, 2016/12/01
- [Qemu-devel] [PATCH v4 11/13] virtio: disable virtqueue notifications during polling, Stefan Hajnoczi, 2016/12/01
- [Qemu-devel] [PATCH v4 10/13] aio: add .io_poll_begin/end() callbacks, Stefan Hajnoczi, 2016/12/01
- [Qemu-devel] [PATCH v4 12/13] aio: self-tune polling time, Stefan Hajnoczi, 2016/12/01
[Qemu-devel] [PATCH v4 13/13] iothread: add poll-grow and poll-shrink parameters, Stefan Hajnoczi, 2016/12/01
Re: [Qemu-devel] [PATCH v4 00/13] aio: experimental virtio-blk polling mode,
Paolo Bonzini <=
Re: [Qemu-devel] [PATCH v4 00/13] aio: experimental virtio-blk polling mode, Stefan Hajnoczi, 2016/12/02
Re: [Qemu-devel] [PATCH v4 00/13] aio: experimental virtio-blk polling mode, Fam Zheng, 2016/12/05
Re: [Qemu-devel] [PATCH v4 00/13] aio: experimental virtio-blk polling mode, Christian Borntraeger, 2016/12/05