如何触发匿名页的回收[]

echo 3 > /proc/sys/vm/drop_cache 保证了对pagecache和slab的回收,但是匿名页的回收没什么办法呀,

其实原理很简单,page-cache是缓存,没有人拥有,并且slab中注册的那些shrinker也是只回收没有用到的内存,都不属于任何进程的

但是匿名页就不一样了【说到这里还真是有个疑问了:kswap中释放的在进程用户空间中map的页咯】

/proc/sys/vm/min_free_kbytes

把这个值设置成100G之后,卡死机了;把这个值设置得很大,系统终于在不断进行page的回收过程了!

【如何启动匿名页的回收,在页面的回收逻辑中】

有个问题,mmap的file的页是属于匿名页还是文件缓存页?LRU_FILE链表中是管理的所有的匿名页么

mem_cgroup_shrink_node:
总共有两个地
shrink_node_memcg是唯一的地方会涉及到
mem_cgroup_shrink_node--->shrink_node_memcg
---------------------------------------------------------------
1)- kswapd-->balance_pgdata-->kswapd_shrink_node
2)- get_page_from_freelist-->node_reclaim-->__node_reclaim
3)- try_to_free_pages/try_to_free_mem_cgroup_pages/shrink_all_memory---->do_try_to_free_pages-->shrink_zones
-->shrink_node-------------->shrink_node_memcg
---------------------------------------------------------------

3.1)__alloc_pages_slowpath --> __alloc_pages_direct_reclaim -->__perform_reclaim ----> try_to_free_pages
3.2) try_to_free_mem_cgroup_pages [当在这个memory], 在try_to_charge的时候会自己触发回收
3.3.1) try_charge
3.3.2) mem_cgroup_write --> mem_cgroup_resize_limit
3.3.3) mem_cgroup_force_empty_write-->mem_cgroup_force_empty
3.3.4) mem_files['high']--->memory_high_write
3.3.5) memory_max_write['max']
3.3.6) reclaim_high

3.3.6.1) mem_cgroup_alloc-->INIT_WORK(&memcg->high_work, high_work_func)-->high_work_func-->reclaim_high /* 原来每个 cgroup 都是有自己的>回收函数的 */ 
3.3.6.2) exit_to_usermode_loop ---> tracehook_notify_resume --> mem_cgroup_handle_over_high; [b23afb93d317c65cef553b804f08dec8a7a0f7e1, mmecg: punt high overage reclaim to return-to-userland path ]中说的很清楚,在返回用户态之前回收这个组的内存!

 代码的逻辑,有心人能看懂吧。

原文地址:https://www.cnblogs.com/honpey/p/7816386.html