git: kernel - Wakeup threads blocked in the VM page allocator more quickly

Matthew Dillon dillon at crater.dragonflybsd.org
Thu Jun 27 00:04:11 PDT 2013


commit 77d1fb91cace7f1779195614024e920f1b70b275
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date:   Wed Jun 26 23:40:29 2013 -0700

    kernel - Wakeup threads blocked in the VM page allocator more quickly
    
    Additional tuning to changes in the way the pageout daemon and VM system
    wakes up threads blocked allocating normal VM pages.  Previously the VM
    system would wait for the vm_paging_target() to be reached before waking
    up all waiters, and had code to try to wakeup individual threads past
    the minimum.
    
    This just didn't work very well on machines with lots of memory because
    it could take quite a long time for the pageout daemon to actually reach
    the vm_paging_target() (and VM load could prevent it from being reached at
    all!).  Many threads could wind up being blocked indefinitely waiting for
    cache and/or free page counts to reach reasonable levels.
    
    The solution is to give the kernel time to build up a smaller number
    of free+cache pages beyond the minimum, enough to give all waiting threads
    a fair shot at allocating at least one page, and then simply wakeup all
    the waiters.  This hysteresis is set smallish on purpose, defaulting to
    a value of 16 in order to avoid holding threads blocked for excessive
    periods of time.
    
    Under heavy VM loads this creates an overlap between memory consumers and
    the pageout daemon, allowing the pageout daemon to run continuously in
    these situations.
    
    * Add the vm.page_free_hysteresis sysctl, initialized to 16.  This field
      specifies a small number of pages past the minimum required for normal
      system operation before the VM system will wakeup threads blocked in the
      VM page allocator.
    
    * Adjust tmpfs to force-free pages through the hysteresis value to reduce
      degenerate block/wakeup situations under heavy VM loads.

Summary of changes:
 sys/vfs/tmpfs/tmpfs_vnops.c |  2 +-
 sys/vm/vm_page.c            | 32 +++++++++++++++++++++++++++-----
 sys/vm/vm_page2.h           |  4 ++++
 sys/vm/vm_pageout.c         | 21 ++++++++++++++++-----
 sys/vm/vm_pageout.h         |  1 +
 5 files changed, 49 insertions(+), 11 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/77d1fb91cace7f1779195614024e920f1b70b275


-- 
DragonFly BSD source repository


More information about the Commits mailing list