• Shakeel Butt's avatar
    mm: page_counter: remove unneeded atomic ops for low/min · cfdab60b
    Shakeel Butt authored
    Patch series "memcg: optimize charge codepath", v2.
    
    Recently Linux networking stack has moved from a very old per socket
    pre-charge caching to per-cpu caching to avoid pre-charge fragmentation
    and unwarranted OOMs.  One impact of this change is that for network
    traffic workloads, memcg charging codepath can become a bottleneck.  The
    kernel test robot has also reported this regression[1].  This patch series
    tries to improve the memcg charging for such workloads.
    
    This patch series implement three optimizations:
    (A) Reduce atomic ops in page counter update path.
    (B) Change layout of struct page_counter to eliminate false sharing
        between usage and high.
    (C) Increase the memcg charge batch to 64.
    
    To evaluate the impact of these optimizations, on a 72 CPUs machine, we
    ran the following workload in root memcg and then compared with scenario
    where the workload is run in a three level of cgroup hierarchy with top
    level having min and low setup appropriately.
    
     $ netserver -6
     # 36 instances of netperf with following params
     $ netperf -6 -H ::1 -l 60 -t TCP_SENDFILE -- -m 10K
    
    Results (average throughput of netperf):
    1. root memcg		21694.8 Mbps
    2. 6.0-rc1		10482.7 Mbps (-51.6%)
    3. 6.0-rc1 + (A)	14542.5 Mbps (-32.9%)
    4. 6.0-rc1 + (B)	12413.7 Mbps (-42.7%)
    5. 6.0-rc1 + (C)	17063.7 Mbps (-21.3%)
    6. 6.0-rc1 + (A+B+C)	20120.3 Mbps (-7.2%)
    
    With all three optimizations, the memcg overhead of this workload has
    been reduced from 51.6% to just 7.2%.
    
    [1] https://lore.kernel.org/linux-mm/20220619150456.GB34471@xsang-OptiPlex-9020/
    
    
    This patch (of 3):
    
    For cgroups using low or min protections, the function
    propagate_protected_usage() was doing an atomic xchg() operation
    irrespectively.  We can optimize out this atomic operation for one
    specific scenario where the workload is using the protection (i.e.  min >
    0) and the usage is above the protection (i.e.  usage > min).
    
    This scenario is actually very common where the users want a part of their
    workload to be protected against the external reclaim.  Though this
    optimization does introduce a race when the usage is around the protection
    and concurrent charges and uncharged trip it over or under the protection.
    In such cases, we might see lower effective protection but the subsequent
    charge/uncharge will correct it.
    
    To evaluate the impact of this optimization, on a 72 CPUs machine, we ran
    the following workload in a three level of cgroup hierarchy with top level
    having min and low setup appropriately to see if this optimization is
    effective for the mentioned case.
    
     $ netserver -6
     # 36 instances of netperf with following params
     $ netperf -6 -H ::1 -l 60 -t TCP_SENDFILE -- -m 10K
    
    Results (average throughput of netperf):
    Without (6.0-rc1)	10482.7 Mbps
    With patch		14542.5 Mbps (38.7% improvement)
    
    With the patch, the throughput improved by 38.7%
    
    Link: https://lkml.kernel.org/r/20220825000506.239406-1-shakeelb@google.com
    Link: https://lkml.kernel.org/r/20220825000506.239406-2-shakeelb@google.comSigned-off-by: default avatarShakeel Butt <shakeelb@google.com>
    Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
    Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
    Reviewed-by: default avatarFeng Tang <feng.tang@intel.com>
    Acked-by: default avatarRoman Gushchin <roman.gushchin@linux.dev>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: "Michal Koutný" <mkoutny@suse.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Oliver Sang <oliver.sang@intel.com>
    Cc: Soheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    cfdab60b
page_counter.c 6.77 KB