Skip to content
  • Peter Zijlstra's avatar
    mm: sched: numa: Implement constant, per task Working Set Sampling (WSS) rate · 6e5fb223
    Peter Zijlstra authored
    
    
    Previously, to probe the working set of a task, we'd use
    a very simple and crude method: mark all of its address
    space PROT_NONE.
    
    That method has various (obvious) disadvantages:
    
     - it samples the working set at dissimilar rates,
       giving some tasks a sampling quality advantage
       over others.
    
     - creates performance problems for tasks with very
       large working sets
    
     - over-samples processes with large address spaces but
       which only very rarely execute
    
    Improve that method by keeping a rotating offset into the
    address space that marks the current position of the scan,
    and advance it by a constant rate (in a CPU cycles execution
    proportional manner). If the offset reaches the last mapped
    address of the mm then it then it starts over at the first
    address.
    
    The per-task nature of the working set sampling functionality in this tree
    allows such constant rate, per task, execution-weight proportional sampling
    of the working set, with an adaptive sampling interval/frequency that
    goes from once per 100ms up to just once per 8 seconds.  The current
    sampling volume is 256 MB per interval.
    
    As tasks mature and converge their working set, so does the
    sampling rate slow down to just a trickle, 256 MB per 8
    seconds of CPU time executed.
    
    This, beyond being adaptive, also rate-limits rarely
    executing systems and does not over-sample on overloaded
    systems.
    
    [ In AutoNUMA speak, this patch deals with the effective sampling
      rate of the 'hinting page fault'. AutoNUMA's scanning is
      currently rate-limited, but it is also fundamentally
      single-threaded, executing in the knuma_scand kernel thread,
      so the limit in AutoNUMA is global and does not scale up with
      the number of CPUs, nor does it scan tasks in an execution
      proportional manner.
    
      So the idea of rate-limiting the scanning was first implemented
      in the AutoNUMA tree via a global rate limit. This patch goes
      beyond that by implementing an execution rate proportional
      working set sampling rate that is not implemented via a single
      global scanning daemon. ]
    
    [ Dan Carpenter pointed out a possible NULL pointer dereference in the
      first version of this patch. ]
    
    Based-on-idea-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
    Bug-Found-By: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Rik van Riel <riel@redhat.com>
    [ Wrote changelog and fixed bug. ]
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Signed-off-by: default avatarMel Gorman <mgorman@suse.de>
    Reviewed-by: default avatarRik van Riel <riel@redhat.com>
    6e5fb223