前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊Linux内核的内存回收上篇

聊聊Linux内核的内存回收上篇

作者头像
用户4700054
发布2022-08-17 13:13:31
1.7K0
发布2022-08-17 13:13:31
举报

概述

  • 内存回收是把已经使用过的的物理页帧重新放回到内核中的buddy系统(buddy系统用于申请空闲物理页帧的子系统)管理中,解决内存紧张的问题;内存回收的页帧包括未修改的文件页帧修改且完成同步的文件页帧换出到设备的匿名页帧回收过程就是接触这些页帧的使用,归还给buddy子系统。
  • 内核对所有用户态进程消耗的RAW内存总量不做严格的约束,当系统负载相对较低的时候,内存大部分被磁盘高速缓存使用,随着系统负载增大,系统进程使用的内存越来越多,磁盘的高速缓存占用的内存就会被缩小,内存页帧的回收必须在消耗所有空闲页帧之前进行,这个是为了安全。如果内核尝试回收后仍然无法获得物理页帧,内核会执行find_bad_process找到一个进程并且执行OOM Kill释放这个进程占用的物理页帧。
  • 内核中同时存在slab allocation,它用于内核数据结构的申请。slab分配器在频繁申请和释放的情况下效率比较高

基于LRU页帧链表

  • 内存页帧是有映射的,映射到一个或者多个进程的虚拟空间。内核一般用内存页帧的引用次数来表示页帧的活跃程度。一个内存区zone将空闲页帧和已经在使用的页帧分别用buddy系统和 zoneLRU链表管理。
代码语言:javascript
复制
struct zone {
	// 用于空闲页帧管理的buddy系统
	struct free_area	free_area[MAX_ORDER];
	
	// 已经在使用的LRU链表管理
	struct pglist_data	*zone_pgdat;
	
	atomic_long_t		vm_stat[NR_VM_ZONE_STAT_ITEMS];
}

// 用于管理已经在使用的内存页帧
typedef struct pglist_data {
	spinlock_t		lru_lock;
	// LRU 链表
	struct lruvec		lruvec;

	atomic_long_t		vm_stat[NR_VM_NODE_STAT_ITEMS];
} pg_data_t;
  • 内核中LRU链表类型种类定义在enum lru_list(最大是NR_LRU_LISTS).内核将文件页帧匿名页帧各自分别形成2个LRU链表。activeinactive的文件页帧和匿名页帧LRU链表,最后内核除了这4个LRU还会有第5个不可换出页的LRUpglist_dataNR_LRU_LISTS个,每个pglist_data包含一个LRU链表。
代码语言:javascript
复制
// LRU链表
struct lruvec {
	struct list_head		lists[NR_LRU_LISTS];
	struct zone_reclaim_stat	reclaim_stat;
	/* Evictions & activations on the inactive file list */
	atomic_long_t			inactive_age;
	/* Refaults at the time of last reclaim cycle */
	unsigned long			refaults;
#ifdef CONFIG_MEMCG
	struct pglist_data *pgdat;
#endif
};


enum lru_list {
	// 不活跃的匿名页帧
	LRU_INACTIVE_ANON = LRU_BASE,
	// 活跃的匿名页帧
	LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
	// 不活跃的文件页帧
	LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
	// 活跃的文件页帧
	LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
	// 不可换出的页帧
	LRU_UNEVICTABLE,
	NR_LRU_LISTS
};

页帧回收

  • 页帧回收会按照几个原则来进行内存页帧的回收,第一是回收高速磁盘缓存的页帧;第二回收睡眠时间较长的进程中的页帧;第三是回收共享页帧的引用全部清除;第四回收LRU链表中未使用的
  • 页帧回收的过程页分为直接回收定期回收直接回收是发生在分配页帧时候发现空闲页帧不足的情况下。直接回收定期回收底层都是走相同的逻辑,但是直接回收是实在紧急情况下进行,必须做到回收到足够的页帧。定期回收则是内核的守护进程定期发起,尽量回收,保留足够的空闲空间。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 基于LRU页帧链表
  • 页帧回收
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门开源软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档