Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Oct 2002 08:55:50 -0700 (PDT)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        David Schultz <dschultz@uclink.Berkeley.EDU>
Cc:        Peter Wemm <peter@wemm.org>, Sean Kelly <smkelly@zombie.org>, hackers@FreeBSD.ORG
Subject:   Re: swapoff?
Message-ID:  <200210141555.g9EFtoZh061812@apollo.backplane.com>
References:  <20020713071911.GA1558@HAL9000.wox.org> <20020713073404.9869A3811@overcee.wemm.org> <20020713115746.GA2162@HAL9000.wox.org> <200207131636.g6DGaoqh081285@apollo.backplane.com> <20021007153845.GA371@HAL9000.homeunix.com> <200210072347.g97Nl3Zo049415@apollo.backplane.com> <20021008113614.GA319@HAL9000.homeunix.com> <200210081745.g98Hjkam078883@apollo.backplane.com> <20021011130154.GA16549@HAL9000.homeunix.com> <200210111814.g9BIEbah040688@apollo.backplane.com> <20021014094217.GA228@HAL9000.homeunix.com>

next in thread | previous in thread | raw e-mail | index | archive | help
:The concern was that there could be a race where the process is
:swapped out again after I have swapped it back in but before I can
:dirty its pages.  (Perhaps I need to hold the process lock a bit
:longer.)  Under heavy swapping load, swapoff() is failing to find
:a single page about one time out of ten, and I thought that might
:be the cause.

    Have you definitively tracked down the missing page?  It
    ought to be fairly easy to do from a kernel core with a
    gdb macro.

:I have tweaked swap_pager.c as you suggested earlier.  It runs
:about an order of magnitude slower under load now, since it's
:doing a vm_object_pip_wait() on every swap-backed object in the
:system that's currently paging, even for objects that are paging
:to a different swap device.  Unless you have a better idea, I
:think one way to improve performance might be to skip the busy
:objects, and after the whole hash has been scanned, rescan
:starting at the first index that was skipped.  Of course, it would
:have to wait for at least one object on each iteration so it
:doesn't get into a tight loop.

    This sounds reasonable, it's certainly worth a shot.  Another
    thing you may be able to do is to try to cluster the pageins
    on an object-by-object basis since our swap-scanning is 
    probably resulting in having to wait for the PIP count of
    the same object many times (for large objects with lots of 
    swap blocks). 

    Hmm.  Since we have to track down every swap block and we can
    (do?) get a count of pages that need to be swapped in, we could
    remove the PIP wait code and simply loop on the swap hash table
    over and over again until we've found all the swap blocks that
    we know have been allocated to that device.  Or something like that.

:Another important optimization is to page in the entire block at
:once, rather than doing it a page at a time.  I tried to do this
:with the following algorithm:
:
:	- grab SWAP_META_PAGES pages
:	- note which ones are already in core using a bitmap
:	- call getpages() to retrieve the entire range
:...
:
:This didn't work, and it produced all sorts of interesting panics
:for reasons I haven't yet figured out.  My latest patch has some
:remnants of of some my attempts in swp_pager_force_pagein(), but
:I'll probably leave that optimization for another day unless you
:can see an obvious flaw in my approach.

    I can probably deal with that post-commit.  Lets ignore it for now.
    The main goal at the moment should be robustness.

:BTW, thanks for all of your help!

					-Matt
					Matthew Dillon 
					<dillon@backplane.com>

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210141555.g9EFtoZh061812>