From: Kevin Locke <kevin@kevinlocke.name>
To: Paolo Bonzini <pbonzini@redhat.com>, kvm@vger.kernel.org
Cc: Andi Kleen <ak@linux.intel.com>,
Christian Ehrhardt <christian.ehrhardt@canonical.com>
Subject: Re: qemu polling KVM_IRQ_LINE_STATUS when stopped
Date: Thu, 25 Jun 2020 08:26:51 -0600 [thread overview]
Message-ID: <20200625142651.GA154525@kevinolos> (raw)
In-Reply-To: <1560363269.13828538.1508539882580.JavaMail.zimbra@redhat.com>
Hi Paolo et al.,
I recently noticed ~30% CPU usage on a paused Windows 10 VM, as
reported in https://bugs.launchpad.net/bugs/1851062 and
https://bugzilla.redhat.com/1638289 which, with the help of Christian
Ehrhardt, led to your previous discussion of the issue with Andi Kleen
at https://lore.kernel.org/kvm/87a80pihlz.fsf@linux.intel.com/ quoted
below:
On Fri, 2017-10-20 at 18:51 -0400, Paolo Bonzini wrote:
> On Fri, 2017-10-20 at 13:50 -0700, Andi Kleen wrote:
>> On Fri, Oct 20, 2017 at 05:12:40PM +0200, Paolo Bonzini wrote:
>>> On 20/10/2017 16:09, Andi Kleen wrote:
>>>>> Unfortunately that's not possible in general. Windows uses the periodic
>>>>> timer to track wall time (!), so if you do that your clock is going to
>>>>> be late when you resume the guest.
>>>>
>>>> But when the guest cannot execute instructions
>>>> it cannot see whatever the handler does.
>>>>
>>>> So the handler could always catch up after stopping for longer,
>>>> without making any difference.
>>>
>>> You may be right... you should get the interrupt storm *after
>>> continuing* the guest, but not while it's stopped.
>>
>> Maybe be find to not have a storm, but only one. I belive real hardware
>> cannot have a storm because only one interrupt can be pending at a time.
>
> Real hardware also doesn't pause for an extended period of time, with
> exceptions such as JTAG that aren't as prominent as pausing a virtual
> machine. This is just how Windows works: unless it's S3/S4, it updates
> the time from RTC periodic timer ticks, and the frequency sometimes goes
> up as much as 1024 or 2048 Hz (default being 64 Hz IIRC).
>
> In fact, we have a lot of cruft in KVM just to track periodic timer
> ticks that couldn't be delivered and retry again a little later. Without
> that, the smallest load on the host is enough for time to drift in
> Windows guests.
I'm trying to understand the cause and what options might exist for
addressing it. Several questions:
1. Do I understand correctly that the CPU usage is due to counting
RTC periodic timer ticks for replay when the guest is resumed?
2. If so, would it be possible to calculate the number of ticks
required from the time delta at resume, rather than polling each
tick while paused?
3. Presumably when restoring from a snapshot, Windows time must jump
forward from the time the snapshot was taken. How does this differ
from resuming from a paused state?
4. How is this handled if the host is suspended (S3) when the VM is
paused (or not paused) and ticks aren't counted on the host?
5. I have not observed high CPU usage for paused VMs in VirtualBox.
Would it be worth investigating how they handle this?
From the discussion in https://bugs.launchpad.net/bugs/1851062 it
appears that the issue does not occur for all Windows 10 VMs. Does
that fit the theory it is caused by RTC periodic timer ticks? In my
VM, clockres reports
Maximum timer interval: 15.625 ms
Minimum timer interval: 0.500 ms
Current timer interval: 15.625 ms
immediately before and after pausing, suggesting that high periodic
tick frequency is not necessary to cause the issue.
Thanks,
Kevin
next prev parent reply other threads:[~2020-06-25 14:36 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-17 21:34 qemu polling KVM_IRQ_LINE_STATUS when stopped Andi Kleen
2017-10-18 7:47 ` Paolo Bonzini
2017-10-18 17:49 ` Andi Kleen
2017-10-18 19:24 ` Paolo Bonzini
2017-10-20 0:34 ` Andi Kleen
2017-10-20 8:32 ` Paolo Bonzini
2017-10-20 14:09 ` Andi Kleen
2017-10-20 15:12 ` Paolo Bonzini
2017-10-20 20:50 ` Andi Kleen
2017-10-20 22:51 ` Paolo Bonzini
2020-06-25 14:26 ` Kevin Locke [this message]
2020-06-25 16:28 ` Andi Kleen
2020-06-25 18:41 ` Paolo Bonzini
2020-06-25 18:56 ` Kevin Locke
2020-06-25 19:17 ` Paolo Bonzini
2020-06-25 20:10 ` Kevin Locke
2020-06-26 15:14 ` Kevin Locke
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=20200625142651.GA154525@kevinolos \
--to=kevin@kevinlocke.name \
--cc=ak@linux.intel.com \
--cc=christian.ehrhardt@canonical.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.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