回收的核心逻辑

下面整理了一下回收中个人认为比较重要的调用关系。

  • 左边从kswapd()开始的是间接回收

  • 中间从node_reclaim()开始的是直接回收(省略了其他的部分)

  • 最右边是memcg对内存的限制(猜测)

kswapd() // one thread for each node
    |
    v
balace_pgdat(pgdat, )                node_reclaim()
    |                                    |
    v                                    v
kswapd_shrink_node(pgdat, )          __node_reclaim(pgdat, )
    \                                      /
         \                            /
              \                  /
                   \        /
                        v
                 shrink_node(pgdat, )                           mem_cgroup_soft_reclaim()
                     |                                                |
                     v                                                v
                 shrink_node_memcgs(pgdat, )                    mem_cgroup_shrink_node(memcg, )
                     memcg = mem_cgroup_iter()                      lruvec = mem_cgroup_lruvec(memcg, pgdat)
                     lruvec = mem_cgroup_lruvec(memcg, pgdat)

                             \                                      /
                                  \                            /
                                       \                  /
                                            \        /
                                                 v
                                         shrink_lruvec(lruvec, )

但是不管怎么样的路径下来,最后都是走到了shrink_lruvec(lruvec, )。

Last updated

Was this helpful?