Skip to the content.

cgroup 释放问题

https://lore.kernel.org/linux-mm/fee37e75-e818-46b0-8494-684ef3eb5cd4@lucifer.local/T/#m21e331d32ce035b5d68d77421929f5b4eef527ca

问题 1 : 为什么 page cache 文件无法释放,那么 cgroup 就无法释放?

当 vipservice 重启时,systemd 会删除/创建 vipservice mem cgroup。由于这些 mem cgroup 指向 events.log 的不同 page,导致 cgroup 虽然被删除,但无法真正被释放。

哦,是这样的啊:

mem_cgroup_css_offline 首先触发该阶段,重置 mem cgroup id,清空 writeback 等。此时,mem cgroup 无法通过文件系统访问,但仍能通过 snapshot_refaults 等函数从内核中访问其状态。

mem_cgroup_css_free 当 mem cgroup 关联的 page list 为空时,触发该阶段,彻底释放 mem cgroup。

也许有关的

https://lore.kernel.org/all/20191107205334.158354-3-hannes@cmpxchg.org/T/#med6d09203b3b17ef93484744f84298fbd6ee73d2

TODO

  1. share memory 也是需要测试下
  2. 之前的测试进行,需要一个更高的覆盖率才可以
  3. 真的如此吗? 如果这种,还有操作空间吗? 这个问题还可以修复吗?
  4. cgroup 为什么不去释放?
  5. 其他的 cgroup 有什么遍历方法
  6. memcg->memory.usage 和 memcg.css.refcnt 做一下对比
  7. /proc/cgroups 的输出看看

  8. https://lore.kernel.org/all/20191107205334.158354-3-hannes@cmpxchg.org/T/#med6d09203b3b17ef93484744f84298fbd6ee73d2
  9. snapshot_refaults 的作用到底是什么?

难道真的是只有在 page free 的时候 css_put 才会释放 css 吗?

这个问题已经就绪了,使用 docs/kernel/cgroup/cgroup-free.test.sh 来测试就可以了。

@[
        charge_memcg+1
        __mem_cgroup_charge+44
        alloc_anon_folio+511
        do_anonymous_page+299
        __handle_mm_fault+1370
        handle_mm_fault+279
        do_user_addr_fault+707
        exc_page_fault+116
        asm_exc_page_fault+38
]: 45550

css_get 不是在和 page 关联的 refcount 相关的:

static int charge_memcg(struct folio *folio, struct mem_cgroup *memcg,
			gfp_t gfp)
{
	int ret;

	ret = try_charge(memcg, gfp, folio_nr_pages(folio));
	if (ret)
		goto out;

	css_get(&memcg->css);
	commit_charge(folio, memcg);
	memcg1_commit_charge(folio, memcg);
out:
	return ret;
}

int __mem_cgroup_charge(struct folio *folio, struct mm_struct *mm, gfp_t gfp)
{
	struct mem_cgroup *memcg;
	int ret;

	memcg = get_mem_cgroup_from_mm(mm);
	ret = charge_memcg(folio, memcg, gfp);
	css_put(&memcg->css);

	return ret;
}

#subsys_name    hierarchy       num_cgroups     enabled
cpu     0       273     1
cpuacct 0       273     1
blkio   0       273     1
memory  0       273     1
devices 0       273     1
freezer 0       273     1
net_cls 0       273     1
perf_event      0       273     1
net_prio        0       273     1
hugetlb 0       273     1
pids    0       273     1
rdma    0       273     1
misc    0       273     1
dmem    0       273     1

/usr/share/bcc/tools/funccount snapshot_refaults -i 1
/usr/share/bcc/tools/funccount mem_cgroup_iter -i 1
/usr/share/bcc/tools/funclatency mem_cgroup_iter -i 1


但是如果切换为 4.19 内核之后,的确会有不释放的情况,但是数量有限
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  10      1       1
cpu     4       85      1
cpuacct 4       85      1
blkio   9       85      1
memory  13      164     1
devices 12      85      1
freezer 11      1       1
net_cls 5       1       1
perf_event      3       1       1
net_prio        5       1       1
hugetlb 2       1       1
pids    6       106     1
rdma    7       1       1
files   8       1       1

如果是 drop cache 之后,数量也是的确变少了:


#subsys_name    hierarchy       num_cgroups     enabled
cpuset  10      1       1
cpu     4       85      1
cpuacct 4       85      1
blkio   9       85      1
memory  13      122     1
devices 12      85      1
freezer 11      1       1
net_cls 5       1       1
perf_event      3       1       1
net_prio        5       1       1
hugetlb 2       1       1
pids    6       106     1
rdma    7       1       1
files   8       1       1

但是无法复现出来有几千个的场景

如果是采用独立文件的方法,即便是在 6.17.7 的内核中,结果如下:


 cat /proc/cgroups
subsys_name    hierarchy       num_cgroups     enabled
cpu     0       2096    1
cpuacct 0       2096    1
blkio   0       2096    1
devices 0       2096    1
freezer 0       2096    1
net_cls 0       2096    1
perf_event      0       2096    1
net_prio        0       2096    1
hugetlb 0       2096    1
pids    0       2096    1
rdma    0       2096    1
misc    0       2096    1
debug   0       2096    1

drop cache 之后,结果为:
#subsys_name    hierarchy       num_cgroups     enabled
cpu     0       70      1
cpuacct 0       70      1
blkio   0       70      1
devices 0       70      1
freezer 0       70      1
net_cls 0       70      1
perf_event      0       70      1
net_prio        0       70      1
hugetlb 0       70      1
pids    0       70      1
rdma    0       70      1
misc    0       70      1
debug   0       70      1

如果是 4.19 内核中,其中的结果是: cat /proc/cgroups

#subsys_name    hierarchy       num_cgroups     enabled
cpuset  3       1       1
cpu     4       75      1
cpuacct 4       75      1
blkio   10      75      1
memory  9       2123    1
devices 8       75      1
freezer 2       1       1
net_cls 5       1       1
perf_event      6       1       1
net_prio        5       1       1
hugetlb 13      1       1
pids    12      75      1
rdma    7       1       1
files   11      1       1

案发现场

-   99.99%     0.00%  kswapd7  [kernel.kallsyms]  [k] ret_from_fork
     ret_from_fork
     kthread
   - kswapd
      - 99.97% balance_pgdat
         - 74.98% shrink_node
            - 28.21% shrink_node_memcg
                 5.59% lruvec_lru_size
               - 5.38% shrink_list
                  - 4.02% shrink_inactive_list
                     - 2.82% shrink_page_list
                        - 1.06% __remove_mapping
                             0.73% __delete_from_page_cache
                        - 1.01% free_unref_page_list
                           - 0.89% free_unref_page_commit
                                0.81% free_pcppages_bulk
                     - 1.05% isolate_lru_pages
                          0.75% __list_del_entry_valid
                    1.04% inactive_list_is_low
               - 0.92% blk_finish_plug
                    0.54% blk_flush_plug_list
              23.74% mem_cgroup_iter
            - 19.89% shrink_slab
               - 18.50% do_shrink_slab
                  - 17.02% count_shadow_nodes
                       1.09% find_next_bit
              1.17% mem_cgroup_protected
              0.64% find_first_bit
         - 24.67% snapshot_refaults
              0.77% mem_cgroup_iter
-   99.99%     0.00%  kswapd7  [kernel.kallsyms]  [k] kthread

此内核为 5.4 内核:

$ cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  10      63      1
cpu     2       211     1
cpuacct 2       211     1
blkio   11      199     1
memory  5       4611    1
devices 8       199     1
freezer 4       25      1
net_cls 3       25      1
perf_event      7       25      1
net_prio        3       25      1
hugetlb 9       20      1
pids    6       222     1

最终疑问,为什么我现在需要多个文件才可以制作出来

而案发现场,只是需要一个文件就可以制作出来?

似乎就是这个问题了

https://lore.kernel.org/linux-mm/fee37e75-e818-46b0-8494-684ef3eb5cd4@lucifer.local/T/#m21e331d32ce035b5d68d77421929f5b4eef527ca

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。