Add oom counter to memory.stat file. oom shows amount of oom kills triggered due to cgroup's memory limit. total_oom shows total sum of oom kills triggered due to cgroup's and it's sub-groups memory limits.
memory.stat in the root cgroup counts global oom kills. E.g: # mkdir /sys/fs/cgroup/memory/test/ # echo 100M > /sys/fs/cgroup/memory/test/memory.limit_in_bytes # echo 100M > /sys/fs/cgroup/memory/test/memory.memsw.limit_in_bytes # echo $$ > /sys/fs/cgroup/memory/test/tasks # ./vm-scalability/usemem -O 200M # grep oom /sys/fs/cgroup/memory/test/memory.stat oom 1 total_oom 1 # echo -1 > /sys/fs/cgroup/memory/test/memory.memsw.limit_in_bytes # echo -1 > /sys/fs/cgroup/memory/test/memory.limit_in_bytes # ./vm-scalability/usemem -O 1000G # grep oom /sys/fs/cgroup/memory/memory.stat oom 1 total_oom 2 https://jira.sw.ru/browse/PSBM-107731 Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com> --- mm/memcontrol.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6587cc2ef019..fe06c7db2ad3 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -400,6 +400,7 @@ struct mem_cgroup { struct mem_cgroup_stat_cpu __percpu *stat; struct mem_cgroup_stat2_cpu stat2; spinlock_t pcp_counter_lock; + atomic_long_t oom; atomic_t dead_count; #if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_INET) @@ -2005,6 +2006,7 @@ void mem_cgroup_note_oom_kill(struct mem_cgroup *root_memcg, if (memcg == root_memcg) break; } + atomic_long_inc(&root_memcg->oom); if (memcg_to_put) css_put(&memcg_to_put->css); @@ -5691,6 +5693,7 @@ static int memcg_stat_show(struct cgroup *cont, struct cftype *cft, for (i = 0; i < MEM_CGROUP_EVENTS_NSTATS; i++) seq_printf(m, "%s %lu\n", mem_cgroup_events_names[i], mem_cgroup_read_events(memcg, i)); + seq_printf(m, "oom %lu\n", atomic_long_read(&memcg->oom)); for (i = 0; i < NR_LRU_LISTS; i++) seq_printf(m, "%s %lu\n", mem_cgroup_lru_names[i], @@ -5733,6 +5736,12 @@ static int memcg_stat_show(struct cgroup *cont, struct cftype *cft, seq_printf(m, "total_%s %llu\n", mem_cgroup_events_names[i], val); } + { + unsigned long val = 0; + for_each_mem_cgroup_tree(mi, memcg) + val += atomic_long_read(&mi->oom); + seq_printf(m, "total_oom %lu\n", val); + } for (i = 0; i < NR_LRU_LISTS; i++) { unsigned long long val = 0; -- 2.26.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel