• KAMEZAWA Hiroyuki's avatar
    memcg: fix percpu cached charge draining frequency · 26fe6168
    KAMEZAWA Hiroyuki authored
    For performance, memory cgroup caches some "charge" from res_counter into
    per cpu cache.  This works well but because it's cache, it needs to be
    flushed in some cases.  Typical cases are
    
       1. when someone hit limit.
    
       2. when rmdir() is called and need to charges to be 0.
    
    But "1" has problem.
    
    Recently, with large SMP machines, we see many kworker runs because of
    flushing memcg's cache.  Bad things in implementation are that even if a
    cpu contains a cache for memcg not related to a memcg which hits limit,
    drain code is called.
    
    This patch does
            A) check percpu cache contains a useful data or not.
            B) check other asynchronous percpu draining doesn't run.
            C) don't call local cpu callback.
    
    (*)This patch avoid changing the calling condition with hard-limit.
    
    When I run "cat 1Gfile > /dev/null" under 300M limit memcg,
    
    [Before]
    13767 kamezawa  20   0 98.6m  424  416 D 10.0  0.0   0:00.61 cat
       58 root      20   0     0    0    0 S  0.6  0.0   0:00.09 kworker/2:1
       60 root      20   0     0    0    0 S  0.6  0.0   0:00.08 kworker/4:1
        4 root      20   0     0    0    0 S  0.3  0.0   0:00.02 kworker/0:0
       57 root      20   0     0    0    0 S  0.3  0.0   0:00.05 kworker/1:1
       61 root      20   0     0    0    0 S  0.3  0.0   0:00.05 kworker/5:1
       62 root      20   0     0    0    0 S  0.3  0.0   0:00.05 kworker/6:1
       63 root      20   0     0    0    0 S  0.3  0.0   0:00.05 kworker/7:1
    
    [After]
     2676 root      20   0 98.6m  416  416 D  9.3  0.0   0:00.87 cat
     2626 kamezawa  20   0 15192 1312  920 R  0.3  0.0   0:00.28 top
        1 root      20   0 19384 1496 1204 S  0.0  0.0   0:00.66 init
        2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
        3 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
        4 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kworker/0:0
    
    [akpm@linux-foundation.org: make percpu_charge_mutex static, tweak comments]
    Signed-off-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Acked-by: default avatarDaisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
    Reviewed-by: default avatarMichal Hocko <mhocko@suse.cz>
    Tested-by: default avatarYing Han <yinghan@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    26fe6168
memcontrol.c 141 KB