From: Avi Kivity <avi@redhat.com>
To: Max Laier <max@laiers.net>
Cc: kvm@vger.kernel.org
Subject: Re: RFC: shadow page table reclaim
Date: Mon, 31 Aug 2009 12:55:24 +0300 [thread overview]
Message-ID: <4A9B9E0C.2080701@redhat.com> (raw)
In-Reply-To: <200908280431.04960.max@laiers.net>
On 08/28/2009 05:31 AM, Max Laier wrote:
> Hello,
>
> it seems to me that the reclaim mechanism for shadow page table pages is sub-
> optimal. The arch.active_mmu_pages list that is used for reclaiming does not
> move up parent shadow page tables when a child is added so when we need a new
> shadow page we zap the oldest - which can well be a directory level page
> holding a just added table level page.
>
> Attached is a proof-of-concept diff and two plots before and after. The plots
> show referenced guest pages over time.
What do you mean by referenced guest pages? Total number of populated
sptes?
> As you can see there is less saw-
> toothing in the after plot and also fewer changes overall (because we don't
> zap mappings that are still in use as often). This is with a limit of 64 for
> the shadow page table to increase the effect and vmx/ept.
>
> I realize that the list_move and parent walk are quite expensive and that
> kvm_mmu_alloc_page is only half the story. It should really be done every
> time a new guest page table is mapped - maybe via rmap_add. This would
> obviously completely kill performance-wise, though.
>
> Another idea would be to improve the reclaim logic in a way that it prefers
> "old" PT_PAGE_TABLE_LEVEL over directories. Though I'm not sure how to code
> that up sensibly, either.
>
> As I said, this is proof-of-concept and RFC. So any comments welcome. For my
> use case the proof-of-concept diff seems to do well enough, though.
>
Given that reclaim is fairly rare, we should try to move the cost
there. So how about this:
- add an 'accessed' flag to struct kvm_mmu_page
- when reclaiming, try to evict pages that were not recently accessed
(but don't overscan - if you scan many recently accessed pages, evict
some of them anyway)
- when scanning, update the accessed flag with the accessed bit of all
parent_ptes
- when dropping an spte, update the accessed flag of the kvm_mmu_page it
points to
- when reloading cr3, mark the page as accessed (since it has no
parent_ptes)
This should introduce some LRU-ness that depends not only on fault
behaviour but also on long-term guest access behaviour (which is
important for long-running processes and kernel pages).
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2009-08-31 9:55 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-28 2:31 RFC: shadow page table reclaim Max Laier
2009-08-31 9:55 ` Avi Kivity [this message]
2009-08-31 12:09 ` Max Laier
2009-08-31 12:40 ` Avi Kivity
2009-09-02 2:24 ` Max Laier
2009-09-02 11:31 ` Avi Kivity
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=4A9B9E0C.2080701@redhat.com \
--to=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=max@laiers.net \
/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.