找回密码
 会员注册
查看: 17|回复: 0

Linux内存变低会发生什么问题

[复制链接]

1

主题

0

回帖

4

积分

新手上路

积分
4
发表于 2024-10-9 16:27:48 | 显示全部楼层 |阅读模式
Linux内存变低会发生什么问题 腾讯程序员 腾讯技术工程 腾讯技术工程 深圳市腾讯计算机系统有限公司 腾讯技术官方号。腾讯技术创新、前沿领域发布解读平台。 501篇内容 2024年09月09日 18:01 广东 作者:cynrikluo内存不是无限的,总有不够用的时候,linux内核用三个机制来处理这种情况:内存回收、内存规整、oom-kill。当发现内存不足时,内核会先尝试内存回收,从一些进程手里拿回一些页;如果这样还是不能满足申请需求,则触发内存规整;再不行,则触发oom主动kill掉一个不太重要的进程,释放内存。低内存情况下,内核的处理逻辑内存申请的核心函数是__alloc_pages_nodemask:/**Thisisthe'heart'ofthezonedbuddyallocator.*/structpage*__alloc_pages_nodemask(gfp_tgfp_mask,unsignedintorder,intpreferred_nid,nodemask_t*nodemask){structpage*page;unsignedintalloc_flags=ALLOC_WMARK_LOW;gfp_talloc_mask;/*Thegfp_tthatwasactuallyusedforallocation*/structalloc_contextac={};__alloc_pages_nodemask会先尝试调用get_page_from_freelist从伙伴系统的freelist里拿空闲页,如果能拿到就直接返回:如果拿不到,则进入慢速路径: __alloc_pages_slowpath,慢速路径,顾名思义,就是拿得慢一点,需要做一些操作以后再拿。首先, __alloc_pages_slowpath会唤醒kswapd:kswapd是一个守护进程,专门进行内存回收操作,执行路径:它被唤醒后,会立1刻开始进行回收,效率高的话,freelist上会立刻多出很多空闲页。所以 __alloc_pages_slowpath会马上再次尝试从freelist获取页面,获取成功则直接返回了。若还是失败, __alloc_pages_slowpath则会进入direct_reclaim阶段:direct_reclaim,顾名思义,就是直接内存回收,回收到的页不用放回freelist再get_page_from_freelist这么麻烦了,也不用唤醒某个进程帮忙回收,而是由当前进程(current)亲自下场去回收,执行路径:如果direct_reclaim也回收不上来, __alloc_pages_slowpath还会垂死挣扎下,做一下内存规整,尝试把零散的页辗转腾挪,拼成为大order页(仅在申请order>0的页时有用)。如果还是无法满足要求,则进入oom-kill了:总结上面的逻辑:内存申请时,首先尝试直接从freelist里拿;失败了则先唤醒kswapd帮忙回收内存;若内存低到让kswapd也爱莫能助,则进入direct reclaim直接回收内存;若direct reclaim也无能为力,则oom:三条水线实际上,从freelist上拿页不是简单地直接拿,而是先检查下该zone是否满足水线要求,不满足那就直接失败。内核给内存管理划了三条水线:MIN、LOW、HIGH。三者大小关系从字面即可推断,MIN
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-4 06:01 , Processed in 0.565011 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表