• S
    memcg: flush stats only if updated · 11192d9c
    Shakeel Butt 提交于
    At the moment, the kernel flushes the memcg stats on every refault and
    also on every reclaim iteration.  Although rstat maintains per-cpu
    update tree but on the flush the kernel still has to go through all the
    cpu rstat update tree to check if there is anything to flush.  This
    patch adds the tracking on the stats update side to make flush side more
    clever by skipping the flush if there is no update.
    
    The stats update codepath is very sensitive performance wise for many
    workloads and benchmarks.  So, we can not follow what the commit
    aa48e47e ("memcg: infrastructure to flush memcg stats") did which
    was triggering async flush through queue_work() and caused a lot
    performance regression reports.  That got reverted by the commit
    1f828223 ("memcg: flush lruvec stats in the refault").
    
    In this patch we kept the stats update codepath very minimal and let the
    stats reader side to flush the stats only when the updates are over a
    specific threshold.  For now the threshold is (nr_cpus * CHARGE_BATCH).
    
    To evaluate the impact of this patch, an 8 GiB tmpfs file is created on
    a system with swap-on-zram and the file was pushed to swap through
    memory.force_empty interface.  On reading the whole file, the memcg stat
    flush in the refault code path is triggered.  With this patch, we
    observed 63% reduction in the read time of 8 GiB file.
    
    Link: https://lkml.kernel.org/r/20211001190040.48086-1-shakeelb@google.comSigned-off-by: NShakeel Butt <shakeelb@google.com>
    Acked-by: NJohannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Reviewed-by: N"Michal Koutný" <mkoutny@suse.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    11192d9c
memcontrol.c 193.2 KB