mirror of https://gitlab.com/qemu-project/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
![]() Adaptive polling has a big problem: It doesn't consider that an event loop can wait for many different events that may have very different typical latencies. For example, think of a guest that tends to send a new I/O request soon after the previous I/O request completes, but the storage on the host is rather slow. In this case, getting the new request from guest quickly means that polling is enabled, but the next thing is performing the I/O request on the backend, which is slow and disables polling again for the next guest request. This means that in such a scenario, polling could help for every other event, but is only ever enabled when it can't succeed. In order to fix this, keep a separate AioPolledEvent for each AioHandler. We will then know that the backend file descriptor always has a high latency and isn't worth polling for, but we also know that the guest is always fast and we should poll for it. This solves at least half of the problem, we can now keep polling for those cases where it makes sense and get the improved performance from it. Since the event loop doesn't know which event will be next, we still do some unnecessary polling while we're waiting for the slow disk. I made some attempts to be more clever than just randomly growing and shrinking the polling time, and even to let callers be explicit about when they expect a new event, but so far this hasn't resulted in improved performance or even caused performance regressions. For now, let's just fix the part that is easy enough to fix, we can revisit the rest later. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20250307221634.71951-6-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
1 month ago | |
---|---|---|
.. | ||
accounting.h | 2 years ago | |
aio-wait.h | 1 year ago | |
aio.h | 1 month ago | |
aio_task.h | 7 months ago | |
block-common.h | 3 months ago | |
block-copy.h | 7 months ago | |
block-global-state.h | 3 months ago | |
block-hmp-cmds.h | 2 years ago | |
block-io.h | 1 year ago | |
block.h | 2 years ago | |
block_backup.h | 2 years ago | |
block_int-common.h | 2 months ago | |
block_int-global-state.h | 11 months ago | |
block_int-io.h | 1 year ago | |
block_int.h | 2 years ago | |
blockjob.h | 1 year ago | |
blockjob_int.h | 1 year ago | |
dirty-bitmap.h | 2 years ago | |
export.h | 3 months ago | |
fuse.h | 4 years ago | |
graph-lock.h | 2 months ago | |
nbd.h | 2 months ago | |
nvme.h | 2 months ago | |
qapi.h | 2 years ago | |
qdict.h | 2 months ago | |
raw-aio.h | 1 month ago | |
replication.h | 4 years ago | |
reqlist.h | 3 years ago | |
snapshot.h | 1 year ago | |
thread-pool.h | 2 months ago | |
throttle-groups.h | 2 years ago | |
ufs.h | 2 months ago | |
write-threshold.h | 2 years ago |