• Christoph Lameter's avatar
    [PATCH] slab: Node rotor for freeing alien caches and remote per cpu pages. · 8fce4d8e
    Christoph Lameter authored
    The cache reaper currently tries to free all alien caches and all remote
    per cpu pages in each pass of cache_reap.  For a machines with large number
    of nodes (such as Altix) this may lead to sporadic delays of around ~10ms.
    Interrupts are disabled while reclaiming creating unacceptable delays.
    
    This patch changes that behavior by adding a per cpu reap_node variable.
    Instead of attempting to free all caches, we free only one alien cache and
    the per cpu pages from one remote node.  That reduces the time spend in
    cache_reap.  However, doing so will lengthen the time it takes to
    completely drain all remote per cpu pagesets and all alien caches.  The
    time needed will grow with the number of nodes in the system.  All caches
    are drained when they overflow their respective capacity.  So the drawback
    here is only that a bit of memory may be wasted for awhile longer.
    
    Details:
    
    1. Rename drain_remote_pages to drain_node_pages to allow the specification
       of the node to drain of pcp pages.
    
    2. Add additional functions init_reap_node, next_reap_node for NUMA
       that manage a per cpu reap_node counter.
    
    3. Add a reap_alien function that reaps only from the current reap_node.
    
    For us this seems to be a critical issue.  Holdoffs of an average of ~7ms
    cause some HPC benchmarks to slow down significantly.  F.e.  NAS parallel
    slows down dramatically.  NAS parallel has a 12-16 seconds runtime w/o rotor
    compared to 5.8 secs with the rotor patches.  It gets down to 5.05 secs with
    the additional interrupt holdoff reductions.
    Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    8fce4d8e
page_alloc.c 67 KB