diff options
author | Stefan Hajnoczi | 2020-03-05 18:08:06 +0100 |
---|---|---|
committer | Stefan Hajnoczi | 2020-03-09 17:45:16 +0100 |
commit | d37d0e365afb6825a90d8356fc6adcc1f58f40f3 (patch) | |
tree | d5cc874fc5fffaaecd073a4f56dac12378449265 /util/trace-events | |
parent | aio-posix: support userspace polling of fd monitoring (diff) | |
download | qemu-d37d0e365afb6825a90d8356fc6adcc1f58f40f3.tar.gz qemu-d37d0e365afb6825a90d8356fc6adcc1f58f40f3.tar.xz qemu-d37d0e365afb6825a90d8356fc6adcc1f58f40f3.zip |
aio-posix: remove idle poll handlers to improve scalability
When there are many poll handlers it's likely that some of them are idle
most of the time. Remove handlers that haven't had activity recently so
that the polling loop scales better for guests with a large number of
devices.
This feature only takes effect for the Linux io_uring fd monitoring
implementation because it is capable of combining fd monitoring with
userspace polling. The other implementations can't do that and risk
starving fds in favor of poll handlers, so don't try this optimization
when they are in use.
IOPS improves from 10k to 105k when the guest has 100
virtio-blk-pci,num-queues=32 devices and 1 virtio-blk-pci,num-queues=1
device for rw=randread,iodepth=1,bs=4k,ioengine=libaio on NVMe.
[Clarified aio_poll_handlers locking discipline explanation in comment
after discussion with Paolo Bonzini <pbonzini@redhat.com>.
--Stefan]
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Link: https://lore.kernel.org/r/20200305170806.1313245-8-stefanha@redhat.com
Message-Id: <20200305170806.1313245-8-stefanha@redhat.com>
Diffstat (limited to 'util/trace-events')
-rw-r--r-- | util/trace-events | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/util/trace-events b/util/trace-events index 83b6639018..0ce42822eb 100644 --- a/util/trace-events +++ b/util/trace-events @@ -5,6 +5,8 @@ run_poll_handlers_begin(void *ctx, int64_t max_ns, int64_t timeout) "ctx %p max_ run_poll_handlers_end(void *ctx, bool progress, int64_t timeout) "ctx %p progress %d new timeout %"PRId64 poll_shrink(void *ctx, int64_t old, int64_t new) "ctx %p old %"PRId64" new %"PRId64 poll_grow(void *ctx, int64_t old, int64_t new) "ctx %p old %"PRId64" new %"PRId64 +poll_add(void *ctx, void *node, int fd, unsigned revents) "ctx %p node %p fd %d revents 0x%x" +poll_remove(void *ctx, void *node, int fd) "ctx %p node %p fd %d" # async.c aio_co_schedule(void *ctx, void *co) "ctx %p co %p" |