回收的核心逻辑
下面整理了一下回收中个人认为比较重要的调用关系。
左边从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?