From: Sean Christopherson <seanjc@google.com>
To: Colton Lewis <coltonlewis@google.com>
Cc: ricarkol@google.com, kvm@vger.kernel.org, pbonzini@redhat.com,
maz@kernel.org, dmatlack@google.com, bgardon@google.com,
oupton@google.com
Subject: Re: [PATCH 2/3] KVM: selftests: Collect memory access latency samples
Date: Thu, 26 Jan 2023 19:07:50 +0000 [thread overview]
Message-ID: <Y9LPhs1BgBA4+kBY@google.com> (raw)
In-Reply-To: <gsnta625qip4.fsf@coltonlewis-kvm.c.googlers.com>
On Thu, Jan 26, 2023, Colton Lewis wrote:
> Sean Christopherson <seanjc@google.com> writes:
> > Maybe s/count/time? Yeah, it's technically wrong to call it "time", but
> > "count" is too generic.
>
> I could say "cycles".
Works for me.
> > > > + uint32_t maybe_sample;
> > > >
> > > > gva = vcpu_args->gva;
> > > > pages = vcpu_args->pages;
> > > > @@ -75,10 +94,21 @@ void perf_test_guest_code(uint32_t vcpu_idx)
> > > >
> > > > addr = gva + (page * pta->guest_page_size);
> > > >
> > > > - if (guest_random_u32(&rand_state) % 100 < pta->write_percent)
> > > > + if (guest_random_u32(&rand_state) % 100 < pta->write_percent) {
> > > > + count_before = perf_test_timer_read();
> > > > *(uint64_t *)addr = 0x0123456789ABCDEF;
> > > > - else
> > > > + count_after = perf_test_timer_read();
> > > > + } else {
> > > > + count_before = perf_test_timer_read();
> > > > READ_ONCE(*(uint64_t *)addr);
> > > > + count_after = perf_test_timer_read();
>
> > > "count_before ... ACCESS count_after" could be moved to some macro,
> > > e.g.,:
> > > t = MEASURE(READ_ONCE(*(uint64_t *)addr));
>
> > Even better, capture the read vs. write in a local variable to
> > self-document the
> > use of the RNG, then the motivation for reading the system counter
> > inside the
> > if/else-statements goes away. That way we don't need to come up with a
> > name
> > that documents what MEASURE() measures.
>
> > write = guest_random_u32(&rand_state) % 100 < args->write_percent;
>
> > time_before = guest_system_counter_read();
> > if (write)
> > *(uint64_t *)addr = 0x0123456789ABCDEF;
> > else
> > READ_ONCE(*(uint64_t *)addr);
> > time_after = guest_system_counter_read();
>
> Couldn't timing before and after the if statement produce bad
> measurements? We might be including a branch mispredict in our memory
> access latency and this could happen a lot because it's random so no way
> for the CPU to predict.
Hmm, I was assuming the latency due to a (mispredicted) branch would be in the
noise compared to the latency of a VM-Exit needed to handle the fault.
On the other hand, adding a common macro would be trivial, it's only the naming
that's hard. What if we keep with the "cycles" theme and do as Ricardo suggested?
E.g. minus backslashes, this doesn't look awful.
#define MEASURE_CYCLES(x)
({
uint64_t start;
start = guest_system_counter_read();
x;
guest_system_counter_read() - start;
})
> > > > + if (i < SAMPLES_PER_VCPU)
>
> > Would it make sense to let the user configure the number of samples?
> > Seems easy enough and would let the user ultimately decide how much memory
> > to burn on samples.
>
> Theoretically users may wish to tweak the accuracy vs memory use
> tradeoff. Seemed like a shakey value proposition to me because of
> diminishing returns to increased accuracy, but I will include an option
> if you insist.
It's not so much that I expect users to want better accuracy, it's that I dislike
I arbitrary magic numbers. E.g. why 1000 and not 500 or 2000? Especially since
the number of accesses _is_ controllable by the user. Hmm, the other thing to
consider is that, as proposed, the vast majority of the capacity will go unused,
e.g. default is 4, max is 512 (and that should really be tied to KVM's max of 4096).
What if we invert the calculation and define the capacity in bytes, and derive
the number of samples based on capacity / nr_vcpus? And then push the capacity
as high as possible, e.g. I assume there's a threshold where the test will fail
because of selftests poor page table management. That way the sampling is as
efficient as possible, and the arbitrary capacity comes from limitations within
the framework, as opposed to a human defined magic number.
next prev parent reply other threads:[~2023-01-26 19:08 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-15 17:32 [PATCH 0/3] Calculate memory access latency stats Colton Lewis
2022-11-15 17:32 ` [PATCH 1/3] KVM: selftests: Allocate additional space for latency samples Colton Lewis
2023-01-17 20:32 ` Ricardo Koller
2023-01-18 16:49 ` Sean Christopherson
2023-01-26 18:00 ` Colton Lewis
2022-11-15 17:32 ` [PATCH 2/3] KVM: selftests: Collect memory access " Colton Lewis
2023-01-17 20:43 ` Ricardo Koller
2023-01-18 16:32 ` Sean Christopherson
2023-01-26 18:00 ` Colton Lewis
2023-01-26 19:07 ` Sean Christopherson [this message]
2023-01-26 17:58 ` Colton Lewis
2023-01-26 18:30 ` Ricardo Koller
2023-01-17 20:48 ` Ricardo Koller
2023-01-26 17:59 ` Colton Lewis
2022-11-15 17:32 ` [PATCH 3/3] KVM: selftests: Print summary stats of memory latency distribution Colton Lewis
2023-01-17 20:45 ` Ricardo Koller
2023-01-26 17:58 ` Colton Lewis
2023-01-18 16:43 ` Sean Christopherson
2023-01-26 17:59 ` Colton Lewis
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=Y9LPhs1BgBA4+kBY@google.com \
--to=seanjc@google.com \
--cc=bgardon@google.com \
--cc=coltonlewis@google.com \
--cc=dmatlack@google.com \
--cc=kvm@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=ricarkol@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.