From: Peter Xu <peterx@redhat.com>
To: Anish Moorthy <amoorthy@google.com>
Cc: Axel Rasmussen <axelrasmussen@google.com>,
pbonzini@redhat.com, maz@kernel.org, oliver.upton@linux.dev,
seanjc@google.com, jthoughton@google.com, bgardon@google.com,
dmatlack@google.com, ricarkol@google.com, kvm@vger.kernel.org,
kvmarm@lists.linux.dev, Nadav Amit <nadav.amit@gmail.com>
Subject: Re: [PATCH v3 00/22] Improve scalability of KVM + userfaultfd live migration via annotated memory faults.
Date: Thu, 20 Apr 2023 17:29:06 -0400 [thread overview]
Message-ID: <ZEGuogfbtxPNUq7t@x1n> (raw)
In-Reply-To: <CAF7b7mo68VLNp=QynfT7QKgdq=d1YYGv1SEVEDxF9UwHzF6YDw@mail.gmail.com>
Hi, Anish,
[Copied Nadav Amit for the last few paragraphs on userfaultfd, because
Nadav worked on a few userfaultfd performance problems; so maybe he'll
also have some ideas around]
On Wed, Apr 19, 2023 at 02:53:46PM -0700, Anish Moorthy wrote:
> On Wed, Apr 19, 2023 at 2:05 PM Peter Xu <peterx@redhat.com> wrote:
> >
> > On Wed, Apr 19, 2023 at 01:15:44PM -0700, Axel Rasmussen wrote:
> > > We considered sharding into several UFFDs. I do think it helps, but
> > > also I think there are two main problems with it...
> >
> > But I agree I can never justify that it'll always work. If you or Anish
> > could provide some data points to further support this issue that would be
> > very interesting and helpful, IMHO, not required though.
>
> Axel covered the reasons for not pursuing the sharding approach nicely
> (thanks!). It's not something we ever prototyped, so I don't have any
> further numbers there.
>
> On Wed, Apr 19, 2023 at 2:05 PM Peter Xu <peterx@redhat.com> wrote:
> >
> > On Wed, Apr 19, 2023 at 01:15:44PM -0700, Axel Rasmussen wrote:
> >
> > > I think we could share numbers from some of our internal benchmarks,
> > > or at the very least give relative numbers (e.g. +50% increase), but
> > > since a lot of the software stack is proprietary (e.g. we don't use
> > > QEMU), it may not be that useful or reproducible for folks.
> >
> > Those numbers can still be helpful. I was not asking for reproduceability,
> > but some test to better justify this feature.
>
> I do have some internal benchmarking numbers on this front, although
> it's been a while since I've collected them so the details might be a
> little sparse.
Thanks for sharing these data points. I don't understand most of them yet,
but I think it's better than the unit test numbers provided.
>
> I've confirmed performance gains with "scalable userfaultfd" using two
> workloads besides the self-test:
>
> The first, cycler, spins up a VM and launches a binary which (a) maps
> a large amount of memory and then (b) loops over it issuing writes as
> fast as possible. It's not a very realistic guest but it at least
> involves an actual migrating VM, and we often use it to
> stress/performance test migration changes. The write rate which cycler
> achieves during userfaultfd-based postcopy (without scalable uffd
> enabled) is about 25% of what it achieves under KVM Demand Paging (the
> internal KVM feature GCE currently uses for postcopy). With
> userfaultfd-based postcopy and scalable uffd enabled that rate jumps
> nearly 3x, so about 75% of what KVM Demand Paging achieves. The
> attached "Cycler.png" illustrates this effect (though due to some
> other details, faster demand paging actually makes the migrations
> worse: the point is that scalable uffd performs more similarly to kvm
> demand paging :)
Yes I don't understand why vanilla uffd is so different, neither am I sure
what does the graph mean, though. :)
Is the first drop caused by starting migration/precopy?
Is the 2nd (huge) drop (mostly to zero) caused by frequently accessing new
pages during postcopy?
Is the workload busy writes single thread, or NCPU threads?
Is what you mentioned on the 25%-75% comparison can be shown on the graph?
Or maybe that's part of the period where all three are very close to 0?
>
> The second is the redis memtier benchmark [1], a more realistic
> workflow where we migrate a VM running the redis server. With scalable
> userfaultfd, the client VM observes significantly higher transaction
> rates during uffd-based postcopy (see "Memtier.png"). I can pull the
> exact numbers if needed, but just from eyeballing the graph you can
> see that the improvement is something like 5-10x (at least) for
> several seconds. There's still a noticeable gap with KVM demand paging
> based-postcopy, but the improvement is definitely significant.
>
> [1] https://github.com/RedisLabs/memtier_benchmark
Does the "5-10x" difference rely in the "15s valley" you pointed out in the
graph?
Is it reproduceable that the blue line always has a totally different
"valley" comparing to yellow/red?
Personally I still really want to know what happens if we just split the
vma and see how it goes with a standard workloads, but maybe I'm asking too
much so don't yet worry. The solution here proposed still makes sense to
me and I agree if this can be done well it can resolve the bottleneck over
1-userfaultfd.
But after I read some of the patches I'm not sure whether it's possible it
can be implemented in a complete way. You mentioned here and there on that
things can be missing probably due to random places accessing guest pages
all over kvm. Relying sololy on -EFAULT so far doesn't look very reliable
to me, but it could be because I didn't yet really understand how it works.
Is above a concern to the current solution?
Have any of you tried to investigate the other approach to scale
userfaultfd?
It seems userfaultfd does one thing great which is to have the trapping at
an unified place (when the page fault happens), hence it doesn't need to
worry on random codes splat over KVM module read/write a guest page. The
question is whether it'll be easy to do so.
Split vma definitely is still a way to scale userfaultfd, but probably not
in a good enough way because it's scaling in memory axis, not cores. If
tens of cores accessing a small region that falls into the same VMA, then
it stops working.
However maybe it can be scaled in other form? So far my understanding is
"read" upon uffd for messages is still not a problem - the read can be done
in chunk, and each message will be converted into a request to be send
later.
If the real problem relies in a bunch of threads queuing, is it possible
that we can provide just more queues for the events? The readers will just
need to go over all the queues.
Way to decide "which thread uses which queue" can be another problem, what
comes ups quickly to me is a "hash(tid) % n_queues" but maybe it can be
better. Each vcpu thread will have different tids, then they can hopefully
scale on the queues.
There's at least one issue that I know with such an idea, that after we
have >1 uffd queues it means the message order will be uncertain. It may
matter for some uffd users (e.g. cooperative userfaultfd, see
UFFD_FEATURE_FORK|REMOVE|etc.) because I believe order of messages matter
for them (mostly CRIU). But I think that's not a blocker either because we
can forbid those features with multi queues.
That's a wild idea that I'm just thinking about, which I have totally no
idea whether it'll work or not. It's more or less of a generic question on
"whether there's chance to scale on uffd side just in case it might be a
cleaner approach", when above concern is a real concern.
Thanks,
--
Peter Xu
next prev parent reply other threads:[~2023-04-20 21:30 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-12 21:34 [PATCH v3 00/22] Improve scalability of KVM + userfaultfd live migration via annotated memory faults Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 01/22] KVM: selftests: Allow many vCPUs and reader threads per UFFD in demand paging test Anish Moorthy
2023-04-19 13:51 ` Hoo Robert
2023-04-20 17:55 ` Anish Moorthy
2023-04-21 12:15 ` Robert Hoo
2023-04-21 16:21 ` Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 02/22] KVM: selftests: Use EPOLL in userfaultfd_util reader threads and signal errors via TEST_ASSERT Anish Moorthy
2023-04-19 13:36 ` Hoo Robert
2023-04-19 23:26 ` Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 03/22] KVM: Allow hva_pfn_fast() to resolve read-only faults Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 04/22] KVM: x86: Set vCPU exit reason to KVM_EXIT_UNKNOWN at the start of KVM_RUN Anish Moorthy
2023-05-02 17:17 ` Anish Moorthy
2023-05-02 18:51 ` Sean Christopherson
2023-05-02 19:49 ` Anish Moorthy
2023-05-02 20:41 ` Sean Christopherson
2023-05-02 21:46 ` Anish Moorthy
2023-05-02 22:31 ` Sean Christopherson
2023-04-12 21:34 ` [PATCH v3 05/22] KVM: Add KVM_CAP_MEMORY_FAULT_INFO Anish Moorthy
2023-04-19 13:57 ` Hoo Robert
2023-04-20 18:09 ` Anish Moorthy
2023-04-21 12:28 ` Robert Hoo
2023-06-01 19:52 ` Oliver Upton
2023-06-01 20:30 ` Anish Moorthy
2023-06-01 21:29 ` Oliver Upton
2023-07-04 10:10 ` Kautuk Consul
2023-04-12 21:34 ` [PATCH v3 06/22] KVM: Add docstrings to __kvm_write_guest_page() and __kvm_read_guest_page() Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 07/22] KVM: Annotate -EFAULTs from kvm_vcpu_write_guest_page() Anish Moorthy
2023-04-20 20:52 ` Peter Xu
2023-04-20 23:29 ` Anish Moorthy
2023-04-21 15:00 ` Peter Xu
2023-04-12 21:34 ` [PATCH v3 08/22] KVM: Annotate -EFAULTs from kvm_vcpu_read_guest_page() Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 09/22] KVM: Annotate -EFAULTs from kvm_vcpu_map() Anish Moorthy
2023-04-20 20:53 ` Peter Xu
2023-04-20 23:34 ` Anish Moorthy
2023-04-21 14:58 ` Peter Xu
2023-04-12 21:34 ` [PATCH v3 10/22] KVM: x86: Annotate -EFAULTs from kvm_mmu_page_fault() Anish Moorthy
2023-04-12 21:34 ` [PATCH v3 11/22] KVM: x86: Annotate -EFAULTs from setup_vmgexit_scratch() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 12/22] KVM: x86: Annotate -EFAULTs from kvm_handle_page_fault() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 13/22] KVM: x86: Annotate -EFAULTs from kvm_hv_get_assist_page() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 14/22] KVM: x86: Annotate -EFAULTs from kvm_pv_clock_pairing() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 15/22] KVM: x86: Annotate -EFAULTs from direct_map() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 16/22] KVM: x86: Annotate -EFAULTs from kvm_handle_error_pfn() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 17/22] KVM: Introduce KVM_CAP_ABSENT_MAPPING_FAULT without implementation Anish Moorthy
2023-04-19 14:00 ` Hoo Robert
2023-04-20 18:23 ` Anish Moorthy
2023-04-24 21:02 ` Sean Christopherson
2023-06-01 16:04 ` Oliver Upton
2023-06-01 18:19 ` Oliver Upton
2023-06-01 18:59 ` Sean Christopherson
2023-06-01 19:29 ` Oliver Upton
2023-06-01 19:34 ` Sean Christopherson
2023-04-12 21:35 ` [PATCH v3 18/22] KVM: x86: Implement KVM_CAP_ABSENT_MAPPING_FAULT Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 19/22] KVM: arm64: Annotate (some) -EFAULTs from user_mem_abort() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 20/22] KVM: arm64: Implement KVM_CAP_ABSENT_MAPPING_FAULT Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 21/22] KVM: selftests: Add memslot_flags parameter to memstress_create_vm() Anish Moorthy
2023-04-12 21:35 ` [PATCH v3 22/22] KVM: selftests: Handle memory fault exits in demand_paging_test Anish Moorthy
2023-04-19 14:09 ` Hoo Robert
2023-04-19 16:40 ` Anish Moorthy
2023-04-20 22:47 ` Anish Moorthy
2023-04-27 15:48 ` James Houghton
2023-05-01 18:01 ` Anish Moorthy
2023-04-19 19:55 ` [PATCH v3 00/22] Improve scalability of KVM + userfaultfd live migration via annotated memory faults Peter Xu
2023-04-19 20:15 ` Axel Rasmussen
2023-04-19 21:05 ` Peter Xu
[not found] ` <CAF7b7mo68VLNp=QynfT7QKgdq=d1YYGv1SEVEDxF9UwHzF6YDw@mail.gmail.com>
2023-04-20 21:29 ` Peter Xu [this message]
2023-04-21 16:58 ` Anish Moorthy
2023-04-21 17:39 ` Nadav Amit
2023-04-24 17:54 ` Anish Moorthy
2023-04-24 19:44 ` Nadav Amit
2023-04-24 20:35 ` Sean Christopherson
2023-04-24 23:47 ` Nadav Amit
2023-04-25 0:26 ` Sean Christopherson
2023-04-25 0:37 ` Nadav Amit
2023-04-25 0:15 ` Anish Moorthy
2023-04-25 0:54 ` Nadav Amit
2023-04-27 16:38 ` James Houghton
2023-04-27 20:26 ` Peter Xu
2023-05-03 19:45 ` Anish Moorthy
2023-05-03 20:09 ` Sean Christopherson
[not found] ` <ZFLPlRReglM/Vgfu@x1n>
2023-05-03 21:27 ` Peter Xu
2023-05-03 21:42 ` Sean Christopherson
2023-05-03 23:45 ` Peter Xu
2023-05-04 19:09 ` Peter Xu
2023-05-05 18:32 ` Anish Moorthy
2023-05-08 1:23 ` Peter Xu
2023-05-09 20:52 ` Anish Moorthy
2023-05-10 21:50 ` Peter Xu
2023-05-11 17:17 ` David Matlack
2023-05-11 17:33 ` Axel Rasmussen
2023-05-11 19:05 ` David Matlack
2023-05-11 19:45 ` Axel Rasmussen
2023-05-15 15:16 ` Peter Xu
2023-05-15 15:05 ` Peter Xu
2023-05-15 17:16 ` Anish Moorthy
2023-05-05 20:05 ` Nadav Amit
2023-05-08 1:12 ` Peter Xu
2023-04-20 23:42 ` Anish Moorthy
2023-05-09 22:19 ` David Matlack
2023-05-10 16:35 ` Anish Moorthy
2023-05-10 22:35 ` Sean Christopherson
2023-05-10 23:44 ` Anish Moorthy
2023-05-23 17:49 ` Anish Moorthy
2023-06-01 22:43 ` Oliver Upton
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=ZEGuogfbtxPNUq7t@x1n \
--to=peterx@redhat.com \
--cc=amoorthy@google.com \
--cc=axelrasmussen@google.com \
--cc=bgardon@google.com \
--cc=dmatlack@google.com \
--cc=jthoughton@google.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=nadav.amit@gmail.com \
--cc=oliver.upton@linux.dev \
--cc=pbonzini@redhat.com \
--cc=ricarkol@google.com \
--cc=seanjc@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox