Skip to content
  • Johannes Weiner's avatar
    mm: memcontrol: fix excessive complexity in memory.stat reporting · a983b5eb
    Johannes Weiner authored
    We've seen memory.stat reads in top-level cgroups take up to fourteen
    seconds during a userspace bug that created tens of thousands of ghost
    cgroups pinned by lingering page cache.
    
    Even with a more reasonable number of cgroups, aggregating memory.stat
    is unnecessarily heavy.  The complexity is this:
    
    	nr_cgroups * nr_stat_items * nr_possible_cpus
    
    where the stat items are ~70 at this point.  With 128 cgroups and 128
    CPUs - decent, not enormous setups - reading the top-level memory.stat
    has to aggregate over a million per-cpu counters.  This doesn't scale.
    
    Instead of spreading the source of truth across all CPUs, use the
    per-cpu counters merely to batch updates to shared atomic counters.
    
    This is the same as the per-cpu stocks we use for charging memory to the
    shared atomic page_counters, and also the way the global vmstat counters
    are implemented.
    
    Vmstat has elaborate spilling thresholds that depend on the number of
    CPUs, amount of memory, and memory pressure - carefully balancing the
    cost of counter updates with the amount of per-cpu error.  That's
    because the vmstat counters are system-wide, but also used for decisions
    inside the kernel (e.g.  NR_FREE_PAGES in the allocator).  Neither is
    true for the memory controller.
    
    Use the same static batch size we already use for page_counter updates
    during charging.  The per-cpu error in the stats will be 128k, which is
    an acceptable ratio of cores to memory accounting granularity.
    
    [hannes@cmpxchg.org: fix warning in __this_cpu_xchg() calls]
      Link: http://lkml.kernel.org/r/20171201135750.GB8097@cmpxchg.org
    Link: http://lkml.kernel.org/r/20171103153336.24044-3-hannes@cmpxchg.org
    
    
    Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Acked-by: default avatarVladimir Davydov <vdavydov.dev@gmail.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a983b5eb